diff options
Diffstat (limited to 'plugins/mpgmad/mpgmad.c')
-rw-r--r-- | plugins/mpgmad/mpgmad.c | 332 |
1 files changed, 19 insertions, 313 deletions
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c index 98b20e85..9a6e4def 100644 --- a/plugins/mpgmad/mpgmad.c +++ b/plugins/mpgmad/mpgmad.c @@ -1189,335 +1189,41 @@ cmp3_read_metadata (DB_playItem_t *it) { int cmp3_write_metadata (DB_playItem_t *it) { - int err = -1; - char *buffer = NULL; - DB_FILE *fp = NULL; - FILE *out = NULL; - // get options + int strip_id3v2 = deadbeef->conf_get_int ("mp3.strip_id3v2", 0); int strip_id3v1 = deadbeef->conf_get_int ("mp3.strip_id3v2", 0); int strip_apev2 = deadbeef->conf_get_int ("mp3.strip_apev2", 0); int write_id3v2 = deadbeef->conf_get_int ("mp3.write_id3v2", 1); int write_id3v1 = deadbeef->conf_get_int ("mp3.write_id3v1", 0); int write_apev2 = deadbeef->conf_get_int ("mp3.write_apev2", 1); - int id3v2_version = deadbeef->conf_get_int ("mp3.id3v2_version", 3); - if (id3v2_version != 3 && id3v2_version != 4) { - id3v2_version = 3; - } - const char *id3v1_encoding = deadbeef->conf_get_str ("mp3.id3v1_encoding", "iso8859-1"); - - // find the beginning and the end of audio data - fp = deadbeef->fopen (it->fname); - if (!fp) { - return -1; - } - - int fsize = deadbeef->fgetlength (fp); - int id3v2_size = 0; - int id3v2_start = deadbeef->junk_id3v2_find (fp, &id3v2_size); - if (id3v2_start == -1) { - id3v2_size = -1; - } - int32_t apev2_size; - uint32_t flags, numitems; - int apev2_start = deadbeef->junk_apev2_find (fp, &apev2_size, &flags, &numitems); - if (apev2_start == -1) { - apev2_start = 0; + uint32_t junk_flags = 0; + if (strip_id3v2) { + junk_flags |= JUNK_STRIP_ID3V2; } - - if (!strip_apev2 && !write_apev2) { - apev2_start = 0; + if (strip_id3v1) { + junk_flags |= JUNK_STRIP_ID3V1; } - - int id3v1_start = deadbeef->junk_id3v1_find (fp); - if (id3v1_start == -1) { - id3v1_start = 0; + if (strip_apev2) { + junk_flags |= JUNK_STRIP_APEV2; } - - int header = id3v2_start + id3v2_size; - int footer = fsize; - - if (id3v1_start > 0) { - footer = id3v1_start; + if (write_id3v2) { + junk_flags |= JUNK_WRITE_ID3V2; } - if (apev2_start > 0) { - footer = min (footer, apev2_start); + if (write_id3v1) { + junk_flags |= JUNK_WRITE_ID3V1; } - - // mapping between ddb metadata names and id3v2/apev2 names - const char *md[] = { - "artist", "TPE1", "Artist", - "band", "TPE2", NULL, - "disc", "TPOS", "Media", - "title", "TIT2", "Title", - "album", "TALB", "Album", - "copyright", "TCOP", "Copyright", - "genre", "TCON", "Genre", - "vendor", "TENC", NULL, - "performer", "TPE3", NULL, - "composer", "TCOM", "Composer", - "year", NULL, "Year", - "comment", NULL, "Comment", - "copyright", NULL, "Copyright", - "cuesheet", NULL, "Cuesheet", - NULL - }; - // "TRCK" -- special case - // "TYER"/"TDRC" -- special case - - // open output file - out = NULL; - char tmppath[PATH_MAX]; - snprintf (tmppath, sizeof (tmppath), "%s.temp.mp3", it->fname); - - out = fopen (tmppath, "w+b"); - trace ("will write tags into %s\n", tmppath); - if (!out) { - fprintf (stderr, "cmp3_write_metadata: failed to open temp file %s\n", tmppath); - goto error; + if (write_apev2) { + junk_flags |= JUNK_WRITE_APEV2; } - DB_id3v2_tag_t id3v2; - DB_apev2_tag_t apev2; - - memset (&id3v2, 0, sizeof (id3v2)); - memset (&apev2, 0, sizeof (apev2)); - - if (!strip_id3v2 && !write_id3v2 && id3v2_size > 0) { - if (deadbeef->fseek (fp, id3v2_start, SEEK_SET) == -1) { - trace ("cmp3_write_metadata: failed to seek to original id3v2 tag position in %s\n", it->fname); - goto error; - } - uint8_t *buf = malloc (id3v2_size); - if (!buf) { - trace ("cmp3_write_metadata: failed to alloc %d bytes for id3v2 tag\n", id3v2_size); - goto error; - } - if (deadbeef->fread (buf, 1, id3v2_size, fp) != id3v2_size) { - trace ("cmp3_write_metadata: failed to read original id3v2 tag from %s\n", it->fname); - free (buf); - goto error; - } - if (fwrite (buf, 1, id3v2_size, out) != id3v2_size) { - trace ("cmp3_write_metadata: failed to copy original id3v2 tag from %s to temp file\n", it->fname); - free (buf); - goto error; - } - free (buf); - } - else if (write_id3v2) { - if (id3v2_size <= 0 || strip_id3v2 || deadbeef->junk_id3v2_read_full (NULL, &id3v2, fp) != 0) { - deadbeef->junk_id3v2_free (&id3v2); - memset (&id3v2, 0, sizeof (id3v2)); - id3v2.version[0] = id3v2_version; - } - // convert to required version - while (id3v2.version[0] != id3v2_version) { - DB_id3v2_tag_t converted; - memset (&converted, 0, sizeof (converted)); - if (id3v2.version[0] == 2) { - if (deadbeef->junk_id3v2_convert_22_to_24 (&id3v2, &converted) != 0) { - goto error; - } - deadbeef->junk_id3v2_free (&id3v2); - memcpy (&id3v2, &converted, sizeof (DB_id3v2_tag_t)); - continue; - } - else if (id3v2.version[0] == 3) { - if (deadbeef->junk_id3v2_convert_23_to_24 (&id3v2, &converted) != 0) { - goto error; - } - deadbeef->junk_id3v2_free (&id3v2); - memcpy (&id3v2, &converted, sizeof (DB_id3v2_tag_t)); - continue; - } - else if (id3v2.version[0] == 4) { - if (deadbeef->junk_id3v2_convert_24_to_23 (&id3v2, &converted) != 0) { - goto error; - } - deadbeef->junk_id3v2_free (&id3v2); - memcpy (&id3v2, &converted, sizeof (DB_id3v2_tag_t)); - continue; - } - } - - DB_id3v2_frame_t *(*add_frame) (DB_id3v2_tag_t *tag, const char *frame_id, const char *value); - if (id3v2_version == 3) { - add_frame = deadbeef->junk_id3v2_add_text_frame_23; - } - else { - add_frame = deadbeef->junk_id3v2_add_text_frame_24; - } - - // add all basic frames - for (int i = 0; md[i]; i += 3) { - if (md[i+1]) { - const char *val = deadbeef->pl_find_meta (it, md[i]); - if (val) { - deadbeef->junk_id3v2_remove_frames (&id3v2, md[i+1]); - add_frame (&id3v2, md[i+1], val); - } - } - } - - // add tracknumber/totaltracks - const char *track = deadbeef->pl_find_meta (it, "track"); - const char *totaltracks = deadbeef->pl_find_meta (it, "numtracks"); - if (track && totaltracks) { - char s[100]; - snprintf (s, sizeof (s), "%s/%s", track, totaltracks); - deadbeef->junk_id3v2_remove_frames (&id3v2, "TRCK"); - add_frame (&id3v2, "TRCK", s); - } - else if (track) { - deadbeef->junk_id3v2_remove_frames (&id3v2, "TRCK"); - add_frame (&id3v2, "TRCK", track); - } - - // add year/date - const char *year = deadbeef->pl_find_meta (it, "year"); - if (year) { - // FIXME: format check - if (id3v2.version[0] == 3) { - deadbeef->junk_id3v2_remove_frames (&id3v2, "TYER"); - add_frame (&id3v2, "TYER", year); - } - else { - deadbeef->junk_id3v2_remove_frames (&id3v2, "TDRC"); - add_frame (&id3v2, "TDRC", year); - } - } - - // write tag - if (deadbeef->junk_id3v2_write (out, &id3v2) != 0) { - trace ("cmp3_write_metadata: failed to write id3v2 tag to %s\n", it->fname) - goto error; - } - } - - // now write audio data - buffer = malloc (8192); - deadbeef->fseek (fp, header, SEEK_SET); - int writesize = fsize; - if (footer > 0) { - writesize -= (fsize - footer); - } - writesize -= header; - trace ("writesize: %d, id3v1_start: %d, apev2_start: %d, footer: %d\n", writesize, id3v1_start, apev2_start, footer); - - while (writesize > 0) { - int rb = min (8192, writesize); - rb = deadbeef->fread (buffer, 1, rb, fp); - if (rb < 0) { - fprintf (stderr, "junk_write_id3v2: error reading input data\n"); - goto error; - } - if (fwrite (buffer, 1, rb, out) != rb) { - fprintf (stderr, "junk_write_id3v2: error writing output file\n"); - goto error; - } - if (rb == 0) { - break; // eof - } - writesize -= rb; - } - - if (!write_apev2 && !strip_apev2 && apev2_start != 0) { - if (deadbeef->fseek (fp, apev2_start, SEEK_SET) == -1) { - trace ("cmp3_write_metadata: failed to seek to original apev2 tag position in %s\n", it->fname); - goto error; - } - uint8_t *buf = malloc (apev2_size); - if (!buf) { - trace ("cmp3_write_metadata: failed to alloc %d bytes for apev2 tag\n", apev2_size); - goto error; - } - if (deadbeef->fread (buf, 1, apev2_size, fp) != apev2_size) { - trace ("cmp3_write_metadata: failed to read original apev2 tag from %s\n", it->fname); - free (buf); - goto error; - } - if (fwrite (buf, 1, apev2_size, out) != apev2_size) { - trace ("cmp3_write_metadata: failed to copy original apev2 tag from %s to temp file\n", it->fname); - free (buf); - goto error; - } - free (buf); - } - else if (write_apev2) { - if (!strip_apev2 || deadbeef->junk_apev2_read_full (NULL, &apev2, fp) != 0) { - deadbeef->junk_apev2_free (&apev2); - memset (&apev2, 0, sizeof (apev2)); - } - // add all basic frames - for (int i = 0; md[i]; i += 3) { - if (md[i+2]) { - const char *val = deadbeef->pl_find_meta (it, md[i]); - if (val) { - deadbeef->junk_apev2_remove_frames (&apev2, md[i+2]); - deadbeef->junk_apev2_add_text_frame (&apev2, md[i+2], val); - } - } - } - - // add tracknumber/totaltracks - const char *track = deadbeef->pl_find_meta (it, "track"); - const char *totaltracks = deadbeef->pl_find_meta (it, "numtracks"); - if (track && totaltracks) { - char s[100]; - snprintf (s, sizeof (s), "%s/%s", track, totaltracks); - deadbeef->junk_apev2_remove_frames (&apev2, "Track"); - deadbeef->junk_apev2_add_text_frame (&apev2, "Track", s); - } - else if (track) { - deadbeef->junk_apev2_remove_frames (&apev2, "Track"); - deadbeef->junk_apev2_add_text_frame (&apev2, "Track", track); - } - - // write tag - if (deadbeef->junk_apev2_write (out, &apev2, 0, 1) != 0) { - trace ("cmp3_write_metadata: failed to write apev2 tag to %s\n", it->fname) - goto error; - } - } - - if (!write_id3v1 && !strip_id3v1 && id3v1_start != 0) { - if (deadbeef->fseek (fp, id3v1_start, SEEK_SET) == -1) { - trace ("cmp3_write_metadata: failed to seek to original id3v1 tag position in %s\n", it->fname); - goto error; - } - char buf[128]; - if (deadbeef->fread (buf, 1, 128, fp) != 128) { - trace ("cmp3_write_metadata: failed to read original id3v1 tag from %s\n", it->fname); - goto error; - } - if (fwrite (buf, 1, 128, out) != 128) { - trace ("cmp3_write_metadata: failed to copy id3v1 tag from %s to temp file\n", it->fname); - goto error; - } - } - else if (write_id3v1) { - if (deadbeef->junk_id3v1_write (out, it) != 0) { - trace ("cmp3_write_metadata: failed to write id3v1 tag to %s\n", it->fname) - goto error; - } - } - - err = 0; -error: - if (fp) { - deadbeef->fclose (fp); - } - if (out) { - fclose (out); - } - if (buffer) { - free (buffer); + int id3v2_version = deadbeef->conf_get_int ("mp3.id3v2_version", 3); + if (id3v2_version != 3 && id3v2_version != 4) { + id3v2_version = 3; } -// unlink (tmppath); - return err; + const char *id3v1_encoding = deadbeef->conf_get_str ("mp3.id3v1_encoding", "iso8859-1"); + return deadbeef->junk_rewrite_tags (it, junk_flags, id3v2_version, id3v1_encoding); } static const char *exts[] = { |