annotate src/lastfm/lastfm.c @ 1182:8df9aab3897e trunk

[svn] - Bleh, squash the evil warning! Must compile without warnings!
author nazca
date Tue, 12 Jun 2007 17:26:51 -0700
parents 1ba0d3500f3c
children 0ae013f630fa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
1 /* Audacious
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
2 * Copyright (c) 2007 Cristi Magherusan
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
3 *
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or modify
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
5 * it under the terms of the GNU General Public License as published by
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
7 * (at your option) any later version.
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
8 *
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
9 * This program is distributed in the hope that it will be useful,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
12 * GNU General Public License for more details.
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
13 *
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
14 * You should have received a copy of the GNU General Public License
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
15 * along with this program; if not, write to the Free Software
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
17 */
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
18
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
19 #include <audacious/vfs.h>
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
20 #include <audacious/plugin.h>
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
21 #include <audacious/configdb.h>
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
22
1161
1ba0d3500f3c [svn] Implicit declarations are bad, hmmkay?
chainsaw
parents: 1150
diff changeset
23 #include <libmowgli/mowgli_global_storage.h>
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
24 #include <curl/curl.h>
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
25 #include <glib.h>
982
7b0d16a9a92f [svn] fixed all the warnings
majeru
parents: 979
diff changeset
26 #include "lastfm.h"
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
27
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
28 #define DEBUG 0
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
29
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
30 LastFM *LastFMGlobalData;
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
31 /*this keeps the login data in a global place since
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
32 * we cannot login on every fopen call* if anyone
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
33 * has a better solution to this any hint is welcome */
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
34
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
35 static size_t lastfm_store_res(void *ptr, size_t size, size_t nmemb, void *udata)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
36 {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
37 GString *data = (GString *) udata;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
38 g_string_append_len(data, ptr, nmemb);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
39 return size * nmemb;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
40 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
41
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
42 gint get_data_from_url(gchar buf[4096], GString * res)
1008
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
43 {
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
44 CURL *curl = curl_easy_init();
1008
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
45 curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
46 curl_easy_setopt(curl, CURLOPT_USERAGENT, "Audacious");
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
47 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, lastfm_store_res);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
48 curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
49 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
50 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, LASTFM_CURL_TIMEOUT);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
51 curl_easy_setopt(curl, CURLOPT_URL, buf);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
52 curl_easy_setopt(curl, CURLOPT_WRITEDATA, res);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
53 gint status = curl_easy_perform(curl);
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
54 curl_easy_cleanup(curl);
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
55 return status;
1008
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
56 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
57
982
7b0d16a9a92f [svn] fixed all the warnings
majeru
parents: 979
diff changeset
58 static gboolean lastfm_login(void)
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
59 {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
60 /*gets the session ID in lastfm_session_id and returns the URL to be played
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
61 * read http://gabistapler.de/blog/index.php?/archives/268-Play-last.fm-streams-without-the-player.html for more info
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
62 */
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
63 gint status, i;
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
64 gchar buf[4096], **split = NULL;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
65 GString *res = g_string_new(NULL);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
66 ConfigDb *cfgfile = NULL;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
67 char *username = NULL, *password = NULL;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
68 if ((cfgfile = bmp_cfg_db_open()) != NULL)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
69 {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
70 bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "username", &username);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
71 bmp_cfg_db_get_string(cfgfile, "audioscrobbler", "password", &password);
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
72 g_free(cfgfile);
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
73 }
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
74 if (username != NULL && password != NULL)
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
75 {
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
76 snprintf(buf, sizeof(buf), LASTFM_HANDSHAKE_URL, username, password);
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
77 g_free(password);
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
78 g_free(username);
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
79 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
80 else
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
81 return FALSE;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
82
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
83 status = get_data_from_url(buf, res);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
84
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
85 #ifdef DEBUG
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
86 g_print("URL:%s\n", buf);
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
87 g_print("Downloaded data:%s\n", res->str);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
88 #endif
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
89 if (status == CURLE_OK)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
90 {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
91 split = g_strsplit(res->str, "\n", 7);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
92
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
93 for (i = 0; split && split[i]; i++)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
94 {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
95 if (g_str_has_prefix(split[i], "session="))
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
96 LastFMGlobalData->lastfm_session_id = g_strndup(split[i] + 8, 32);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
97 else if (g_str_has_prefix(split[i], "stream_url="))
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
98 LastFMGlobalData->lastfm_mp3_stream_url = g_strdup(split[i] + 11);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
99 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
100 }
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
101 else
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
102 return FALSE;
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
103
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
104 g_strfreev(split);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
105 g_string_erase(res, 0, -1);
1149
bca08b1c2d16 [svn] - expose lastfm internal data over mowgli's global storage subsystem so that plugins can manipulate lastfm listening indirectly
nenolod
parents: 1147
diff changeset
106
bca08b1c2d16 [svn] - expose lastfm internal data over mowgli's global storage subsystem so that plugins can manipulate lastfm listening indirectly
nenolod
parents: 1147
diff changeset
107 if (mowgli_global_storage_get("lastfm_session_id"))
bca08b1c2d16 [svn] - expose lastfm internal data over mowgli's global storage subsystem so that plugins can manipulate lastfm listening indirectly
nenolod
parents: 1147
diff changeset
108 mowgli_global_storage_free("lastfm_session_id");
bca08b1c2d16 [svn] - expose lastfm internal data over mowgli's global storage subsystem so that plugins can manipulate lastfm listening indirectly
nenolod
parents: 1147
diff changeset
109
bca08b1c2d16 [svn] - expose lastfm internal data over mowgli's global storage subsystem so that plugins can manipulate lastfm listening indirectly
nenolod
parents: 1147
diff changeset
110 mowgli_global_storage_put("lastfm_session_id", LastFMGlobalData->lastfm_session_id);
1150
3506c611a802 [svn] - fix registration of lastfm session ID
nenolod
parents: 1149
diff changeset
111
3506c611a802 [svn] - fix registration of lastfm session ID
nenolod
parents: 1149
diff changeset
112 return (gboolean) TRUE;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
113 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
114
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
115 static gboolean lastfm_adjust(const gchar * url)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
116 {
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
117 int status, i;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
118 gchar tmp[4096], **split = NULL;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
119 gboolean ret = FALSE;
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
120 GString *res = g_string_new(NULL);
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
121
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
122 if (LastFMGlobalData->lastfm_session_id == NULL)
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
123 return FALSE;
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
124 snprintf(tmp, sizeof(tmp), LASTFM_ADJUST_URL, LastFMGlobalData->lastfm_session_id, url);
1008
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
125
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
126 status = get_data_from_url(tmp, res);
1008
abda9269e694 [svn] a few cleanups
majeru
parents: 982
diff changeset
127
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
128 #ifdef DEBUG
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
129 g_print("Adjust received data:%s\n", res->str);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
130 #endif
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
131 if (status == CURLE_OK)
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
132 {
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
133 split = g_strsplit(res->str, "\n", 3);
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
134
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
135 for (i = 0; split && split[i]; i++)
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
136 {
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
137 if (g_str_has_prefix(split[i], "response=OK"))
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
138 ret = TRUE;
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
139 if (g_str_has_prefix(split[i], "stationname="))
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
140 {
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
141 LastFMGlobalData->lastfm_station_name = g_strdup(split[i] + 12);
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
142 #ifdef DEBUG
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
143 g_print("StationnName:%s\n", LastFMGlobalData->lastfm_station_name);
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
144 #endif
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
145 }
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
146 }
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
147 g_strfreev(split);
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
148 }
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
149 g_string_erase(res, 0, -1);
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
150
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
151 return ret;
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
152 }
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
153
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
154
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
155 static void parse_metadata(LastFM * handle,GString * res)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
156 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
157 gchar **split = g_strsplit(res->str, "\n", 20);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
158 int i;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
159 for (i = 0; split && split[i]; i++)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
160 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
161 if (g_str_has_prefix(split[i], "artist="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
162 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
163 if (handle->lastfm_artist) g_free(handle->lastfm_artist);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
164 handle->lastfm_artist = g_strdup(split[i] + 7);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
165 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
166 g_print("Artist: %s\n", handle->lastfm_artist);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
167 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
168 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
169 if (g_str_has_prefix(split[i], "track="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
170 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
171 if (handle->lastfm_title) g_free(handle->lastfm_title);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
172 handle->lastfm_title = g_strdup(split[i] + 6);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
173 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
174 g_print("Title: %s\n", handle->lastfm_title);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
175 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
176 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
177
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
178 if (g_str_has_prefix(split[i], "album="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
179 handle->lastfm_album = g_strdup(split[i] + 6);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
180 if (g_str_has_prefix(split[i], "albumcover_medium="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
181 handle->lastfm_cover = g_strdup(split[i] + 18);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
182 if (g_str_has_prefix(split[i], "trackduration="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
183 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
184 handle->lastfm_duration = g_ascii_strtoull(g_strdup(split[i] + 14), NULL, 10);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
185 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
186 g_print("Duration:%d\n", handle->lastfm_duration);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
187 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
188 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
189 if (g_str_has_prefix(split[i], "trackprogress="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
190 handle->lastfm_progress = g_ascii_strtoull(g_strdup(split[i] + 14), NULL, 10);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
191
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
192 if (g_str_has_prefix(split[i], "station="))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
193 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
194 handle->lastfm_station_name = g_strdup(split[i] + 8);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
195 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
196 g_print("Station Name: %s\n", handle->lastfm_station_name);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
197 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
198 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
199 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
200
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
201 g_strfreev(split);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
202 return;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
203 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
204
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
205
1044
b1128efde471 [svn] - get rid of all warnings gcc 4.2.0 emits with my build configuration.
yaz
parents: 1036
diff changeset
206 static gpointer lastfm_get_metadata(gpointer arg)
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
207 {
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
208 int err=0,delay=-2;
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
209
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
210 int sleep_duration,count=0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
211 gint status;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
212 gchar tmp[4096];
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
213 GString *res = g_string_new(NULL);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
214 gboolean track_end=FALSE;
1044
b1128efde471 [svn] - get rid of all warnings gcc 4.2.0 emits with my build configuration.
yaz
parents: 1036
diff changeset
215 LastFM *handle = (LastFM *)arg;
b1128efde471 [svn] - get rid of all warnings gcc 4.2.0 emits with my build configuration.
yaz
parents: 1036
diff changeset
216
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
217 if (handle->lastfm_session_id == NULL)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
218 return NULL;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
219 snprintf(tmp, sizeof(tmp), LASTFM_METADATA_URL, handle->lastfm_session_id);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
220
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
221 while ( (handle!= NULL) && (handle->metadata_thread == g_thread_self ()) && (err<5))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
222 //exit after 5 failed retries or after metadata_thread changes
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
223 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
224 count++;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
225 if (count==sleep_duration)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
226 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
227 handle->lastfm_duration = 0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
228 handle->lastfm_progress = 0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
229 status = get_data_from_url(tmp, res);
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
230 #if 0
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
231 g_print("Received metadata:%s\n", res->str);
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
232 #endif
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
233 if (status == CURLE_OK)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
234 {
1009
f30aaf18916a [svn] added primitive metadata handling (just gets printed in the terminal)
majeru
parents: 1008
diff changeset
235 #ifdef DEBUG
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
236 g_print("Got Metadata\n");
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
237 #endif
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
238 parse_metadata( handle,res);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
239 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
240 g_string_erase(res, 0, -1);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
241
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
242
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
243 if ((!track_end) && (handle->lastfm_duration >0))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
244 { //refresh metadata 2 sec before track's end and 2 sec after the next track starts
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
245 sleep_duration = handle->lastfm_duration - handle->lastfm_progress - delay -4;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
246 track_end=TRUE;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
247 err=delay=count=0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
248 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
249 else
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
250 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
251 err++;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
252 track_end=FALSE;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
253 sleep_duration=4;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
254 count=0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
255 }
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
256
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
257 if(handle->lastfm_duration ==0) //polling every 2 seconds until I get first data
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
258 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
259 sleep_duration=2;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
260 count=0;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
261 delay+=2; //time until I get first data
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
262 //starts from -2 to have uniform handling for in first iteration
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
263 //when calculating sleep_time
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
264 }
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
265
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
266 #ifdef DEBUG
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
267 g_print("Sleeping for %d seconds\n", sleep_duration);
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
268 #endif
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
269 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
270 sleep(1);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
271 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
272
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
273 #ifdef DEBUG
1047
d3eb0884c76c [svn] - suppress warnings.
yaz
parents: 1044
diff changeset
274 g_print("Exiting thread, ID = %p\n", (void *)g_thread_self());
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
275 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
276 handle->metadata_thread = NULL;
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
277 return NULL;
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
278 }
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
279
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
280 VFSFile *lastfm_vfs_fopen_impl(const gchar * path, const gchar * mode)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
281 {
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
282 // static GThread *th;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
283 VFSFile *file;
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
284 LastFM *handle;
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
285 file = g_new0(VFSFile, 1);
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
286 handle = g_new0(LastFM, 1);
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
287 while ((LastFMGlobalData->lastfm_mp3_stream_url == NULL) && (LastFMGlobalData->login_count <= 3))
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
288 {
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
289 printf("Login try count: %d\n", LastFMGlobalData->login_count++);
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
290 lastfm_login();
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
291 if (LastFMGlobalData->lastfm_mp3_stream_url == NULL)
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
292 sleep(5);
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
293 }
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
294
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
295 if (LastFMGlobalData->lastfm_mp3_stream_url == NULL)
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
296 return NULL;
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
297
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
298
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
299 if (LastFMGlobalData->lastfm_station_name==NULL)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
300 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
301 if(lastfm_adjust(path))
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
302 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
303 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
304 g_print("Tuning was successfully completed into the channel\n");
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
305 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
306 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
307 else
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
308 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
309 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
310 g_print("Cannot tune to given channel\n");
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
311 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
312 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
313 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
314
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
315 if ((handle->metadata_thread = g_thread_create(lastfm_get_metadata, handle, FALSE, NULL)) == NULL)
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
316 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
317 #ifdef DEBUG
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
318 g_print("Error creating metadata thread!!!\n");
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
319 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
320 return NULL;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
321 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
322 else
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
323 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
324 #ifdef DEBUG
1047
d3eb0884c76c [svn] - suppress warnings.
yaz
parents: 1044
diff changeset
325 g_print("A metadata thread has just been created, ID = %p \n", (void *)handle->metadata_thread);
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
326 #endif
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
327 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
328
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
329 handle->lastfm_mp3_stream_url = g_strdup(LastFMGlobalData->lastfm_mp3_stream_url);
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
330 handle->lastfm_session_id = g_strdup(LastFMGlobalData->lastfm_session_id);
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
331 handle->lastfm_station_name = g_strdup(LastFMGlobalData->lastfm_station_name);
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
332 handle->proxy_fd = vfs_fopen(handle->lastfm_mp3_stream_url, mode);
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
333 file->handle = handle;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
334
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
335 return file;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
336 }
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
337
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
338 gint lastfm_vfs_fclose_impl(VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
339 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
340 gint ret = 0;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
341
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
342 if (file == NULL)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
343 return -1;
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
344 LastFM *handle = file->handle;
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
345 ret = vfs_fclose(handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
346 if (!ret)
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
347 {
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
348 handle->proxy_fd = NULL;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
349 handle->metadata_thread=NULL;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
350 }
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
351 g_free(handle);
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
352 handle=NULL;
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
353 return ret;
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
354 }
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
355
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
356 size_t lastfm_vfs_fread_impl(gpointer ptr, size_t size, size_t nmemb, VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
357 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
358 LastFM *handle = file->handle;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
359 size_t ret = vfs_fread(ptr, size, nmemb, handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
360 return ret;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
361 }
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
362
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
363 size_t lastfm_vfs_fwrite_impl(gconstpointer ptr, size_t size, size_t nmemb, VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
364 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
365 return -1;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
366 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
367
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
368 gint lastfm_vfs_getc_impl(VFSFile * stream)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
369 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
370 LastFM *handle = stream->handle;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
371 return vfs_getc(handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
372 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
373
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
374 gint lastfm_vfs_ungetc_impl(gint c, VFSFile * stream)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
375 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
376 LastFM *handle = stream->handle;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
377
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
378 return vfs_ungetc(c, handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
379 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
380
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
381 gint lastfm_vfs_fseek_impl(VFSFile * file, glong offset, gint whence)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
382 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
383 return -1;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
384 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
385
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
386 void lastfm_vfs_rewind_impl(VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
387 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
388 return;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
389 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
390
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
391 glong lastfm_vfs_ftell_impl(VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
392 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
393 LastFM *handle = file->handle;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
394
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
395 return vfs_ftell(handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
396 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
397
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
398 gboolean lastfm_vfs_feof_impl(VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
399 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
400 LastFM *handle = file->handle;
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
401
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
402 return vfs_feof(handle->proxy_fd);
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
403 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
404
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
405 gint lastfm_vfs_truncate_impl(VFSFile * file, glong size)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
406 {
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
407 return -1;
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
408 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
409
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
410 off_t lastfm_vfs_fsize_impl(VFSFile * file)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
411 {
1017
2f0b7056f354 [svn] - returning -1 is invalid here for fsize(). make metadata display in Audacious.
nenolod
parents: 1016
diff changeset
412 return 0;
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
413 }
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
414
1014
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
415 gchar *lastfm_vfs_metadata_impl(VFSFile * file, const gchar * field)
af586df84c9b [svn] - lets avoid spawning >1 threads for metadata
nenolod
parents: 1013
diff changeset
416 {
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
417 LastFM *handle = file->handle;
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
418
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
419 #if 0
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
420 g_print("Interesting metadata (want: %s):\n", field);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
421
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
422 if (handle->lastfm_station_name != NULL)
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
423 g_print("%s\n", handle->lastfm_station_name);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
424
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
425 if (handle->lastfm_artist != NULL)
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
426 g_print("%s\n", handle->lastfm_artist);
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
427
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
428
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
429 if (handle->lastfm_title != NULL)
1010
8bad1b46ef78 [svn] - make this compile again and indent properly
nenolod
parents: 1009
diff changeset
430 g_print("%s\n", handle->lastfm_title);
978
3513bc2fd738 [svn] got the metadata but couldnt make use of it yet
majeru
parents: 976
diff changeset
431
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
432 g_print("%u\n\n", handle->lastfm_duration);
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
433 #endif
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
434
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
435 if (!g_ascii_strncasecmp(field, "stream-name", 11) && (handle->lastfm_station_name != NULL))
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
436 return g_strdup(handle->lastfm_station_name);
1013
177d47add6dd [svn] lastfn's metadata seems to wotk, but still it has some glitches
majeru
parents: 1010
diff changeset
437 if (!g_ascii_strncasecmp(field, "track-name", 10) && (handle->lastfm_title != NULL) && (handle->lastfm_artist != NULL))
979
e31c4566feb6 [svn] - disable all use of puts() unless -DDEBUG is defined.
nenolod
parents: 978
diff changeset
438 return g_strdup_printf("%s - %s", handle->lastfm_artist, handle->lastfm_title);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
439
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
440 return NULL;
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
441 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
442
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
443 VFSConstructor lastfm_const = {
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
444 "lastfm://",
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
445 lastfm_vfs_fopen_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
446 lastfm_vfs_fclose_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
447 lastfm_vfs_fread_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
448 lastfm_vfs_fwrite_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
449 lastfm_vfs_getc_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
450 lastfm_vfs_ungetc_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
451 lastfm_vfs_fseek_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
452 lastfm_vfs_rewind_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
453 lastfm_vfs_ftell_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
454 lastfm_vfs_feof_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
455 lastfm_vfs_truncate_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
456 lastfm_vfs_fsize_impl,
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
457 lastfm_vfs_metadata_impl
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
458 };
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
459
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
460 static void init(void)
1036
47db8268cb7b [svn] smarter polling and lots of other changes
majeru
parents: 1018
diff changeset
461 {
975
8bdd0d76a0ca [svn] New release by majeru.
chainsaw
parents: 972
diff changeset
462 LastFMGlobalData = g_new0(LastFM, 1);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
463 vfs_register_transport(&lastfm_const);
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
464 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
465
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
466 static void cleanup(void)
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
467 {
976
c1bda49a5039 [svn] - fix indentation
nenolod
parents: 975
diff changeset
468 g_free(LastFMGlobalData);
972
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
469 }
cf7021ca4e7b [svn] Add lastfm:// transport, an abstract VFS class which derives from curl
nenolod
parents:
diff changeset
470
1182
8df9aab3897e [svn] - Bleh, squash the evil warning! Must compile without warnings!
nazca
parents: 1161
diff changeset
471 DECLARE_PLUGIN(lastfm, init, cleanup, NULL, NULL, NULL, NULL, NULL)