Move base64 implementation to own file.
[paraslash.git] / ogg_afh.c
index 9dfb028d0a2f9e14dac54cbc5a4ca200cd2dcf6b..29f08965077be97b6015208bb16cd8e8ef2d270c 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -171,7 +171,41 @@ fail:
        PARA_ERROR_LOG("%s\n", para_strerror(-ret));
 }
 
-static const char* ogg_suffixes[] = {"ogg", NULL};
+static int vorbis_make_meta_packet(struct taginfo *tags, ogg_packet *result)
+{
+       vorbis_comment vc;
+       int ret;
+
+       vorbis_comment_init(&vc);
+       vorbis_comment_add_tag(&vc, "artist", tags->artist);
+       vorbis_comment_add_tag(&vc, "title", tags->title);
+       vorbis_comment_add_tag(&vc, "album", tags->album);
+       vorbis_comment_add_tag(&vc, "year", tags->year);
+       vorbis_comment_add_tag(&vc, "comment", tags->comment);
+       ret = vorbis_commentheader_out(&vc, result);
+       vorbis_comment_clear(&vc);
+       if (ret != 0)
+               return -E_VORBIS_COMMENTHEADER;
+       return 1;
+}
+
+static int vorbis_rewrite_tags(const char *map, size_t mapsize,
+               struct taginfo *tags, int output_fd,
+               __a_unused const char *filename)
+{
+       int ret;
+       ogg_packet packet;
+
+       ret = vorbis_make_meta_packet(tags, &packet);
+       if (ret < 0)
+               return ret;
+       ret = ogg_rewrite_tags(map, mapsize, output_fd, (char *)packet.packet,
+               packet.bytes);
+       free(packet.packet);
+       return ret;
+}
+
+static const char * const ogg_suffixes[] = {"ogg", NULL};
 
 /**
  * The init function of the ogg vorbis audio format handler.
@@ -183,4 +217,5 @@ void ogg_init(struct audio_format_handler *afh)
        afh->get_file_info = ogg_vorbis_get_file_info;
        afh->get_header = vorbis_get_header;
        afh->suffixes = ogg_suffixes;
+       afh->rewrite_tags = vorbis_rewrite_tags;
 }