}
static int get_local_time(uint64_t *seconds, char *buf, size_t size,
- time_t current_time)
+ time_t current_time, enum ls_listing_mode lm)
{
struct tm t;
if (!localtime_r((time_t *)seconds, &t))
return -E_LOCALTIME;
+ if (lm == LS_MODE_MBOX) {
+ if (!strftime(buf, size, "%c", &t))
+ return -E_STRFTIME;
+ return 1;
+ }
if (*seconds + 6 * 30 * 24 * 3600 > current_time) {
if (!strftime(buf, size, "%b %e %k:%M", &t))
return -E_STRFTIME;
struct audio_format_info *afhi = &d->afhi;
struct ls_widths *w = &opts->widths;
int have_score = opts->flags & LS_FLAG_ADMISSIBLE_ONLY;
+ char asc_hash[2 * HASH_SIZE + 1];
+ char *att_line, *lyrics_line, *image_line;
if (opts->mode == LS_MODE_SHORT) {
para_printf(b, "%s\n", d->path);
}
get_attribute_bitmap(&afsi->attributes, att_buf);
ret = get_local_time(&afsi->last_played, last_played_time,
- sizeof(last_played_time), current_time);
+ sizeof(last_played_time), current_time, opts->mode);
if (ret < 0)
return ret;
get_duration_buf(afhi->seconds_total, duration_buf, w->duration_width);
);
return 1;
}
+ hash_to_asc(d->hash, asc_hash);
+ att_line = make_attribute_line(att_buf, afsi);
+ lyrics_line = make_lyrics_line(afsi);
+ image_line = make_image_line(afsi);
if (opts->mode == LS_MODE_VERBOSE) {
- char asc_hash[2 * HASH_SIZE + 1];
- char *att_line, *lyrics_line, *image_line;
- hash_to_asc(d->hash, asc_hash);
- att_line = make_attribute_line(att_buf, afsi);
- lyrics_line = make_lyrics_line(afsi);
- image_line = make_image_line(afsi);
para_printf(b,
"%s: %s\n" /* path */
"%s%s%s" /* score */
last_played_time,
afhi->info_string
);
- free(att_line);
- free(lyrics_line);
- free(image_line);
- return 1;
+ } else { /* mbox mode */
+ struct osl_object lyrics_def;
+ lyr_get_def_by_id(afsi->lyrics_id, &lyrics_def);
+ para_printf(b,
+ "From foo@localhost %s\n"
+ "Received: from\nTo: bar\nFrom: a\n"
+ "Subject: %s\n\n" /* path */
+ "%s%s%s" /* score */
+ "attributes: %s\n"
+ "hash: %s\n"
+ "image_id: %s\n"
+ "lyrics_id: %s\n"
+ "bitrate: %dkbit/s\n"
+ "format: %s\n"
+ "frequency: %dHz\n"
+ "channels: %d\n"
+ "duration: %s\n"
+ "num_played: %d\n"
+ "tag info: %s\n"
+ "%s%s\n",
+ last_played_time,
+ d->path,
+ have_score? "score: " : "", score_buf,
+ have_score? "\n" : "",
+ att_line,
+ asc_hash,
+ image_line,
+ lyrics_line,
+ afhi->bitrate,
+ audio_format_name(afsi->audio_format_id),
+ afhi->frequency,
+ afhi->channels,
+ duration_buf,
+ afsi->num_played,
+ afhi->info_string,
+ lyrics_def.data? "Lyrics:\n~~~~~~~\n" : "",
+ lyrics_def.data? (char *)lyrics_def.data : ""
+ );
+ if (lyrics_def.data)
+ osl_close_disk_object(lyrics_def.data);
}
+ free(att_line);
+ free(lyrics_line);
+ free(image_line);
return 1;
}
#define ADD_FLAG_LAZY 1
#define ADD_FLAG_FORCE 2
#define ADD_FLAG_VERBOSE 4
+#define ADD_FLAG_ALL 8
/* TODO: change log messages so that they get written to the result buffer */
ret = verify_path(arg, &path);
if (ret < 0)
goto out_free;
+ ret = guess_audio_format(path);
+ if (ret < 0 && !(pad->flags & ADD_FLAG_ALL)) {
+ if (pad->flags & ADD_FLAG_VERBOSE)
+ ret = send_va_buffer(pad->fd, "%s: %s\n",
+ PARA_STRERROR(-ret), path);
+ ret = 1;
+ goto out_free;
+ }
query.data = path;
query.size = strlen(path) + 1;
ret = send_callback_request(path_brother_callback, &query, &result);
format_num = ret;
afhi_ptr = &afhi;
}
- if (pad->flags & ADD_FLAG_VERBOSE)
- send_va_buffer(pad->fd, "adding %s\n", path);
+ if (pad->flags & ADD_FLAG_VERBOSE) {
+ ret = send_va_buffer(pad->fd, "adding %s\n", path);
+ if (ret < 0)
+ goto out_unmap;
+ }
munmap(map.data, map.size);
save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj);
/* Ask afs to consider this entry for adding. */
out_unmap:
munmap(map.data, map.size);
out_free:
- if (ret < 0)
+ if (ret < 0 && ret != -E_SEND)
send_va_buffer(pad->fd, "failed to add %s (%s)\n", path?
path : arg, PARA_STRERROR(-ret));
free(obj.data);
free(path);
if (afhi_ptr)
free(afhi_ptr->chunk_table);
- return 1; /* it's not an error if not all files could be added */
+ /* it's not an error if not all files could be added */
+ return ret == -E_SEND? ret : 1;
}
int com_add(int fd, int argc, char * const * const argv)
i++;
break;
}
+ if (!strcmp(arg, "-a")) {
+ pad.flags |= ADD_FLAG_ALL;
+ continue;
+ }
if (!strcmp(arg, "-l")) {
pad.flags |= ADD_FLAG_LAZY;
continue;
if (ret < 0)
PARA_NOTICE_LOG("failed to stat %s (%s)", path,
strerror(errno));
- else
+ else {
if (S_ISDIR(statbuf.st_mode))
- for_each_file_in_dir(path, add_one_audio_file,
+ ret = for_each_file_in_dir(path, add_one_audio_file,
&pad);
else
- add_one_audio_file(path, &pad);
+ ret = add_one_audio_file(path, &pad);
+ if (ret < 0) {
+ send_va_buffer(fd, "%s: %s\n", path, PARA_STRERROR(-ret));
+ free(path);
+ return ret;
+ }
+ }
free(path);
}
ret = 1;