summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJorg Schuler <jcsjcs@users.sourceforge.net>2005-09-27 13:17:46 +0000
committerJorg Schuler <jcsjcs@users.sourceforge.net>2005-09-27 13:17:46 +0000
commitf52d5020d12e1473e86f5bb9a95d367f3e4b914b (patch)
treedbd7fbdcf5cddc7993c50bf9677551696eb7adad
parent5d38cbffd827dd36c7e7f91580ec31da9ebaf92d (diff)
downloadlibgpod-tmz-f52d5020d12e1473e86f5bb9a95d367f3e4b914b.tar.gz
libgpod-tmz-f52d5020d12e1473e86f5bb9a95d367f3e4b914b.tar.xz
libgpod-tmz-f52d5020d12e1473e86f5bb9a95d367f3e4b914b.zip
* itdb.h, itdb_itunesdb.c, itdb_private.h: moved next_id from
Itdb_iTunesDB to FExport. * bindings/phython/examples/tag-genrr-from-audioscrobber.py: added (thanks to Nicholas Piper) git-svn-id: https://gtkpod.svn.sf.net/svnroot/gtkpod/libgpod/trunk@1104 f01d2545-417e-4e96-918e-98f8d0dbbcb6
-rw-r--r--ChangeLog10
-rwxr-xr-xbindings/python/examples/play.py (renamed from bindings/python/play.py)0
-rwxr-xr-xbindings/python/examples/tag-genre-from-audioscrobber.py56
-rw-r--r--src/itdb.h3
-rw-r--r--src/itdb_itunesdb.c26
-rw-r--r--src/itdb_private.h3
6 files changed, 83 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 8d7e3a6..479d000 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-09-27 Jorg Schuler <jcsjcs at users.sourceforge.net>
+
+ * itdb.h, itdb_itunesdb.c, itdb_private.h: moved next_id from
+ Itdb_iTunesDB to FExport.
+
+ * bindings/phython/examples/tag-genrr-from-audioscrobber.py: added
+ (thanks to Nicholas Piper)
+
2005-09-27 Christophe Fergeau <teuf@gnome.org>
* src/itdb_itunesdb.c: (write_mhsd_tracks), (write_playlist_mhips),
@@ -21,6 +29,8 @@
* itdb_playlist.c: set timestamp when creating playlist, set
timestamp when adding playlist and no timestamp was set.
+ * Release of version 0.1.6
+
2005-09-23 Jorg Schuler <jcsjcs at users.sourceforge.net>
* bindings/: added python bindings provided by Nicholas Piper
diff --git a/bindings/python/play.py b/bindings/python/examples/play.py
index 6ad6f60..6ad6f60 100755
--- a/bindings/python/play.py
+++ b/bindings/python/examples/play.py
diff --git a/bindings/python/examples/tag-genre-from-audioscrobber.py b/bindings/python/examples/tag-genre-from-audioscrobber.py
new file mode 100755
index 0000000..4a16fb7
--- /dev/null
+++ b/bindings/python/examples/tag-genre-from-audioscrobber.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+import os, os.path
+import gpod
+import sys
+from xml import xpath
+from xml.dom import minidom
+from xml.parsers.expat import ExpatError
+import urllib2, urllib
+
+TRUST_LIMIT = 10
+dbname = os.path.join(os.environ['HOME'],".gtkpod/local_0.itdb")
+
+
+itdb = gpod.itdb_parse_file(dbname, None)
+if not itdb:
+ print "Failed to read %s" % dbname
+ sys.exit(2)
+
+cache={}
+for track in gpod.sw_get_tracks(itdb):
+ if track.artist is None:
+ continue
+
+ key = track.artist.upper()
+ if not cache.has_key(key):
+ url = "http://ws.audioscrobbler.com/1.0/artist/%s/toptags.xml" % urllib.quote(track.artist)
+
+ try:
+ reply = urllib2.urlopen(url).read()
+ xmlreply = minidom.parseString(reply)
+ attlist = xpath.Evaluate("//toptags/tag[1]/@name",xmlreply)
+ count = xpath.Evaluate("//toptags/tag[1]/@count",xmlreply)
+ if attlist and count and int(count[0].value) > TRUST_LIMIT:
+ cache[key] = str(attlist[0].value.title()) # no unicode please :-)
+ except urllib2.HTTPError, e:
+ pass
+ #print "Urllib failed.", e
+ except ExpatError, e:
+ print "Failed to parse,", e
+ print reply
+
+ if cache.has_key(key):
+ track.genre = cache[key]
+ print "%-25s %-20s %-20s --> %s" % (track.title,
+ track.album,
+ track.artist,
+ track.genre)
+ else:
+ print "%-25s %-20s %-20s === %s" % (track.title,
+ track.album,
+ track.artist,
+ track.genre)
+
+
+gpod.itdb_write_file(itdb, dbname, None)
diff --git a/src/itdb.h b/src/itdb.h
index 59385ac..e01eadc 100644
--- a/src/itdb.h
+++ b/src/itdb.h
@@ -1,4 +1,4 @@
-/* Time-stamp: <2005-09-24 12:59:15 jcs>
+/* Time-stamp: <2005-09-26 22:36:42 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -356,7 +356,6 @@ typedef struct
gint musicdirs; /* number of /iPod_Control/Music/F.. dirs */
guint32 version;
guint64 id;
- guint32 next_id; /* strictly internal during itdb write */
/* below is for use by application */
guint64 usertype;
gpointer userdata;
diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
index d853d67..9616030 100644
--- a/src/itdb_itunesdb.c
+++ b/src/itdb_itunesdb.c
@@ -1,4 +1,4 @@
-/* Time-stamp: <2005-09-24 13:25:33 jcs>
+/* Time-stamp: <2005-09-26 22:40:51 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -3194,7 +3194,7 @@ static gboolean write_podcast_mhips (FExport *fexp,
itdb = fexp->itdb;
mhip_seek = cts->pos;
- groupid = itdb->next_id++;
+ groupid = fexp->next_id++;
mk_mhip (fexp, 1, 256, groupid, 0, 0, 0);
mk_mhod (cts, MHOD_ID_TITLE, album);
fix_header (cts, mhip_seek);
@@ -3208,7 +3208,7 @@ static gboolean write_podcast_mhips (FExport *fexp,
g_return_if_fail (track);
mhip_seek = cts->pos;
- mhip_id = itdb->next_id++;
+ mhip_id = fexp->next_id++;
mk_mhip (fexp, 1, 0, mhip_id, track->id, 0, groupid);
mk_mhod (cts, MHOD_ID_PLAYLIST, (void *)mhip_id);
fix_header (cts, mhip_seek);
@@ -3432,12 +3432,14 @@ static void wcontents_free (WContents *cts)
/* reassign the iPod IDs and make sure the itdb->tracks are in the
same order as the mpl */
-static void reassign_ids (Itdb_iTunesDB *itdb)
+static void reassign_ids (FExport *fexp)
{
- guint32 id = 52;
GList *gl;
+ Itdb_iTunesDB *itdb;
Itdb_Playlist *mpl;
+ g_return_if_fail (fexp);
+ itdb = fexp->itdb;
g_return_if_fail (itdb);
/* Arrange itdb->tracks in the same order as mpl->members
@@ -3459,15 +3461,15 @@ static void reassign_ids (Itdb_iTunesDB *itdb)
itdb->tracks = g_list_prepend (itdb->tracks, track);
}
+ fexp->next_id = 52;
+
/* assign unique IDs */
for (gl=itdb->tracks; gl; gl=gl->next)
{
Itdb_Track *track = gl->data;
g_return_if_fail (track);
- track->id = id++;
+ track->id = fexp->next_id++;
}
-
- itdb->next_id = id;
}
@@ -3487,13 +3489,13 @@ gboolean itdb_write_file (Itdb_iTunesDB *itdb, const gchar *filename,
if (!filename) filename = itdb->filename;
- reassign_ids (itdb);
-
fexp = g_new0 (FExport, 1);
fexp->itdb = itdb;
fexp->itunesdb = wcontents_new (filename);
cts = fexp->itunesdb;
+ reassign_ids (fexp);
+
mk_mhbd (fexp, 3); /* three mhsds */
/* write tracklist */
if (write_mhsd_tracks (fexp))
@@ -3800,13 +3802,13 @@ gboolean itdb_shuffle_write_file (Itdb_iTunesDB *itdb,
g_return_val_if_fail (itdb, FALSE);
g_return_val_if_fail (filename, FALSE);
- reassign_ids (itdb);
-
fexp = g_new0 (FExport, 1);
fexp->itdb = itdb;
fexp->itunesdb = wcontents_new (filename);
cts = fexp->itunesdb;
+ reassign_ids (fexp);
+
put24bint (cts, itdb_tracks_number (itdb));
put24bint (cts, 0x010600);
put24bint (cts, 0x12); /* size of header */
diff --git a/src/itdb_private.h b/src/itdb_private.h
index 903f4cd..3e6235e 100644
--- a/src/itdb_private.h
+++ b/src/itdb_private.h
@@ -1,4 +1,4 @@
-/* Time-stamp: <2005-09-23 23:53:25 jcs>
+/* Time-stamp: <2005-09-26 22:40:20 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -96,6 +96,7 @@ typedef struct
{
Itdb_iTunesDB *itdb;
WContents *itunesdb;
+ guint32 next_id; /* next free ID to use */
GError *error; /* where to report errors to */
} FExport;