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);
}
Example #3
0
/* 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;
}