Skip to content

Commit

Permalink
added lazy loading of metadata from sc
Browse files Browse the repository at this point in the history
  • Loading branch information
wendlers committed Sep 20, 2012
1 parent 61b074e commit 081f585
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 61 deletions.
14 changes: 7 additions & 7 deletions src/pyscmpd.py
Expand Up @@ -36,15 +36,15 @@
logging.basicConfig(level=logging.INFO)

# TODO: do not hardcode root :-)
ROOT_USERS = [
"/users/griz",
"/users/betamaxx",
"/users/freudeamtanzen",
"/users/barelylegit",
"/users/maddecent"
favorites = [
"griz",
"betamaxx",
"freudeamtanzen",
"barelylegit",
"maddecent"
]

mpd = scmpd.ScMpdServerDaemon(ROOT_USERS)
mpd = scmpd.ScMpdServerDaemon(favorites)

mainloop = gobject.MainLoop()
mainloop.run()
Expand Down
8 changes: 5 additions & 3 deletions src/pyscmpd/resource.py
Expand Up @@ -100,7 +100,9 @@ def getChild(self, resourceId):

def getChildByName(self, name):

for c in self.children:
children = self.getAllChildren()

for c in children:
if c.getName() == name:
return c

Expand All @@ -124,8 +126,8 @@ def getType(self):

def __str__(self):

return ("%s [id=%s; location=%s; type=%d, meta=%s, #children=%d]" %
(self.name, self.id, self.location, self.getType(), self.meta, len(self.children)))
return ("%s [id=%s; location=%s; type=%d, meta=%s]" %
(self.name, self.id, self.location, self.getType(), self.meta))


class FileResource(Resource):
Expand Down
7 changes: 4 additions & 3 deletions src/pyscmpd/scmpd.py
Expand Up @@ -34,12 +34,12 @@ class ScMpdServerDaemon(mpdserver.MpdServerDaemon):
scroot = None
player = None

def __init__(self, rootUsers, serverPort = 9900):
def __init__(self, favorites, serverPort = 9900):

provider.ResourceProvider.ROOT_USERS = rootUsers
provider.ResourceProvider.favorites = favorites

ScMpdServerDaemon.player = gstplayer.GstPlayer()
ScMpdServerDaemon.scp = provider.ResourceProvider(True)
ScMpdServerDaemon.scp = provider.ResourceProvider()
ScMpdServerDaemon.scroot = ScMpdServerDaemon.scp.getRoot()

mpdserver.MpdServerDaemon.__init__(self, serverPort)
Expand Down Expand Up @@ -158,6 +158,7 @@ def items(self):
r = ScMpdServerDaemon.scroot.getAllChildren()
else:
r = ScMpdServerDaemon.scroot.getChildByName(self.directory)
logging.info("Found: %s" % r.__str__())
path = r.getName()

if r == None:
Expand Down
123 changes: 75 additions & 48 deletions src/pyscmpd/scprovider.py
Expand Up @@ -27,51 +27,116 @@

import pyscmpd.resource as resource

class ResourceProvider:

favorites = None
sc = None
root = None

def __init__(self):

ResourceProvider.sc = soundcloud.Client(client_id='aa13bebc2d26491f7f8d1e77ae996a64')

self.root = Root(1, "http://www.soundcloud.com")

def getRoot(self):

return self.root

class CatRoot(resource.DirectoryResource):

def __init__(self, resourceId, resourceLocation):

resource.DirectoryResource.__init__(self, resourceId, resourceLocation, "Soundcloud Users")

catAll = Category(2, "all", "all")
catAll.setMeta({"directory" : "all"})

catFav = Category(3, "favorites", "favorites")
catFav.setMeta({"directory" : "favorites"})
catFav.addChild(UserRoot(4, "http://www.soundcloud.com/users"))

self.addChild(catAll)
self.addChild(catFav)

class Category(resource.DirectoryResource):

pass

class Root(resource.DirectoryResource):

def __init__(self, resourceId, resourceLocation):

resource.DirectoryResource.__init__(self, resourceId, resourceLocation, "Soundcloud Users")

for uri in ResourceProvider.ROOT_USERS:
self.children = None

def getAllChildren(self):

if self.children == None:
self.retriveChildren()

return self.children

def retriveChildren(self):

self.children = []

for uri in ResourceProvider.favorites:

try:
user = ResourceProvider.sc.get(uri)
user = ResourceProvider.sc.get("/users/" + uri)
u = User(user.id, user.uri, user.permalink, user.username)
u.setMeta({"directory" : user.permalink})
self.addChild(u)
logging.debug("successfully retrieved data for URI %s: id=%d; name=%s" % (uri, user.id, user.permalink))
logging.info("successfully retrieved data for URI %s: id=%d; name=%s" %
(uri, user.id, user.permalink))
except Exception as e:
logging.warn("Unable to retrive data for URI %s" % uri)


class User(resource.DirectoryResource):

artist = None

def __init__(self, resourceId, resourceLocation, name, artist):

self.artist = artist

resource.DirectoryResource.__init__(self, resourceId, resourceLocation, name)

# TODO: do not load in advance, but use lazy loading when first call to "getAllChildren" is made
self.children = None

def getAllChildren(self):

if self.children == None:
self.retriveChildren()

return self.children

def retriveChildren(self):

self.children = []

try:
logging.debug("Trying to get tracks for user [%s]" % name)
logging.debug("Trying to get tracks for user [%s] with uri [%s]" % (self.name, self.location))
tracks = ResourceProvider.sc.get(self.location + "/tracks")

for track in tracks:
tr = Track(track.id, track.stream_url, track.permalink)
tr.setMeta({
"file" : name + "/" + track.permalink,
"Artist" : artist,
"file" : self.name + "/" + track.permalink,
"Artist" : self.artist,
"Title" : track.title,
"Time" : track.duration})
self.addChild(tr)
logging.debug("Added tracki to user [%s]: %s" % (self.getName(), tr.__str__()))

logging.debug("Added tracki to use [%s]: %s" % (self.getName(), tr.__str__()))

except Exception as e:
logging.warn("Unable to retrive tracks for [%s]" % self.getName())

logging.info("successfully retrieved %d tracks for user [%s]" % (len(self.children), self.getName()))


class Track(resource.FileResource):

def getStreamUri(self):
Expand All @@ -80,41 +145,3 @@ def getStreamUri(self):
logging.debug("Stream url for URI %s is %s" % (self.location, stream_url.location))
return stream_url.location


class ResourceProvider:

ROOT_USERS = None

sc = None
root = None

def __init__(self, useCache = False, cacheFile = "scroot.cache"):

ResourceProvider.sc = soundcloud.Client(client_id='aa13bebc2d26491f7f8d1e77ae996a64')

if useCache:

try:
f = open(cacheFile, 'rb')
self.root = pickle.load(f)
f.close()
logging.info("Cache file [%s] read" % cacheFile)
return
except:
logging.warn("Unable to read cache file [%s], creating new" % cacheFile)


self.root = Root(1, "http://www.soundcloud.com")

try:
f = open(cacheFile, 'wb')
pickle.dump(self.root, f)
f.close()
logging.info("Cache file [%s] written" % cacheFile)
except:
logging.warn("Unable to write cache file [%s]" % cacheFile)


def getRoot(self):

return self.root

0 comments on commit 081f585

Please sign in to comment.