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