static int dump_input_stream(struct input_stream *is) { GError *error = NULL; char buffer[4096]; size_t num_read; ssize_t num_written; /* wait until the stream becomes ready */ while (!is->ready) { int ret = input_stream_buffer(is, &error); if (ret < 0) { /* error */ g_warning("%s", error->message); g_error_free(error); return 2; } if (ret == 0) /* nothing was buffered - wait */ g_usleep(10000); } /* print meta data */ if (is->mime != NULL) g_printerr("MIME type: %s\n", is->mime); /* read data and tags from the stream */ while (!input_stream_eof(is)) { struct tag *tag = input_stream_tag(is); if (tag != NULL) { g_printerr("Received a tag:\n"); tag_save(stderr, tag); tag_free(tag); } num_read = input_stream_read(is, buffer, sizeof(buffer), &error); if (num_read == 0) { if (error != NULL) { g_warning("%s", error->message); g_error_free(error); } break; } num_written = write(1, buffer, num_read); if (num_written <= 0) break; } return 0; }
void song_save(FILE *fp, const struct song *song) { fprintf(fp, SONG_BEGIN "%s\n", song->uri); if (song->end_ms > 0) fprintf(fp, "Range: %u-%u\n", song->start_ms, song->end_ms); else if (song->start_ms > 0) fprintf(fp, "Range: %u-\n", song->start_ms); if (song->tag != NULL) tag_save(fp, song->tag); fprintf(fp, SONG_MTIME ": %li\n", (long)song->mtime); fprintf(fp, SONG_END "\n"); }
static int dump_input_stream(struct input_stream *is) { GError *error = NULL; char buffer[4096]; size_t num_read; ssize_t num_written; input_stream_lock(is); /* wait until the stream becomes ready */ input_stream_wait_ready(is); if (!input_stream_check(is, &error)) { g_warning("%s", error->message); g_error_free(error); input_stream_unlock(is); return EXIT_FAILURE; } /* print meta data */ if (is->mime != NULL) g_printerr("MIME type: %s\n", is->mime); /* read data and tags from the stream */ while (!input_stream_eof(is)) { struct tag *tag = input_stream_tag(is); if (tag != NULL) { g_printerr("Received a tag:\n"); tag_save(stderr, tag); tag_free(tag); } num_read = input_stream_read(is, buffer, sizeof(buffer), &error); if (num_read == 0) { if (error != NULL) { g_warning("%s", error->message); g_error_free(error); } break; } num_written = write(1, buffer, num_read); if (num_written <= 0) break; } if (!input_stream_check(is, &error)) { g_warning("%s", error->message); g_error_free(error); input_stream_unlock(is); return EXIT_FAILURE; } input_stream_unlock(is); return 0; }
int main(int argc, char **argv) { const char *uri; struct input_stream *is = NULL; bool success; GError *error = NULL; struct playlist_provider *playlist; struct song *song; if (argc != 3) { g_printerr("Usage: dump_playlist CONFIG URI\n"); return 1; } uri = argv[2]; /* initialize GLib */ g_thread_init(NULL); g_log_set_default_handler(my_log_func, NULL); /* initialize MPD */ config_global_init(); success = config_read_file(argv[1], &error); if (!success) { g_printerr("%s\n", error->message); g_error_free(error); return 1; } io_thread_init(); if (!io_thread_start(&error)) { g_warning("%s", error->message); g_error_free(error); return EXIT_FAILURE; } if (!input_stream_global_init(&error)) { g_warning("%s", error->message); g_error_free(error); return 2; } playlist_list_global_init(); decoder_plugin_init_all(); /* open the playlist */ GMutex *mutex = g_mutex_new(); GCond *cond = g_cond_new(); playlist = playlist_list_open_uri(uri, mutex, cond); if (playlist == NULL) { /* open the stream and wait until it becomes ready */ is = input_stream_open(uri, mutex, cond, &error); if (is == NULL) { if (error != NULL) { g_warning("%s", error->message); g_error_free(error); } else g_printerr("input_stream_open() failed\n"); return 2; } input_stream_lock_wait_ready(is); /* open the playlist */ playlist = playlist_list_open_stream(is, uri); if (playlist == NULL) { input_stream_close(is); g_printerr("Failed to open playlist\n"); return 2; } } /* dump the playlist */ while ((song = playlist_plugin_read(playlist)) != NULL) { g_print("%s\n", song->uri); if (song->end_ms > 0) g_print("range: %u:%02u..%u:%02u\n", song->start_ms / 60000, (song->start_ms / 1000) % 60, song->end_ms / 60000, (song->end_ms / 1000) % 60); else if (song->start_ms > 0) g_print("range: %u:%02u..\n", song->start_ms / 60000, (song->start_ms / 1000) % 60); if (song->tag != NULL) tag_save(stdout, song->tag); song_free(song); } /* deinitialize everything */ playlist_plugin_close(playlist); if (is != NULL) input_stream_close(is); g_cond_free(cond); g_mutex_free(mutex); decoder_plugin_deinit_all(); playlist_list_global_finish(); input_stream_global_finish(); io_thread_deinit(); config_global_finish(); return 0; }