/* get an Itdb_Track from the given file */ Itdb_Track *track_parse(char *path, Itdb_iTunesDB *db) { TagLib_File *file = NULL; TagLib_Tag *tag = NULL; const TagLib_AudioProperties *audio = NULL; Itdb_Track *track = itdb_track_new(); FILE *track_file = fopen(path, "r"); fseek(track_file, 0, SEEK_END); track->size = ftell(track_file); fclose(track_file); /* we are storing our filename in userdata */ track->userdata = g_strdup(path); track->userdata_duplicate = (gpointer (*)(gpointer))g_strdup; track->userdata_destroy = g_free; track->transferred = FALSE; itdb_track_add(db, track, -1); file = taglib_file_new(path); if (file == NULL) { /* should this be an error? */ cpod_error("error reading metadata from \"%s\"\n", path); return track; } tag = taglib_file_tag(file); audio = taglib_file_audioproperties(file); /* g_strdup() string fields so that taglib_tag_free_strings() works */ track->title = g_strdup(taglib_tag_title(tag)); track->album = g_strdup(taglib_tag_album(tag)); track->artist = g_strdup(taglib_tag_artist(tag)); track->genre = g_strdup(taglib_tag_genre(tag)); track->comment = g_strdup(taglib_tag_comment(tag)); track->track_nr = taglib_tag_track(tag); track->year = taglib_tag_year(tag); /* audioproperties_length is in seconds and track->tracklen is in ms */ track->tracklen = taglib_audioproperties_length(audio) * 1000; track->samplerate = taglib_audioproperties_samplerate(audio); taglib_tag_free_strings(); /* taglib_file_free() frees TagLib_{Tag,AudioProperties} too */ taglib_file_free(file); return track; }
Itdb_Track* GpodDb::AddTrack (const QString& path, const QString& filename, const UnmountableFileInfo& info) { auto dup = [] (const QString& str) { return strdup (str.toUtf8 ().constData ()); }; const auto track = itdb_track_new (); track->track_nr = info.TrackNumber_; track->title = dup (info.TrackTitle_); track->artist = dup (info.Artist_); track->album = dup (info.Album_); track->year = info.AlbumYear_; track->genre = dup (info.Genres_.join (" / ")); track->size = QFileInfo { path }.size (); track->transferred = 1; track->filetype = strdup ("mp3"); const auto& suffix = filename.section ('.', -1, -1).toUpper (); track->filetype_marker = 0; for (int i = 0; i < 4; ++i) { track->filetype_marker <<= 8; track->filetype_marker |= (i >= suffix.length () ? ' ' : suffix [i].toLatin1 ()); } track->ipod_path = strdup (filename.toUtf8 ().mid (1)); itdb_filename_fs2ipod (track->ipod_path); itdb_track_add (DB_, track, -1); itdb_playlist_add_track (itdb_playlist_mpl (DB_), track, -1); return track; }