static AlbumDetails * make_album_from_release (Mb4ReleaseGroup group, Mb4Release release, Mb4Medium medium) { AlbumDetails *album; Mb4ArtistCredit credit; GList *artists; char *date = NULL; char buffer[512]; /* for the GET macro */ g_assert (release); g_return_val_if_fail (medium != NULL, NULL); album = g_new0 (AlbumDetails, 1); GET (album->album_id, mb4_release_get_id, release); GET (album->title, mb4_medium_get_title, medium); if (album->title == NULL) GET (album->title, mb4_release_get_title, release); credit = mb4_release_get_artistcredit (release); artists = get_artist_list (credit); if (artists) { get_artist_info (artists, &album->artist, &album->artist_sortname, &album->artist_id); } album->artists = artists; GET (date, mb4_release_get_date, release); album->release_date = sj_metadata_helper_scan_date (date); g_free (date); GET (album->asin, mb4_release_get_asin, release); GET (album->country, mb4_release_get_country, release); if (group) { GET (album->type, mb4_releasegroup_get_type, group); if (g_str_has_suffix (album->type, "Spokenword") || g_str_has_suffix (album->type, "Interview") || g_str_has_suffix (album->type, "Audiobook")) { album->is_spoken_word = TRUE; } fill_relations (mb4_releasegroup_get_relationlist(group), album); } album->disc_number = mb4_medium_get_position (medium); fill_tracks_from_medium (medium, album); fill_relations (mb4_release_get_relationlist (release), album); sj_mb4_album_details_dump (album); return album; }
static void fill_tracks_from_medium (Mb4Medium medium, AlbumDetails *album) { Mb4TrackList track_list; GList *tracks; unsigned int i; char buffer[512]; /* for the GET() macro */ track_list = mb4_medium_get_tracklist (medium); if (!track_list) return; album->number = mb4_track_list_size (track_list); tracks = NULL; for (i = 0; i < mb4_track_list_size (track_list); i++) { Mb4Track mbt; Mb4ArtistCredit credit; Mb4Recording recording; TrackDetails *track; mbt = mb4_track_list_item (track_list, i); if (!mbt) continue; track = g_new0 (TrackDetails, 1); track->album = album; track->number = mb4_track_get_position (mbt); recording = mb4_track_get_recording (mbt); if (recording != NULL) { GET (track->title, mb4_recording_get_title, recording); GET (track->track_id, mb4_recording_get_id, recording); track->duration = mb4_recording_get_length (recording) / 1000; credit = mb4_recording_get_artistcredit (recording); } else { GET (track->title, mb4_track_get_title, mbt); track->duration = mb4_track_get_length (mbt) / 1000; credit = mb4_track_get_artistcredit (mbt); } if (credit) { GList *artists; artists = get_artist_list (credit); if (artists) { get_artist_info (artists, &track->artist, &track->artist_sortname, &track->artist_id); } track->artists = artists; } if (track->artist == NULL) track->artist = g_strdup (album->artist); if (track->artist_sortname == NULL) track->artist_sortname = g_strdup (album->artist_sortname); if (track->artist_id == NULL) track->artist_id = g_strdup (album->artist_id); tracks = g_list_prepend (tracks, track); } album->tracks = g_list_reverse (tracks); }
/* the menu logic for the ncurses interface, much simpler than it looks... */ void ninterface() { menu_parameters artists_menu, albums_menu, tracks_menu; char *sections[] = {"Artists", "Albums", "Tracks" }; /* Section titles, used in the menu */ artist art; album alb; track song; list np; int art_choice, alb_choice, trak_choice; /* ---===[ ARTISTS MENU ]===--- */ artists_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str)); artists_menu->list = get_artist_list(); artists_menu->list_len = num_artists; artists_menu->title = "Artists:"; artists_menu->sections = sections; artists_menu->num_sections = 3; artists_menu->curr_section = 1; artists_menu->commands = COMMANDS; artists_menu->select = 0; artists_menu->scroll = 0; artists_menu->height = LINES; artists_menu->width = COLS; while(1) { art_choice = nmenu(artists_menu); /* draw artist menu */ artists_menu->select = art_choice; if(artists_menu->entered == QUIT_BACK) /* exit artist menu (and function) */ break; else if(artists_menu->entered == APPEND_PLAYLIST || artists_menu->entered == REPLACE_PLAYLIST) { /* play an artist (XMMS2) */ if(artists_menu->entered == REPLACE_PLAYLIST) { player_stop(); player_clear_playlist(); } art = ((artist)(lookup(artists_menu->list[art_choice])->contents)); player_add_artist(art); player_play(); } else if(artists_menu->entered == TOGGLE_PLAY_PAUSE) { player_toggle(); } else if(artists_menu->entered == NOWPLAYING) { now_playing(); } else if(artists_menu->entered == NEXT) { player_next(); } else if(artists_menu->entered == PREVIOUS) { player_previous(); } /* ---===[ ALBUMS MENU ]===--- */ else if(artists_menu->entered == '\n') { /* enter this menu */ art = ((artist)(lookup(artists_menu->list[art_choice])->contents)); albums_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str)); albums_menu->list = get_album_list(art); albums_menu->list_len = art->num_albums; albums_menu->title = art->name; albums_menu->sections = sections; albums_menu->num_sections = 3; albums_menu->curr_section = 2; albums_menu->commands = COMMANDS; albums_menu->select = 0; albums_menu->scroll = 0; albums_menu->height = LINES; albums_menu->width = COLS; while(1) { alb_choice = nmenu(albums_menu); /* draw album menu */ if(albums_menu->entered == KEY_LEFT || albums_menu->entered == QUIT_BACK) /* exit albums menu */ break; else if(albums_menu->entered == APPEND_PLAYLIST || albums_menu->entered == REPLACE_PLAYLIST) { /* play an album (XMMS2) */ if(albums_menu->entered == REPLACE_PLAYLIST) { player_stop(); player_clear_playlist(); } for(np = art->albums; np != NULL; np = np->next) if(strcmp(albums_menu->list[alb_choice], np->name) == 0) break; alb = (album)np->contents; player_add_album(alb); player_play(); } else if(albums_menu->entered == TOGGLE_PLAY_PAUSE) { player_toggle(); } else if(albums_menu->entered == NOWPLAYING) { now_playing(); } else if(albums_menu->entered == NEXT) { player_next(); } else if(albums_menu->entered == PREVIOUS) { player_previous(); } /* ---===[ TRACKS MENU ]===--- */ else if(albums_menu->entered == '\n') { /* enter this menu */ for(np = art->albums; np != NULL; np = np->next) if(strcmp(albums_menu->list[alb_choice], np->name) == 0) break; alb = (album)np->contents; tracks_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str)); tracks_menu->list = get_track_list(alb); tracks_menu->list_len = alb->num_songs; tracks_menu->title = alb->name; tracks_menu->sections = sections; tracks_menu->num_sections = 3; tracks_menu->curr_section = 3; tracks_menu->commands = COMMANDS; tracks_menu->select = 0; tracks_menu->scroll = 0; tracks_menu->height = LINES; tracks_menu->width = COLS; while(1) { trak_choice = nmenu(tracks_menu); /* draw track menu */ /* play a track (XMMS2) */ if(tracks_menu->entered == APPEND_PLAYLIST || tracks_menu->entered == REPLACE_PLAYLIST) { /* play a track (XMMS2) */ if(tracks_menu->entered == REPLACE_PLAYLIST) { player_stop(); player_clear_playlist(); } for(song = alb->songs; song != NULL; song = song->next) if(strcmp(tracks_menu->list[trak_choice], song->name) == 0) break; player_add_track(song); player_play(); } else if(tracks_menu->entered == TOGGLE_PLAY_PAUSE) { player_toggle(); } else if(tracks_menu->entered == NOWPLAYING) { now_playing(); } else if(tracks_menu->entered == KEY_LEFT || tracks_menu->entered == QUIT_BACK) { /* exit tracks menu */ break; } else if(tracks_menu->entered == NEXT) { player_next(); } else if(tracks_menu->entered == PREVIOUS) { player_previous(); } } /* drop out of tracks here */ destroy_menu_params(tracks_menu); } } /* drop out of albums here */ destroy_menu_params(albums_menu); } } /* drop out of artists here */ destroy_menu_params(artists_menu); return; }