55
54
static long rb_header_get_duration (RBHeader *player);
56
55
static void rb_header_set_show_timeline (RBHeader *player,
58
static gboolean rb_header_sync_time_locked (RBHeader *player);
59
57
static void rb_header_update_elapsed (RBHeader *player);
60
58
static gboolean slider_press_callback (GtkWidget *widget, GdkEventButton *event, RBHeader *player);
61
59
static gboolean slider_moved_callback (GtkWidget *widget, GdkEventMotion *event, RBHeader *player);
62
60
static gboolean slider_release_callback (GtkWidget *widget, GdkEventButton *event, RBHeader *player);
63
61
static void slider_changed_callback (GtkWidget *widget, RBHeader *player);
63
static void rb_header_tick_cb (RBPlayer *mmplayer, long time, RBHeader *header);
253
251
textvbox = gtk_vbox_new (FALSE, 0);
254
252
gtk_container_add (GTK_CONTAINER (align), textvbox);
256
player->priv->song = rb_ellipsizing_label_new ("");
257
rb_ellipsizing_label_set_mode (RB_ELLIPSIZING_LABEL (player->priv->song), RB_ELLIPSIZE_END);
254
player->priv->song = gtk_label_new ("");
255
gtk_label_set_ellipsize (GTK_LABEL (player->priv->song), PANGO_ELLIPSIZE_END);
258
256
gtk_label_set_use_markup (GTK_LABEL (player->priv->song), TRUE);
259
257
gtk_label_set_selectable (GTK_LABEL (player->priv->song), TRUE);
260
258
gtk_misc_set_alignment (GTK_MISC (player->priv->song), 0, 0);
313
311
gtk_container_add (GTK_CONTAINER (align), player->priv->elapsed);
314
312
gtk_box_pack_start (GTK_BOX (scalebox), align, FALSE, TRUE, 0);
315
313
align = player->priv->timeframe = gtk_alignment_new (1.0, 0.5, 0.0, 0.0);
314
gtk_container_add (GTK_CONTAINER (player->priv->timeframe), player->priv->timeline);
315
gtk_widget_set_sensitive (player->priv->timeline, FALSE);
317
317
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
319
319
gtk_box_pack_start (GTK_BOX (player), hbox, TRUE, TRUE, 0);
320
320
gtk_box_pack_end (GTK_BOX (player), align, FALSE, FALSE, 0);
322
player->priv->timeout = g_timeout_add (1000, (GSourceFunc) rb_header_sync_time_locked, player);
362
358
player->priv->entry = g_value_get_pointer (value);
361
if (player->priv->mmplayer) {
362
g_signal_handler_disconnect (player->priv->mmplayer,
363
player->priv->tick_id);
364
player->priv->tick_id = 0;
365
366
player->priv->mmplayer = g_value_get_object (value);
367
player->priv->tick_id = g_signal_connect (G_OBJECT (player->priv->mmplayer),
369
(GCallback) rb_header_tick_cb,
368
373
g_free (player->priv->title);
445
450
rb_header_get_duration (RBHeader *player)
448
452
if (player->priv->entry) {
449
rhythmdb_read_lock (player->priv->db);
450
ret = rhythmdb_entry_get_long (player->priv->db,
452
RHYTHMDB_PROP_DURATION);
453
rhythmdb_read_unlock (player->priv->db);
453
return player->priv->entry->duration;
460
info_url (guint opt, const char *data)
464
ret = g_strdup_printf ("http://www.allmusic.com/cg/amg.dll?p=amg&opt1=%d&sql=%s", opt, data);
466
for (p = ret; *p; p++)
459
sanitize_string (const char *data)
464
* netlabels often put URLs (or domain names) in the 'album' field
465
* of their releases; since there are no artist names in AMG that
466
* start with 'http://' or 'www.' (there is a 'www', from the 70s,
467
* strangely enough), we can safely assume anything that looks
468
* like a URL or domain name is one.
470
* There's sometimes some trailing junk, usually after a space,
471
* so it's probably sensible to strip that off.
473
if (g_str_has_prefix (data, "http://")) {
474
char *end = strchr (data, ' ');
476
ret = g_strndup (data, end - data);
478
ret = g_strdup (data);
479
} else if (g_str_has_prefix (data, "www.")) {
480
char *end = strchr (data, ' ');
482
ret = g_strdup_printf ("http://%*s",
483
(int) (end-data), data);
485
ret = g_strdup_printf ("http://%s", data);
487
ret = g_strdup (data);
489
return g_strstrip (ret);
493
info_url (const char *artist, const char *album)
495
char *escaped_artist;
496
char *sanitized_artist;
499
sanitized_artist = sanitize_string (artist);
500
escaped_artist = gnome_vfs_escape_string (sanitized_artist);
501
g_free (sanitized_artist);
503
char *sanitized_album;
505
sanitized_album = sanitize_string (album);
506
escaped_album = gnome_vfs_escape_string (sanitized_album);
507
g_free (sanitized_album);
508
ret = g_strdup_printf ("http://www.last.fm/music/%s/%s",
509
escaped_artist, escaped_album);
510
g_free (escaped_album);
512
ret = g_strdup_printf ("http://www.last.fm/music/%s", escaped_artist);
514
g_free (escaped_artist);
473
album_info_url (const char *album)
475
return info_url (2, album);
479
artist_info_url (const char *album)
481
return info_url (1, album);
485
520
rb_header_sync (RBHeader *player)
489
524
rb_debug ("syncing with node = %p", player->priv->entry);
490
525
if (player->priv->entry != NULL) {
491
526
const char *song = player->priv->title;
493
528
gboolean have_duration = rb_header_get_duration (player) > 0;
494
529
const char *album;
495
530
const char *artist;
496
531
GtkTooltips *artist_href_tips, *album_href_tips;
498
rhythmdb_read_lock (player->priv->db);
500
album = rhythmdb_entry_get_string (player->priv->db,
502
RHYTHMDB_PROP_ALBUM);
504
artist = rhythmdb_entry_get_string (player->priv->db,
506
RHYTHMDB_PROP_ARTIST);
508
rhythmdb_read_unlock (player->priv->db);
534
album = rb_refstring_get (player->priv->entry->album);
535
artist = rb_refstring_get (player->priv->entry->artist);
510
537
escaped = g_markup_escape_text (song, -1);
511
538
tmp = SONG_MARKUP (escaped);
512
539
g_free (escaped);
513
rb_ellipsizing_label_set_markup (RB_ELLIPSIZING_LABEL (player->priv->song), tmp);
540
gtk_label_set_markup (GTK_LABEL (player->priv->song), tmp);
516
543
rb_header_set_show_artist_album (player, (album != NULL && artist != NULL)
524
551
rb_debug ("artist: %s album: %s", artist, album);
526
s = tmp = g_strdup (album);
527
while ((tmp = strstr (tmp, " ")) != NULL)
529
tmp = album_info_url (s);
553
tmp = info_url (artist, album);
532
554
gnome_href_set_url (player->priv->displaybox->album, tmp);
533
555
escaped = g_markup_escape_text (album, -1);
534
556
gnome_href_set_text (player->priv->displaybox->album, escaped);
541
563
_("Get information on this album from the web"),
544
s = tmp = g_strdup (artist);
545
while ((tmp = strstr (tmp, " ")) != NULL)
549
tmp = artist_info_url (s);
566
tmp = info_url (artist, NULL);
551
567
gnome_href_set_url (player->priv->displaybox->artist, tmp);
552
568
escaped = g_markup_escape_text (artist, -1);
553
569
gnome_href_set_text (player->priv->displaybox->artist, escaped);
578
594
GtkTooltips *iradio_href_tips;
580
596
rb_debug ("not playing");
581
tmp = SONG_MARKUP (_("Not playing"));
582
rb_ellipsizing_label_set_markup (RB_ELLIPSIZING_LABEL (player->priv->song), tmp);
597
tmp = SONG_MARKUP (_("Not Playing"));
598
gtk_label_set_markup (GTK_LABEL (player->priv->song), tmp);
585
601
iradio_href_tips = gtk_tooltips_new ();
591
607
rb_header_set_urldata (player, NULL, NULL);
592
608
rb_header_set_show_artist_album (player, FALSE);
593
609
rb_header_set_show_timeline (player, FALSE);
611
player->priv->slider_locked = TRUE;
612
gtk_adjustment_set_value (player->priv->adjustment, 0.0);
613
player->priv->slider_locked = FALSE;
614
gtk_widget_set_sensitive (player->priv->scale, FALSE);
615
gtk_label_set_text (GTK_LABEL (player->priv->elapsed), "0:00");
644
666
rb_header_set_show_timeline (RBHeader *player,
647
if (player->priv->timeline_shown == show)
650
player->priv->timeline_shown = show;
653
gtk_container_remove (GTK_CONTAINER (player->priv->timeframe), player->priv->timeline);
655
gtk_container_add (GTK_CONTAINER (player->priv->timeframe), player->priv->timeline);
656
gtk_widget_show_all (player->priv->timeline);
661
rb_header_sync_time_locked (RBHeader *player)
665
GDK_THREADS_ENTER ();
667
ret = rb_header_sync_time (player);
669
GDK_THREADS_LEAVE ();
669
gtk_widget_set_sensitive (player->priv->timeline, show);
848
845
rb_header_get_elapsed_string (RBHeader *player)
850
int seconds = 0, minutes = 0, seconds2 = -1, minutes2 = -1;
851
guint elapsed = rb_player_get_time (player->priv->mmplayer);
847
int seconds = 0, minutes = 0, hours = 0, seconds2 = -1, minutes2 = -1, hours2 = -1;
854
minutes = elapsed / 60;
855
seconds = elapsed % 60;
849
if (player->priv->state->elapsed > 0) {
850
hours = player->priv->state->elapsed / (60 * 60);
851
minutes = (player->priv->state->elapsed - (hours * 60 * 60)) / 60;
852
seconds = player->priv->state->elapsed % 60;
858
855
if (player->priv->state->duration > 0) {
859
minutes2 = player->priv->state->duration / 60;
856
hours2 = player->priv->state->duration / (60 * 60);
857
minutes2 = (player->priv->state->duration - (hours2 * 60 * 60)) / 60;
860
858
seconds2 = player->priv->state->duration % 60;
861
859
if (eel_gconf_get_boolean (CONF_UI_TIME_DISPLAY)) {
862
return g_strdup_printf (_("%d:%02d of %d:%02d"), minutes, seconds, minutes2, seconds2);
860
if (hours == 0 && hours2 == 0)
861
return g_strdup_printf (_("%d:%02d of %d:%02d"),
865
return g_strdup_printf (_("%d:%02d:%02d of %d:%02d:%02d"),
866
hours, minutes, seconds,
867
hours2, minutes2, seconds2);
864
int remaining = player->priv->state->duration - elapsed;
865
int remaining_minutes = remaining / 60;
869
int remaining = player->priv->state->duration - player->priv->state->elapsed;
870
int remaining_hours = remaining / (60 * 60);
871
int remaining_minutes = (remaining - (remaining_hours * 60 * 60)) / 60;
866
872
/* remaining could conceivably be negative. This would
867
873
* be a bug, but the elapsed time will display right
868
874
* with the abs(). */
869
875
int remaining_seconds = abs (remaining % 60);
870
return g_strdup_printf (_("%d:%02d of %d:%02d remaining"), remaining_minutes, remaining_seconds, minutes2, seconds2);
877
return g_strdup_printf (_("%d:%02d of %d:%02d remaining"),
878
remaining_minutes, remaining_seconds,
881
return g_strdup_printf (_("%d:%02d:%02d of %d:%02d:%02d remaining"),
882
remaining_hours, remaining_minutes, remaining_seconds,
883
hours2, minutes2, seconds2);
873
return g_strdup_printf (_("%d:%02d"), minutes, seconds);
887
return g_strdup_printf (_("%d:%02d"), minutes, seconds);
889
return g_strdup_printf (_("%d:%02d:%02d"), hours, minutes, seconds);