from itemcollections import ItemList, ItemLeaf import urlparse, os try: urlparse.uses_netloc.append('daap') urlparse.uses_relative.append('daap') except: pass class BansheeImporter(object): def all(self): import sqlite3 con = sqlite3.connect('/home/aquarius/.config/banshee-1/banshee.db') crs = con.cursor() media = ItemList("media", has_all_option=False) music = ItemList("Music", has_all_option=False) media.append(music) crs.execute("select t.uri, t.title, a.name, al.title from coretracks t inner join coreartists a on t.artistid = a.artistid inner join corealbums al on al.albumid=t.albumid inner join coreprimarysources p on t.PrimarySourceID = p.PrimarySourceID and p.stringid like 'Music%' order by a.name, al.title, t.tracknumber") byartist = ItemList("By artist", serve_sorted=True, has_all_option=False) music.append(byartist) allsongs = ItemList("All songs", serve_sorted=True) music.append(allsongs) current_artist = None current_album = None for relative_uri, song, artist, album in crs: uri = "file:///home/aquarius/.gvfs/sftp on tara.local/home/aquarius/Music/" + relative_uri if artist != current_artist: current_artist = artist artist_itemlist = ItemList(artist, serve_sorted=True, has_all_option=False) byartist.append(artist_itemlist) allsongs_album_itemlist = ItemList("All songs", serve_sorted=True) artist_itemlist.append(allsongs_album_itemlist) current_album = None if album != current_album: current_album = album album_itemlist = ItemList(album) artist_itemlist.append(album_itemlist) song_itemleaf = ItemLeaf(song, uri) album_itemlist.append(song_itemleaf) song_itemleaf2 = ItemLeaf(song, uri, artist) allsongs.append(song_itemleaf2) song_itemleaf3 = ItemLeaf(song, uri) allsongs_album_itemlist.append(song_itemleaf3) playlists = ItemList("Playlists", serve_sorted=True, has_all_option=False) music.append(playlists) crs.execute("select p.name, t.title, t.uri, a.name from coresmartplaylists p inner join coresmartplaylistentries e on p.smartplaylistid = e.smartplaylistid inner join coretracks t on e.trackid = t.trackid inner join coreartists a on t.artistid = a.artistid inner join coreprimarysources ps on t.PrimarySourceID = ps.PrimarySourceID and ps2.stringid like 'Music%'") current_playlist = None for playlist, song, relative_uri, artist in crs: uri = "file:///home/aquarius/.gvfs/sftp on tara.local/home/aquarius/Music/" + relative_uri if playlist != current_playlist: current_playlist = playlist playlist_itemlist = ItemList(playlist) playlists.append(playlist_itemlist) song_itemleaf = ItemLeaf("%s - %s" % (song, artist), uri) playlist_itemlist.append(song_itemleaf) crs.execute("select t.title, t.uri from coretracks t inner join coreprimarysources p on t.PrimarySourceID = p.PrimarySourceID and p.stringid like 'Video%'") videos = ItemList("Videos", serve_sorted=True, has_all_option=False) media.append(videos) for title, relative_uri in crs: if relative_uri.startswith("file:"): uri = relative_uri else: uri = "file:///home/aquarius/.gvfs/sftp on tara.local/home/aquarius/Videos/" + relative_uri itemleaf = ItemLeaf("%s" % (title), uri) videos.append(itemleaf) crs.close() con.close() return media class DAAPImporter(object): def __init__(self, server): "You have to specify a server; Avahi browsing is for later" self.server = server def all(self): import daap c=daap.DAAPClient() c.connect(self.server) session=c.login() self.base_url = "daap://%s:3689/" % self.server server_name = c.request('/server-info').getAtom('minm') media = ItemList(server_name, has_all_option=False) music = ItemList("Music", has_all_option=False) media.append(music) self.byartist = ItemList("By artist", serve_sorted=True, has_all_option=False) music.append(self.byartist) self.allsongs = ItemList("All songs", serve_sorted=True) music.append(self.allsongs) self.videos = ItemList("Videos", serve_sorted=True, has_all_option=False) media.append(self.videos) self.ils = {} MUSIC_TYPES = ['mp3', 'm4a'] VIDEO_TYPES = ['avi', 'ogv'] for track in session.library().tracks(): if track.type in MUSIC_TYPES: self.add_music_track(track) elif track.type in VIDEO_TYPES: self.add_video_track(track) else: print "Unrecognised type ", track.type ilplaylists = ItemList("Playlists", serve_sorted=True, has_all_option=False) music.append(ilplaylists) for playlist in session.library().playlists(): ilplaylist = ItemList(playlist.name, serve_sorted=False, has_all_option=True) ilplaylists.append(ilplaylist) for track in playlist.tracks(): track_url = '/databases/%s/items/%s.%s' % (track.database.id, track.id, track.type) url = urlparse.urljoin(self.base_url, track_url) artist, title, album = track.artist, track.name, track.album if not artist: artist = "Unknown" if not title: title = "Unknown" if not album: album = "Unknown" leaf = ItemLeaf(title, url, subtext=artist) ilplaylist.append(leaf) session.logout() c.socket.close() return media def add_video_track(self, track): title = os.path.splitext(track.name)[0] track_url = '/databases/%s/items/%s.%s' % (track.database.id, track.id, track.type) url = urlparse.urljoin(self.base_url, track_url) leaf = ItemLeaf(title, url) self.videos.append(leaf) def add_music_track(self, track): artist, title, album = track.artist, track.name, track.album if not artist: artist = "Unknown" if not title: title = "Unknown" if not album: album = "Unknown" track_url = '/databases/%s/items/%s.%s' % (track.database.id, track.id, track.type) url = urlparse.urljoin(self.base_url, track_url) ilartistcollection = self.ils.get(artist, None) if ilartistcollection: ilallsongs = ilartistcollection["All songs"] ilartist = ilartistcollection["_ARTIST_RECORD"] else: ilartistcollection = {} self.ils[artist] = ilartistcollection ilallsongs = ItemList("All songs", serve_sorted=True, has_all_option=True) ilartistcollection["All songs"] = ilallsongs ilartist = ItemList(artist, serve_sorted=True, has_all_option=True) ilartistcollection["_ARTIST_RECORD"] = ilartist ilartist.append(ilallsongs) self.byartist.append(ilartist) ilalbum = ilartistcollection.get(album, None) if not ilalbum: ilalbum = ItemList(album, serve_sorted=False, has_all_option=True) ilartistcollection[album] = ilalbum ilartist.append(ilalbum) leaf = ItemLeaf(title, url) ilalbum.append(leaf) leaf = ItemLeaf(title, url) ilallsongs.append(leaf) leaf = ItemLeaf(title, url, subtext=artist) self.allsongs.append(leaf) class PickleImporter(object): def __init__(self, audio_folder, video_folder): self.audio_folder = audio_folder self.video_folder = video_folder def all(self): import pickle, urllib media = ItemList("Media", has_all_option=False) music = ItemList("Music", has_all_option=False) media.append(music) self.byartist = ItemList("By artist", serve_sorted=True, has_all_option=False) music.append(self.byartist) self.allsongs = ItemList("All songs", serve_sorted=True) music.append(self.allsongs) path = os.path.join(self.audio_folder, "mediamenu.pickle") fp = open(path) tracks = pickle.load(fp) fp.close() self.ils = {} for fn in tracks.keys(): artist, title, album = tracks[fn]['artist'], tracks[fn]['title'], tracks[fn]['album'] url = "file://%s" % urllib.quote(os.path.realpath(os.path.join(self.audio_folder, fn))) if not artist: artist = "Unknown" if not title: title = "Unknown" if not album: album = "Unknown" ilartistcollection = self.ils.get(artist, None) if ilartistcollection: ilallsongs = ilartistcollection["All songs"] ilartist = ilartistcollection["_ARTIST_RECORD"] else: ilartistcollection = {} self.ils[artist] = ilartistcollection ilallsongs = ItemList("All songs", serve_sorted=True, has_all_option=True) ilartistcollection["All songs"] = ilallsongs ilartist = ItemList(artist, serve_sorted=True, has_all_option=True) ilartistcollection["_ARTIST_RECORD"] = ilartist ilartist.append(ilallsongs) self.byartist.append(ilartist) ilalbum = ilartistcollection.get(album, None) if not ilalbum: ilalbum = ItemList(album, serve_sorted=False, has_all_option=True) ilartistcollection[album] = ilalbum ilartist.append(ilalbum) leaf = ItemLeaf(title, url) ilalbum.append(leaf) leaf = ItemLeaf(title, url) ilallsongs.append(leaf) leaf = ItemLeaf(title, url, subtext=artist) self.allsongs.append(leaf) self.videos = ItemList("Videos", serve_sorted=True, has_all_option=False) media.append(self.videos) path = os.path.join(self.video_folder, "mediamenu.pickle") fp = open(path) videos = pickle.load(fp) fp.close() self.ils = {} for fn in videos.keys(): url = "file://%s" % urllib.quote(os.path.realpath(os.path.join(self.video_folder, fn))) leaf = ItemLeaf(videos[fn]['title'], url) self.videos.append(leaf) return media