static MediaInfo* media_from_file(gchar *path, GFileInfo *file_info, const gchar *file_mime) { MediaInfo* media; ID3Tag *tag = NULL; media = malloc(sizeof(MediaInfo)); memset(media, 0, sizeof(MediaInfo)); tag = ID3Tag_New(); ID3Tag_Link(tag, path); if (tag) { set_field(&(media->title), tag, ID3FN_TEXT, ID3FID_TITLE); set_field(&(media->artist), tag, ID3FN_TEXT, ID3FID_LEADARTIST); set_field(&(media->album), tag, ID3FN_TEXT, ID3FID_ALBUM); set_field(&(media->genre), tag, ID3FN_TEXT, ID3FID_CONTENTTYPE); } if (!media->title) media->title = g_strdup(g_file_info_get_display_name(file_info)); media->path = g_strdup(path); media->mime = g_strdup(file_mime); if (tag) ID3Tag_Delete(tag); return media; }
/* * As the ID3Tag_Link function of id3lib-3.8.0pre2 returns the ID3v1 tags * when a file has both ID3v1 and ID3v2 tags, we first try to explicitely * get the ID3v2 tags with ID3Tag_LinkWithFlags and, if we cannot get them, * fall back to the ID3v1 tags. * (Written by Holger Schemel). */ static size_t local__ID3Tag_Link_wrapper(ID3Tag *id3tag, const char *filename) { size_t offset; # if ( (ID3LIB_MAJOR >= 3) && (ID3LIB_MINOR >= 8) ) /* First, try to get the ID3v2 tags */ offset = ID3Tag_LinkWithFlags(id3tag, filename, ID3TT_ID3V2); if (offset == 0) { /* No ID3v2 tags available => try to get the ID3v1 tags */ offset = ID3Tag_LinkWithFlags(id3tag, filename, ID3TT_ID3V1); } # else /* Function 'ID3Tag_LinkWithFlags' is not defined up to id3lib-.3.7.13 */ offset = ID3Tag_Link(id3tag, filename); # endif return offset; }
static int _id3_set(const gchar *filename, int clear, const gchar *lead_artist, const gchar *content_group, const gchar *title, const gchar *album, const gchar *content_type, const gchar *year, const gchar *comment) { int errors = 0; ID3Tag *tag; tag = ID3Tag_New(); if (!tag) return 1; ID3Tag_Link(tag, filename); if (clear) ID3Tag_Clear(tag); // TODO if (lead_artist) { errors += _id3_find_and_set_frame(tag, ID3FID_LEADARTIST, lead_artist); if (verbose) printf(" * Set ID3 tag lead artist to %s.\n", lead_artist); } if (content_group) { errors += _id3_find_and_set_frame(tag, ID3FID_CONTENTGROUP, content_group); if (verbose) printf(" * Set ID3 tag content group to %s.\n", content_group); } if (title) { errors += _id3_find_and_set_frame(tag, ID3FID_TITLE, title); if (verbose) printf(" * Set ID3 tag title to %s.\n", title); } if (album) { errors += _id3_find_and_set_frame(tag, ID3FID_ALBUM, album); if (verbose) printf(" * Set ID3 tag album to %s.\n", album); } if (content_type) { errors += _id3_find_and_set_frame(tag, ID3FID_CONTENTTYPE, content_type); if (verbose) printf(" * Set ID3 tag content type to %s.\n", content_type); } if (year) { errors += _id3_find_and_set_frame(tag, ID3FID_YEAR, year); if (verbose) printf(" * Set ID3 title year to %s.\n", year); } if (comment) { errors += _id3_find_and_set_frame(tag, ID3FID_COMMENT, comment); if (verbose) printf(" * Set ID3 tag comment to %s.\n", comment); } if (!errors) ID3Tag_Update(tag); ID3Tag_Delete(tag); return errors; }
/* called after all jobs are finshed. Files are cleaned up and renamed */ void job_finisher(_main_data *main_data) { int i; static char status_message[(MAX_FILE_PATH_LENGTH + MAX_FILE_NAME_LENGTH) * MAX_NUM_TRACK ]; static char buffer[(MAX_FILE_PATH_LENGTH + MAX_FILE_NAME_LENGTH) * MAX_NUM_TRACK ]; static char *wav_file, *enc_file; int madewavs = FALSE; int mademp3s = FALSE; int tracksdone = 0; char *s_track_num; char *artist; ID3Tag *myTag; FILE *fp_playlist = NULL; char playlist_filespec[ MAX_FILE_PATH_LENGTH + MAX_FILE_NAME_LENGTH ]; /* Allocate space dynamically. This is overkill, but certainly won't be a problem. */ s_track_num = (char *) malloc((main_data->num_tracks + 2) * sizeof(char)); buffer[0] = 0; /* Clean up */ for(i = 0; i < main_data->num_tracks; i++) { create_file_names_for_track(main_data, i, &wav_file, &enc_file); if(main_data->track[ i ].wav_exist == FALSE) { unlink(wav_file); } else if(main_data->track[ i ].make_wav == TRUE) { madewavs = TRUE; sprintf(&buffer[strlen(buffer)], "%d: %s\n", ++tracksdone, file_name_without_path(wav_file)); } main_data->track[ i ].make_wav = FALSE; if(main_data->track[ i ].mp3_exist == TRUE && main_data->track[ i ].make_mp3 == TRUE) { mademp3s = TRUE; /* add ID3 tag if requested */ if(config.cddb_config.create_id3 == TRUE) { if(!(artist = main_data->track[ i ].artist)) { artist = main_data->disc_artist; } // TODO: fix this to use something like // if (main_data->encoding_type == OGG) { if(!strcmp(config.encoder.encoder, "oggenc")) { /* set VORBIS tags using vorbistag - added DATE tag - R. Turnbull 1-2-2010 */ vorbistag(enc_file, artist, main_data->disc_title, main_data->disc_year, main_data->track[i].title, id3_find_cddb_category(main_data->disc_category), i + 1); } else if(!strcmp(config.encoder.encoder, "flac")) { /* set FLAC tags using metaflac R. Turnbull 1-2-2010 */ flactag(enc_file, artist, main_data->disc_title, main_data->disc_year, main_data->track[i].title, id3_find_cddb_category(main_data->disc_category), i + 1); } else if(!strcmp(config.encoder.encoder, "mppenc")) { /* do nothing for for musepack right now - originally supported id3 now wants apev2 tags */ } else { /* assume MP3 tag is desired */ sprintf(s_track_num,"%d",(i+1)); myTag=ID3Tag_New(); ID3Tag_Link(myTag,enc_file); set_TagField(myTag, main_data->track[ i ].title, ID3FID_TITLE); set_TagField(myTag, artist, ID3FID_LEADARTIST); set_TagField(myTag, main_data->disc_title, ID3FID_ALBUM); set_TagField(myTag, main_data->disc_year, ID3FID_YEAR); set_TagField(myTag, s_track_num, ID3FID_TRACKNUM); set_TagField(myTag, main_data->disc_category, ID3FID_CONTENTTYPE); ID3Tag_UpdateByTagType(myTag, ID3TT_ID3V2); ID3Tag_Delete(myTag); } } //dc: strcat() is for sissies! sprintf(&buffer[strlen(buffer)], "%d: %s\n", ++tracksdone, file_name_without_path(enc_file)); // tm: basic playlist support - thanks to Mark Tyler if(config.cddb_config.create_playlist == TRUE) { if(fp_playlist == NULL) { sprintf(playlist_filespec, "%s/playlist.m3u", file_path_without_name(enc_file)); fp_playlist = fopen(playlist_filespec, "w"); } // if we succeeded above, we can now write to this if(fp_playlist != NULL) { fprintf(fp_playlist, "%s\n", file_name_without_path(enc_file)); } } } main_data->track[ i ].make_mp3 = FALSE; } /* end loop over all tracks */ free(s_track_num); if((config.cddb_config.create_playlist == TRUE) && (fp_playlist != NULL)) { fclose(fp_playlist); } /* Generate status message */ sprintf(status_message, _("Tracks Completed: %2d\n\nArtist: %s\nAlbum: %s\n\n%s"), tracksdone, main_data->disc_artist, main_data->disc_title, buffer); /* show status pop up */ if(madewavs) { status_handler(STAT_FINISH_WAV, status_message); } else if(mademp3s) { status_handler(STAT_FINISH_MP3, status_message); } /* Clear status bar */ main_window_handler(MW_CLEAR_STATUSBAR, NULL, NULL); /* Destroy status widget */ wm_status_frame_handler(WIDGET_DESTROY, WAV, NULL, NULL); /* Create select frame */ select_frame_handler(WIDGET_CREATE, 0, main_data); main_window_handler(MW_MODE_SELECT, NULL, NULL); }
/* Save the ID3 to the file */ void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename) { LV_ITEM lvi; ID3ITEM *pItem1; int i, items; ID3Tag *tag; ID3Frame *frame; ID3Field *field; /* Strip the tag first, before completely rewriting it */ if ((tag = ID3Tag_New()) != NULL) { ID3Tag_Link(tag, filename); ID3Tag_Strip(tag, ID3TT_ALL); ID3Tag_Clear(tag); if (SendMessage(GetDlgItem(hwndApp, IDC_ID3V2TAG), BM_GETCHECK, 0, 0) == BST_UNCHECKED) { /* No frames saved */ ID3Tag_Delete(tag); EnableWindow(GetDlgItem(hwndApp, IDC_ID3V2TAG), FALSE); ListView_DeleteAllItems(hwndList); return; } /* First get the number of items */ items = ListView_GetItemCount(hwndList); if (items > 0) { for (i = 0; i < items; i++) { lvi.mask = LVIF_PARAM; lvi.iItem = i; lvi.iSubItem = 0; if (ListView_GetItem(hwndList, &lvi) == TRUE) { pItem1 = (ID3ITEM*)lvi.lParam; frame = ID3Frame_NewID(pItem1->frameId); switch (pItem1->frameId) { case ID3FID_ALBUM: case ID3FID_BPM: case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE: case ID3FID_COPYRIGHT: case ID3FID_DATE: case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY: case ID3FID_LYRICIST: case ID3FID_FILETYPE: case ID3FID_TIME: case ID3FID_CONTENTGROUP: case ID3FID_TITLE: case ID3FID_SUBTITLE: case ID3FID_INITIALKEY: case ID3FID_LANGUAGE: case ID3FID_SONGLEN: case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER: case ID3FID_LEADARTIST: case ID3FID_BAND: case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST: case ID3FID_PARTINSET: case ID3FID_PUBLISHER: case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER: case ID3FID_SIZE: case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR: { field = ID3Frame_GetField(frame, ID3FN_TEXT); ID3Field_SetASCII(field, pItem1->aCols[1]); ID3Tag_AddFrame(tag, frame); break; } case ID3FID_USERTEXT: case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */ case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */ { field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION); ID3Field_SetASCII(field, pItem1->aCols[0]); field = ID3Frame_GetField(frame, ID3FN_TEXT); ID3Field_SetASCII(field, pItem1->aCols[1]); ID3Tag_AddFrame(tag, frame); break; } case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE: { field = ID3Frame_GetField(frame, ID3FN_URL); ID3Field_SetASCII(field, pItem1->aCols[1]); ID3Tag_AddFrame(tag, frame); break; } case ID3FID_WWWUSER: { field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION); ID3Field_SetASCII(field, pItem1->aCols[0]); field = ID3Frame_GetField(frame, ID3FN_URL); ID3Field_SetASCII(field, pItem1->aCols[1]); ID3Tag_AddFrame(tag, frame); break; } default: break; } } } ID3Tag_UpdateByTagType(tag, ID3TT_ID3V2); } ID3Tag_Delete(tag); } }
void FillID3List(HWND hwndDlg, HWND hwndList, char *filename) { ID3Tag *tag; ID3Frame *frame; ID3Field *field; ID3_FrameID eFrameID; char info[1024]; int numFrames; int i; int iItem = 0; if ((tag = ID3Tag_New()) != NULL) { ID3Tag_Link(tag, filename); numFrames = ID3Tag_NumFrames(tag); for (i = 0; i < numFrames; i++) { iItem++; frame = ID3Tag_GetFrameNum(tag, i); eFrameID = ID3Frame_GetID(frame); switch (eFrameID) { case ID3FID_ALBUM: case ID3FID_BPM: case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE: case ID3FID_COPYRIGHT: case ID3FID_DATE: case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY: case ID3FID_LYRICIST: case ID3FID_FILETYPE: case ID3FID_TIME: case ID3FID_CONTENTGROUP: case ID3FID_TITLE: case ID3FID_SUBTITLE: case ID3FID_INITIALKEY: case ID3FID_LANGUAGE: case ID3FID_SONGLEN: case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER: case ID3FID_LEADARTIST: case ID3FID_BAND: case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST: case ID3FID_PARTINSET: case ID3FID_PUBLISHER: case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER: case ID3FID_SIZE: case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR: { LV_ITEM lvi; ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM)); /* Initialize LV_ITEM members that are common to all items. */ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */ lvi.iImage = 0; lvi.iItem = iItem; lvi.iSubItem = 0; pItem->frameId = eFrameID; pItem->aCols[0] = GetFrameDesc(eFrameID); field = ID3Frame_GetField(frame, ID3FN_TEXT); ID3Field_GetASCII(field, info, 1024, 1); if (eFrameID == ID3FID_CONTENTTYPE) pItem->aCols[1] = GetGenre(info); else pItem->aCols[1] = DupString(info); lvi.lParam = (LPARAM)pItem; /* item data */ /* Add the item. */ ListView_InsertItem(hwndList, &lvi); break; } case ID3FID_USERTEXT: case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */ case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */ { LV_ITEM lvi; ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM)); /* Initialize LV_ITEM members that are common to all items. */ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */ lvi.iImage = 0; lvi.iItem = iItem; lvi.iSubItem = 0; pItem->frameId = eFrameID; field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION); ID3Field_GetASCII(field, info, 1024, 1); pItem->aCols[0] = DupString(info); field = ID3Frame_GetField(frame, ID3FN_TEXT); ID3Field_GetASCII(field, info, 1024, 1); pItem->aCols[1] = DupString(info); lvi.lParam = (LPARAM)pItem; /* item data */ /* Add the item. */ ListView_InsertItem(hwndList, &lvi); break; } case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE: { LV_ITEM lvi; ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM)); /* Initialize LV_ITEM members that are common to all items. */ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */ lvi.iImage = 0; lvi.iItem = iItem; lvi.iSubItem = 0; pItem->frameId = eFrameID; pItem->aCols[0] = GetFrameDesc(eFrameID); field = ID3Frame_GetField(frame, ID3FN_URL); ID3Field_GetASCII(field, info, 1024, 1); pItem->aCols[1] = DupString(info); lvi.lParam = (LPARAM)pItem; /* item data */ /* Add the item. */ ListView_InsertItem(hwndList, &lvi); break; } case ID3FID_WWWUSER: { LV_ITEM lvi; ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM)); /* Initialize LV_ITEM members that are common to all items. */ lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */ lvi.iImage = 0; lvi.iItem = iItem; lvi.iSubItem = 0; pItem->frameId = eFrameID; field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION); ID3Field_GetASCII(field, info, 1024, 1); pItem->aCols[0] = DupString(info); field = ID3Frame_GetField(frame, ID3FN_URL); ID3Field_GetASCII(field, info, 1024, 1); pItem->aCols[1] = DupString(info); lvi.lParam = (LPARAM)pItem; /* item data */ /* Add the item. */ ListView_InsertItem(hwndList, &lvi); break; } default: break; } } ID3Tag_Delete(tag); } }
/* Get the title from the file */ void GetID3FileTitle(char *filename, char *title, char *format) { ID3Tag *tag; ID3Frame *frame; ID3Field *field; char buffer[255]; int some_info = 0; char *in = format; char *out = title; char *bound = out + (MAX_PATH - 10 - 1); if ((tag = ID3Tag_New()) != NULL) { ID3Tag_Link(tag, filename); while (*in && out < bound) { switch (*in) { case '%': ++in; break; default: *out++ = *in++; continue; } /* handle % escape sequence */ switch (*in++) { case '0': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TRACKNUM)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '1': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '2': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '3': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '4': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_YEAR)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '5': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_COMMENT)) != NULL) { int size; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); lstrcpy(out, buffer); out += size; some_info = 1; } break; case '6': if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_CONTENTTYPE)) != NULL) { int size; char *tmp; field = ID3Frame_GetField(frame, ID3FN_TEXT); size = ID3Field_GetASCII(field, buffer, 255, 1); tmp = GetGenre(buffer); lstrcpy(out, tmp); out += size; some_info = 1; } break; case '7': { char *p=filename+lstrlen(filename); int len = 0; while (*p != '\\' && p >= filename) { p--; len++; } lstrcpy(out, ++p); out += len; some_info = 1; break; } } } ID3Tag_Delete(tag); } if (!some_info) { char *p=filename+lstrlen(filename); while (*p != '\\' && p >= filename) p--; lstrcpy(title,++p); } }
int main( int argc, char *argv[] ) { char *filename = NULL; ID3Tag *tag; if (argc != 2) { printf("*** Usage: %s file\n", argv[0]); exit (1); } filename = argv[1]; printf("*** Reading %s\n", filename); if ((tag = ID3Tag_New()) != NULL) { ID3Frame *frame; (void) ID3Tag_Link(tag, filename); if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char title[1024]; (void) ID3Field_GetASCII(field, title, 1024); printf("Title: %s\n", title); } else { printf("Didn't get the field\n"); } } else { printf("Didn't get the frame\n"); } if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char artist[1024]; (void) ID3Field_GetASCII(field, artist, 1024); printf("Artist: %s\n", artist); } else { printf("Didn't get the field\n"); } } else { printf("Didn't get the frame\n"); } if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) { ID3Field *field; if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) { char album[1024]; (void) ID3Field_GetASCII(field, album, 1024); printf("Album: %s\n", album); } else { printf("Didn't get the field\n"); } } else { printf("Didn't get the frame\n"); } } else { printf("Didn't get the tag\n"); } exit (0); }