From c937af44c912773aa3e8fd9ed88045e483cb9956 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 14 Jul 2015 18:25:00 +0200 Subject: init --- extract-artwork.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 extract-artwork.c (limited to 'extract-artwork.c') diff --git a/extract-artwork.c b/extract-artwork.c new file mode 100644 index 0000000..7d927a5 --- /dev/null +++ b/extract-artwork.c @@ -0,0 +1,80 @@ +/* + * (C) 2015 by Christian Hesse + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + * + * This is an example code skeleton provided by vim-skeleton. + */ + +#include +#include + +#include + +int main(int argc, char **argv) { + unsigned int i, j; + FILE * album_art; + char * album_art_file = NULL; + AVPacket pkt; + AVFormatContext * pFormatCtx; + + if (argc < 2) { + printf("usage: %s file1.mp3 [file2.mp3 ...]\n", argv[0]); + return EXIT_FAILURE; + } + + /* libav */ + av_register_all(); + + /* only fatal messages from libav */ + av_log_set_level(AV_LOG_FATAL); + + pFormatCtx = avformat_alloc_context(); + + for (i = 1; i < argc; i++) { + if (avformat_open_input(&pFormatCtx, argv[i], NULL, NULL) != 0) { + fprintf(stderr, "%s: failed to open file for reading", argv[i]); + goto next; + } + + /* only mp3 file contain artwork, so ignore others */ + if (strcmp(pFormatCtx->iformat->name, "mp3") != 0) { + fprintf(stderr, "%s: not a mp3 file\n", argv[i]); + goto next; + } + + if (pFormatCtx->iformat->read_header(pFormatCtx) < 0) { + fprintf(stderr, "%s: could not read the format header\n", argv[i]); + goto next; + } + + /* find the first attached picture, if available */ + for (j = 0; j < pFormatCtx->nb_streams; j++) { + if (pFormatCtx->streams[j]->disposition & AV_DISPOSITION_ATTACHED_PIC) { + pkt = pFormatCtx->streams[j]->attached_pic; + + album_art_file = malloc(strlen(argv[i]) + 9); + sprintf(album_art_file, "%s.%03u.jpg", argv[i], j); + + printf("%s: found artwork, writing to file %s\n", argv[i], album_art_file); + + if ((album_art = fopen(album_art_file, "wb")) == NULL) + fprintf(stderr, "%s: failed to open file for writing\n", album_art_file); + + if (fwrite(pkt.data, pkt.size, 1, album_art) != 1) + fprintf(stderr, "%s: failed to write to file\n", album_art_file); + + fclose(album_art); + free(album_art_file); + } + } +next: + avformat_close_input(&pFormatCtx); + } + avformat_free_context(pFormatCtx); + + return EXIT_SUCCESS; +} + +// vim: set syntax=c: -- cgit v1.2.3-54-g00ecf