From f52d5020d12e1473e86f5bb9a95d367f3e4b914b Mon Sep 17 00:00:00 2001 From: Jorg Schuler Date: Tue, 27 Sep 2005 13:17:46 +0000 Subject: * 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 --- ChangeLog | 10 ++++ bindings/python/examples/play.py | 44 +++++++++++++++++ .../examples/tag-genre-from-audioscrobber.py | 56 ++++++++++++++++++++++ bindings/python/play.py | 44 ----------------- src/itdb.h | 3 +- src/itdb_itunesdb.c | 26 +++++----- src/itdb_private.h | 3 +- 7 files changed, 127 insertions(+), 59 deletions(-) create mode 100755 bindings/python/examples/play.py create mode 100755 bindings/python/examples/tag-genre-from-audioscrobber.py delete mode 100755 bindings/python/play.py diff --git a/ChangeLog b/ChangeLog index 8d7e3a6..479d000 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-09-27 Jorg Schuler + + * 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 * 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 * bindings/: added python bindings provided by Nicholas Piper diff --git a/bindings/python/examples/play.py b/bindings/python/examples/play.py new file mode 100755 index 0000000..6ad6f60 --- /dev/null +++ b/bindings/python/examples/play.py @@ -0,0 +1,44 @@ +#!/usr/bin/python + +import os, os.path +import gpod +import sys + +ipod_mount = '/mnt/ipod' + +remove_track = "The Dancer" + +#dbname = os.path.join(os.environ['HOME'],".gtkpod/iTunesDB") +dbname = os.path.join(ipod_mount,"iPod_Control/iTunes/iTunesDB") + +itdb = gpod.itdb_parse_file(dbname, None) +if not itdb: + print "Failed to read %s" % dbname + sys.exit(2) +itdb.mountpoint = ipod_mount + + +for track in gpod.sw_get_tracks(itdb): + lists = [] + for playlist in gpod.sw_get_playlists(itdb): + if gpod.itdb_playlist_contains_track(playlist, track): + lists.append(playlist) + + print "%-25s %-20s %-20s %-30s %s" % (track.title, + track.album, + track.artist, + gpod.itdb_filename_on_ipod(track), + repr(",".join([l.name for l in lists]))) + + if track.title == remove_track: + print "Removing track.." + print "..disk" + os.unlink(gpod.itdb_filename_on_ipod(track)) + for l in lists: + print "..playlist %s" % l.name + gpod.itdb_playlist_remove_track(l, track) + print "..db" + gpod.itdb_track_unlink(track) + print "Track removed." + +gpod.itdb_write_file(itdb, dbname, None) 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/bindings/python/play.py b/bindings/python/play.py deleted file mode 100755 index 6ad6f60..0000000 --- a/bindings/python/play.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python - -import os, os.path -import gpod -import sys - -ipod_mount = '/mnt/ipod' - -remove_track = "The Dancer" - -#dbname = os.path.join(os.environ['HOME'],".gtkpod/iTunesDB") -dbname = os.path.join(ipod_mount,"iPod_Control/iTunes/iTunesDB") - -itdb = gpod.itdb_parse_file(dbname, None) -if not itdb: - print "Failed to read %s" % dbname - sys.exit(2) -itdb.mountpoint = ipod_mount - - -for track in gpod.sw_get_tracks(itdb): - lists = [] - for playlist in gpod.sw_get_playlists(itdb): - if gpod.itdb_playlist_contains_track(playlist, track): - lists.append(playlist) - - print "%-25s %-20s %-20s %-30s %s" % (track.title, - track.album, - track.artist, - gpod.itdb_filename_on_ipod(track), - repr(",".join([l.name for l in lists]))) - - if track.title == remove_track: - print "Removing track.." - print "..disk" - os.unlink(gpod.itdb_filename_on_ipod(track)) - for l in lists: - print "..playlist %s" % l.name - gpod.itdb_playlist_remove_track(l, track) - print "..db" - gpod.itdb_track_unlink(track) - print "Track removed." - -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 | 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 | 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 | 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; -- cgit