X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_lyrics.c;h=a8c721068542563a57713d8c1503733b0e07fac5;hb=c64c37477b87ec545365b8923d6f9ff745469617;hp=a1556aec582bbdf2cf2d2eb3ad9d013a41b3b812;hpb=444ca4c048001200a2d563c430e05d63fe2c8f3f;p=ncmpc.git diff --git a/src/screen_lyrics.c b/src/screen_lyrics.c index a1556ae..a8c7210 100644 --- a/src/screen_lyrics.c +++ b/src/screen_lyrics.c @@ -1,32 +1,36 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2010 The Music Player Daemon Project * Project homepage: http://musicpd.org - + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ + */ -#include +#include "screen_lyrics.h" +#include "screen_interface.h" +#include "screen_status.h" +#include "screen_file.h" +#include "screen_song.h" #include "i18n.h" #include "options.h" #include "mpdclient.h" -#include "command.h" #include "screen.h" -#include "strfsong.h" #include "lyrics.h" #include "screen_text.h" +#include +#include #include #include #include @@ -35,15 +39,17 @@ static struct screen_text text; -static const struct mpd_song *next_song; +static struct mpd_song *next_song; static bool follow = false; static struct { struct mpd_song *song; - char *artist, *title; + char *artist, *title, *plugin_name; struct plugin_cycle *loader; + + guint loader_timeout; } current; static void @@ -54,6 +60,16 @@ screen_lyrics_abort(void) current.loader = NULL; } + if (current.loader_timeout != 0) { + g_source_remove(current.loader_timeout); + current.loader_timeout = 0; + } + + if (current.plugin_name != NULL) { + g_free(current.plugin_name); + current.plugin_name = NULL; + } + if (current.artist != NULL) { g_free(current.artist); current.artist = NULL; @@ -61,11 +77,11 @@ screen_lyrics_abort(void) if (current.title != NULL) { g_free(current.title); - current.artist = NULL; + current.title = NULL; } if (current.song != NULL) { - mpd_freeSong(current.song); + mpd_song_free(current.song); current.song = NULL; } } @@ -83,14 +99,21 @@ lyrics_repaint_if_active(void) } } +static void +path_lyr_file(char *path, size_t size, + const char *artist, const char *title) +{ + snprintf(path, size, "%s/.lyrics/%s - %s.txt", + getenv("HOME"), artist, title); +} + static bool exists_lyr_file(const char *artist, const char *title) { char path[1024]; struct stat result; - snprintf(path, 1024, "%s/.lyrics/%s - %s.txt", - getenv("HOME"), artist, title); + path_lyr_file(path, 1024, artist, title); return (stat(path, &result) == 0); } @@ -104,8 +127,7 @@ create_lyr_file(const char *artist, const char *title) getenv("HOME")); mkdir(path, S_IRWXU); - snprintf(path, 1024, "%s/.lyrics/%s - %s.txt", - getenv("HOME"), artist, title); + path_lyr_file(path, 1024, artist, title); return fopen(path, "w"); } @@ -128,6 +150,21 @@ store_lyr_hd(void) return 0; } +static int +delete_lyr_hd(void) +{ + char path[1024]; + + if (!exists_lyr_file(current.artist, current.title)) + return -1; + + path_lyr_file(path, 1024, current.artist, current.title); + if (unlink(path) != 0) + return -2; + + return 0; +} + static void screen_lyrics_set(const GString *str) { @@ -136,47 +173,88 @@ screen_lyrics_set(const GString *str) /* paint new data */ lyrics_repaint_if_active(); - - if (options.lyrics_autosave && - !exists_lyr_file(current.artist, current.title)) - store_lyr_hd(); } static void -screen_lyrics_callback(const GString *result, G_GNUC_UNUSED void *data) +screen_lyrics_callback(const GString *result, const bool success, + const char *plugin_name, G_GNUC_UNUSED void *data) { assert(current.loader != NULL); + current.plugin_name = g_strdup(plugin_name); + + /* Display result, which may be lyrics or error messages */ if (result != NULL) screen_lyrics_set(result); - else + + if (success == true) { + if (options.lyrics_autosave && + !exists_lyr_file(current.artist, current.title)) + store_lyr_hd(); + } else { /* translators: no lyrics were found for the song */ screen_status_message (_("No lyrics")); + } + if (current.loader_timeout != 0) { + g_source_remove(current.loader_timeout); + current.loader_timeout = 0; + } + + plugin_stop(current.loader); + current.loader = NULL; +} + +static gboolean +screen_lyrics_timeout_callback(gpointer G_GNUC_UNUSED data) +{ plugin_stop(current.loader); current.loader = NULL; + + screen_status_printf(_("Lyrics timeout occurred after %d seconds"), + options.lyrics_timeout); + + current.loader_timeout = 0; + return FALSE; } static void screen_lyrics_load(const struct mpd_song *song) { - char buffer[MAX_SONGNAME_LENGTH]; + const char *artist, *title; assert(song != NULL); screen_lyrics_abort(); screen_text_clear(&text); - current.song = mpd_songDup(song); + artist = mpd_song_get_tag(song, MPD_TAG_ARTIST, 0); + title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0); - strfsong(buffer, sizeof(buffer), "%artist%", song); - current.artist = g_strdup(buffer); - - strfsong(buffer, sizeof(buffer), "%title%", song); - current.title = g_strdup(buffer); + current.song = mpd_song_dup(song); + current.artist = g_strdup(artist); + current.title = g_strdup(title); current.loader = lyrics_load(current.artist, current.title, screen_lyrics_callback, NULL); + + if (options.lyrics_timeout != 0) { + current.loader_timeout = + g_timeout_add_seconds(options.lyrics_timeout, + screen_lyrics_timeout_callback, + NULL); + } +} + +static void +screen_lyrics_reload(void) +{ + if (current.loader == NULL && current.artist != NULL && + current.title != NULL) { + current.loader = lyrics_load(current.artist, current.title, + screen_lyrics_callback, NULL); + screen_text_repaint(&text); + } } static void @@ -200,33 +278,34 @@ lyrics_exit(void) } static void -lyrics_open(mpdclient_t *c) +lyrics_open(struct mpdclient *c) { - if (next_song == NULL) - next_song = c->song; + const struct mpd_song *next_song_c = + next_song != NULL ? next_song : c->song; - if (next_song != NULL && + if (next_song_c != NULL && (current.song == NULL || - strcmp(next_song->file, current.song->file) != 0)) - screen_lyrics_load(next_song); + strcmp(mpd_song_get_uri(next_song_c), + mpd_song_get_uri(current.song)) != 0)) + screen_lyrics_load(next_song_c); - next_song = NULL; + if (next_song != NULL) { + mpd_song_free(next_song); + next_song = NULL; + } } static void -lyrics_update(mpdclient_t *c) +lyrics_update(struct mpdclient *c) { if (!follow) return; - next_song = c->song; - - if (next_song != NULL && + if (c->song != NULL && (current.song == NULL || - strcmp(next_song->file, current.song->file) != 0)) - screen_lyrics_load(next_song); - - next_song = NULL; + strcmp(mpd_song_get_uri(c->song), + mpd_song_get_uri(current.song)) != 0)) + screen_lyrics_load(c->song); } static const char * @@ -241,9 +320,16 @@ lyrics_title(char *str, size_t size) return str; } else if (current.artist != NULL && current.title != NULL && !screen_text_is_empty(&text)) { - snprintf(str, size, "%s: %s - %s", - _("Lyrics"), - current.artist, current.title); + int n; + n = snprintf(str, size, "%s: %s - %s", + _("Lyrics"), + current.artist, current.title); + + if (options.lyrics_show_plugin && current.plugin_name != NULL && + (unsigned int) n < size - 1) + snprintf(str + n, size - n, " (%s)", + current.plugin_name); + return str; } else return _("Lyrics"); @@ -256,7 +342,7 @@ lyrics_paint(void) } static bool -lyrics_cmd(mpdclient_t *c, command_t cmd) +lyrics_cmd(struct mpdclient *c, command_t cmd) { if (screen_text_cmd(&text, c, cmd)) return true; @@ -274,12 +360,28 @@ lyrics_cmd(mpdclient_t *c, command_t cmd) /* lyrics for the song were saved on hard disk */ screen_status_message (_("Lyrics saved")); return true; + case CMD_DELETE: + if (current.loader == NULL && current.artist != NULL && + current.title != NULL) { + switch (delete_lyr_hd()) { + case 0: + screen_status_message (_("Lyrics deleted")); + break; + case -1: + screen_status_message (_("No saved lyrics")); + break; + } + } + return true; case CMD_LYRICS_UPDATE: if (c->song != NULL) { screen_lyrics_load(c->song); screen_text_repaint(&text); } return true; + case CMD_SELECT: + screen_lyrics_reload(); + return true; #ifdef ENABLE_SONG_SCREEN case CMD_SCREEN_SONG: @@ -327,6 +429,6 @@ screen_lyrics_switch(struct mpdclient *c, const struct mpd_song *song, bool f) assert(song != NULL); follow = f; - next_song = song; + next_song = mpd_song_dup(song); screen_switch(&screen_lyrics, c); }