1 /*
2 * Copyright (C) 2005 Marc Pavot <marc.pavot@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 */
19
20 #include "lyrics/ario-lyrics-manager.h"
21 #include <gtk/gtk.h>
22 #include <string.h>
23 #include <config.h>
24 #include <glib/gi18n.h>
25 #include "lib/ario-conf.h"
26 #include "lyrics/ario-lyrics-letras.h"
27 #include "lyrics/ario-lyrics.h"
28 #include "preferences/ario-preferences.h"
29 #include "ario-debug.h"
30
31 struct ArioLyricsManagerPrivate
32 {
33 GSList *providers;
34 };
35
36 #define ARIO_LYRICS_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_ARIO_LYRICS_MANAGER, ArioLyricsManagerPrivate))
G_DEFINE_TYPE(ArioLyricsManager,ario_lyrics_manager,G_TYPE_OBJECT)37 G_DEFINE_TYPE (ArioLyricsManager, ario_lyrics_manager, G_TYPE_OBJECT)
38
39 static void
40 ario_lyrics_manager_class_init (ArioLyricsManagerClass *klass)
41 {
42 ARIO_LOG_FUNCTION_START;
43 g_type_class_add_private (klass, sizeof (ArioLyricsManagerPrivate));
44 }
45
46 static void
ario_lyrics_manager_init(ArioLyricsManager * lyrics_manager)47 ario_lyrics_manager_init (ArioLyricsManager *lyrics_manager)
48 {
49 ARIO_LOG_FUNCTION_START;
50
51 lyrics_manager->priv = ARIO_LYRICS_MANAGER_GET_PRIVATE (lyrics_manager);
52 }
53
54 ArioLyricsManager *
ario_lyrics_manager_get_instance(void)55 ario_lyrics_manager_get_instance (void)
56 {
57 ARIO_LOG_FUNCTION_START;
58 static ArioLyricsManager *lyrics_manager = NULL;
59
60 if (!lyrics_manager) {
61 ArioLyricsProvider *lyrics_provider;
62
63 lyrics_manager = g_object_new (TYPE_ARIO_LYRICS_MANAGER,
64 NULL);
65 g_return_val_if_fail (lyrics_manager->priv != NULL, NULL);
66
67 lyrics_provider = ario_lyrics_letras_new ();
68 ario_lyrics_manager_add_provider (lyrics_manager,
69 ARIO_LYRICS_PROVIDER (lyrics_provider));
70
71 ario_lyrics_manager_update_providers (lyrics_manager);
72 }
73
74 return ARIO_LYRICS_MANAGER (lyrics_manager);
75 }
76
77 static void
ario_lyrics_manager_shutdown_foreach(ArioLyricsProvider * lyrics_provider,GSList ** providers)78 ario_lyrics_manager_shutdown_foreach (ArioLyricsProvider *lyrics_provider,
79 GSList **providers)
80 {
81 *providers = g_slist_append (*providers, ario_lyrics_provider_get_id (lyrics_provider));
82 }
83
84 static void
ario_lyrics_manager_shutdown_active_foreach(ArioLyricsProvider * lyrics_provider,GSList ** providers)85 ario_lyrics_manager_shutdown_active_foreach (ArioLyricsProvider *lyrics_provider,
86 GSList **providers)
87 {
88 if (ario_lyrics_provider_is_active (lyrics_provider))
89 *providers = g_slist_append (*providers, ario_lyrics_provider_get_id (lyrics_provider));
90 }
91
92 void
ario_lyrics_manager_shutdown(ArioLyricsManager * lyrics_manager)93 ario_lyrics_manager_shutdown (ArioLyricsManager *lyrics_manager)
94 {
95
96 GSList *providers = NULL;
97 GSList *active_providers = NULL;
98
99 g_slist_foreach (lyrics_manager->priv->providers, (GFunc) ario_lyrics_manager_shutdown_foreach, &providers);
100 g_slist_foreach (lyrics_manager->priv->providers, (GFunc) ario_lyrics_manager_shutdown_active_foreach, &active_providers);
101
102 ario_conf_set_string_slist (PREF_LYRICS_PROVIDERS_LIST, providers);
103 ario_conf_set_string_slist (PREF_LYRICS_ACTIVE_PROVIDERS_LIST, active_providers);
104 g_slist_free (providers);
105 g_slist_free (active_providers);
106 }
107
108 static gint
ario_lyrics_manager_compare_providers(ArioLyricsProvider * lyrics_provider,const gchar * id)109 ario_lyrics_manager_compare_providers (ArioLyricsProvider *lyrics_provider,
110 const gchar *id)
111 {
112 return strcmp (ario_lyrics_provider_get_id (lyrics_provider), id);
113 }
114
115 void
ario_lyrics_manager_update_providers(ArioLyricsManager * lyrics_manager)116 ario_lyrics_manager_update_providers (ArioLyricsManager *lyrics_manager)
117 {
118 ARIO_LOG_FUNCTION_START;
119 GSList *conf_tmp;
120 GSList *conf_providers;
121 GSList *conf_active_providers;
122 GSList *found;
123 GSList *providers = NULL;
124 ArioLyricsProvider *lyrics_provider;
125
126 conf_providers = ario_conf_get_string_slist (PREF_LYRICS_PROVIDERS_LIST, PREF_LYRICS_PROVIDERS_LIST_DEFAULT);
127 for (conf_tmp = conf_providers; conf_tmp; conf_tmp = g_slist_next (conf_tmp)) {
128 found = g_slist_find_custom (lyrics_manager->priv->providers,
129 conf_tmp->data,
130 (GCompareFunc) ario_lyrics_manager_compare_providers);
131 if (found) {
132 providers = g_slist_append (providers, found->data);
133 }
134 }
135 g_slist_foreach (conf_providers, (GFunc) g_free, NULL);
136 g_slist_free (conf_providers);
137
138 conf_active_providers = ario_conf_get_string_slist (PREF_LYRICS_ACTIVE_PROVIDERS_LIST, PREF_LYRICS_ACTIVE_PROVIDERS_LIST_DEFAULT);
139 for (conf_tmp = conf_active_providers; conf_tmp; conf_tmp = g_slist_next (conf_tmp)) {
140 found = g_slist_find_custom (providers,
141 conf_tmp->data,
142 (GCompareFunc) ario_lyrics_manager_compare_providers);
143 if (found) {
144 lyrics_provider = found->data;
145 ario_lyrics_provider_set_active (lyrics_provider, TRUE);
146 }
147 }
148 g_slist_foreach (conf_active_providers, (GFunc) g_free, NULL);
149 g_slist_free (conf_active_providers);
150
151 for (conf_tmp = lyrics_manager->priv->providers; conf_tmp; conf_tmp = g_slist_next (conf_tmp)) {
152 if (!g_slist_find (providers, conf_tmp->data)) {
153 providers = g_slist_append (providers, conf_tmp->data);
154 }
155 }
156
157 g_slist_free (lyrics_manager->priv->providers);
158 lyrics_manager->priv->providers = providers;
159 }
160
161 GSList*
ario_lyrics_manager_get_providers(ArioLyricsManager * lyrics_manager)162 ario_lyrics_manager_get_providers (ArioLyricsManager *lyrics_manager)
163 {
164 ARIO_LOG_FUNCTION_START;
165 return lyrics_manager->priv->providers;
166 }
167
168 void
ario_lyrics_manager_set_providers(ArioLyricsManager * lyrics_manager,GSList * providers)169 ario_lyrics_manager_set_providers (ArioLyricsManager *lyrics_manager,
170 GSList *providers)
171 {
172 ARIO_LOG_FUNCTION_START;
173 lyrics_manager->priv->providers = providers;
174 }
175
176 ArioLyricsProvider*
ario_lyrics_manager_get_provider_from_id(ArioLyricsManager * lyrics_manager,const gchar * id)177 ario_lyrics_manager_get_provider_from_id (ArioLyricsManager *lyrics_manager,
178 const gchar *id)
179 {
180 ARIO_LOG_FUNCTION_START;
181 GSList *found;
182
183 found = g_slist_find_custom (lyrics_manager->priv->providers,
184 id,
185 (GCompareFunc) ario_lyrics_manager_compare_providers);
186
187 return ARIO_LYRICS_PROVIDER (found->data);
188 }
189
190
191 void
ario_lyrics_manager_add_provider(ArioLyricsManager * lyrics_manager,ArioLyricsProvider * lyrics_provider)192 ario_lyrics_manager_add_provider (ArioLyricsManager *lyrics_manager,
193 ArioLyricsProvider *lyrics_provider)
194 {
195 ARIO_LOG_FUNCTION_START;
196 lyrics_manager->priv->providers = g_slist_append (lyrics_manager->priv->providers, lyrics_provider);
197 }
198
199 void
ario_lyrics_manager_remove_provider(ArioLyricsManager * lyrics_manager,ArioLyricsProvider * lyrics_provider)200 ario_lyrics_manager_remove_provider (ArioLyricsManager *lyrics_manager,
201 ArioLyricsProvider *lyrics_provider)
202 {
203 ARIO_LOG_FUNCTION_START;
204 lyrics_manager->priv->providers = g_slist_remove (lyrics_manager->priv->providers, lyrics_provider);
205 }
206
207 ArioLyrics *
ario_lyrics_manager_get_lyrics(ArioLyricsManager * lyrics_manager,const char * artist,const char * song,const char * file)208 ario_lyrics_manager_get_lyrics (ArioLyricsManager *lyrics_manager,
209 const char *artist,
210 const char *song,
211 const char *file)
212 {
213 ARIO_LOG_FUNCTION_START;
214 GSList *tmp;
215 ArioLyricsProvider *lyrics_provider;
216 ArioLyrics *lyrics = NULL;
217
218 if (ario_lyrics_lyrics_exists (artist, song)) {
219 lyrics = ario_lyrics_get_local_lyrics (artist, song);
220 }
221 if (lyrics)
222 return lyrics;
223
224 for (tmp = lyrics_manager->priv->providers; tmp; tmp = g_slist_next (tmp)) {
225 lyrics_provider = tmp->data;
226 if (!ario_lyrics_provider_is_active (lyrics_provider))
227 continue;
228 ARIO_LOG_DBG ("looking for lyrics using provider:%s for song:%s\n", ario_lyrics_provider_get_name (lyrics_provider), song);
229
230 lyrics = ario_lyrics_provider_get_lyrics (lyrics_provider,
231 artist, song,
232 file);
233 if (lyrics)
234 break;
235 }
236 if (lyrics) {
237 ario_lyrics_prepend_infos (lyrics);
238 ario_lyrics_save_lyrics (artist,
239 song,
240 lyrics->lyrics);
241 }
242
243 return lyrics;
244 }
245
246
247 void
ario_lyrics_manager_get_lyrics_candidates(ArioLyricsManager * lyrics_manager,const gchar * artist,const gchar * song,GSList ** candidates)248 ario_lyrics_manager_get_lyrics_candidates (ArioLyricsManager *lyrics_manager,
249 const gchar *artist,
250 const gchar *song,
251 GSList **candidates)
252 {
253 ARIO_LOG_FUNCTION_START;
254 GSList *tmp;
255 ArioLyricsProvider *lyrics_provider;
256
257 for (tmp = lyrics_manager->priv->providers; tmp; tmp = g_slist_next (tmp)) {
258 lyrics_provider = tmp->data;
259 if (!ario_lyrics_provider_is_active (lyrics_provider))
260 continue;
261
262 ario_lyrics_provider_get_lyrics_candidates (lyrics_provider,
263 artist, song,
264 candidates);
265 }
266 }
267
268