static struct tag * oggflac_tag_dup(const char *file) { struct tag *ret = NULL; FLAC__Metadata_Iterator *it; FLAC__StreamMetadata *block; FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); if (!(FLAC__metadata_chain_read_ogg(chain, file))) goto out; it = FLAC__metadata_iterator_new(); FLAC__metadata_iterator_init(it, chain); ret = tag_new(); do { if (!(block = FLAC__metadata_iterator_get_block(it))) break; flac_tag_apply_metadata(ret, NULL, block); } while (FLAC__metadata_iterator_next(it)); FLAC__metadata_iterator_delete(it); if (!tag_is_defined(ret)) { tag_free(ret); ret = NULL; } out: FLAC__metadata_chain_delete(chain); return ret; }
static bool oggflac_scan_file(const char *file, const struct tag_handler *handler, void *handler_ctx) { FLAC__Metadata_Iterator *it; FLAC__StreamMetadata *block; FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); if (!(FLAC__metadata_chain_read_ogg(chain, file))) { FLAC__metadata_chain_delete(chain); return false; } it = FLAC__metadata_iterator_new(); FLAC__metadata_iterator_init(it, chain); do { if (!(block = FLAC__metadata_iterator_get_block(it))) break; flac_scan_metadata(NULL, block, handler, handler_ctx); } while (FLAC__metadata_iterator_next(it)); FLAC__metadata_iterator_delete(it); FLAC__metadata_chain_delete(chain); return true; }
FLAC__bool do_major_operation_on_file(const char *filename, const CommandLineOptions *options) { FLAC__bool ok = true, needs_write = false, is_ogg = false; FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); if(0 == chain) die("out of memory allocating chain"); /*@@@@ lame way of guessing the file type */ if(strlen(filename) >= 4 && 0 == strcmp(filename+strlen(filename)-4, ".ogg")) is_ogg = true; if(! (is_ogg? FLAC__metadata_chain_read_ogg(chain, filename) : FLAC__metadata_chain_read(chain, filename)) ) { print_error_with_chain_status(chain, "%s: ERROR: reading metadata", filename); FLAC__metadata_chain_delete(chain); return false; } switch(options->ops.operations[0].type) { case OP__LIST: ok = do_major_operation__list(options->prefix_with_filename? filename : 0, chain, options); break; case OP__APPEND: ok = do_major_operation__append(chain, options); needs_write = true; break; case OP__REMOVE: ok = do_major_operation__remove(chain, options); needs_write = true; break; case OP__REMOVE_ALL: ok = do_major_operation__remove_all(chain, options); needs_write = true; break; case OP__MERGE_PADDING: FLAC__metadata_chain_merge_padding(chain); needs_write = true; break; case OP__SORT_PADDING: FLAC__metadata_chain_sort_padding(chain); needs_write = true; break; default: FLAC__ASSERT(0); return false; } if(ok && needs_write) { if(options->use_padding) FLAC__metadata_chain_sort_padding(chain); ok = FLAC__metadata_chain_write(chain, options->use_padding, options->preserve_modtime); if(!ok) print_error_with_chain_status(chain, "%s: ERROR: writing FLAC file", filename); } FLAC__metadata_chain_delete(chain); return ok; }