class DAAPresolver: def __init__(self, host, port): self.host = host self.port = port self.client = DAAPClient() self.client.connect(host, port) logger.info("Connected to %s:%s"%(host,port)) self.session = self.client.login() databases = self.session.databases() for d in databases: if str(d.id) == str(self.session.library().id): self.database = d self.tracks = self.database.tracks() logger.info("Got %s tracks"%len(self.tracks)) def fulltext(self, search): #TODO : more effective search maybe? words = search.split() pattern = '(%s)'%('|'.join(words)) founds = [] logger.info('Searching %s in %d tracks'%(search, len(self.tracks))) for t in self.tracks: if len(re.findall(pattern, "%s %s %s"%(t.artist, t.album, t.name))) == len(words): found = dict() found["artist"] = t.artist found["track"] = t.name found["album"] = t.album if isinstance(t.time, int): found["duration"] = int(t.time/1000) found["url"] = 'http://%s:%s/databases/%d/items/%d.mp3?session-id=%s'%(self.host, self.port, self.database.id, t.id, self.session.sessionid) found["score"] = 1 #found["source"] = 'DAAP' founds.append(found) logger.info('Found %d tracks'%len(founds)) return founds def artistandtrack(self, artist, track): #TODO : more effective search maybe? founds = [] logger.info('Searching %s - %s in %d tracks'%(artist, track, len(self.tracks))) for t in self.tracks: if re.search("%s"%artist, "%s"%t.artist, re.IGNORECASE ) and re.search("%s"%track, "%s"%t.name, re.IGNORECASE ): found = dict() found["artist"] = t.artist found["track"] = t.name found["album"] = t.album if isinstance(t.time, int): found["duration"] = int(t.time/1000) found["url"] = 'http://%s:%s/databases/%d/items/%d.mp3?session-id=%s'%(self.host, self.port, self.database.id, t.id, self.session.sessionid) found["score"] = 1 #found["source"] = 'DAAP' founds.append(found) logger.info('Found %d tracks'%len(founds)) return founds
def _add_thread(self, ip, port): sd = self.DaapData() nc = DAAPClient() try: self._log.debug("Trying to connect to %s : %s", ip, port) nc.connect(ip, port) except Exception, e: self._log.exception("Could not connect to %s:%s - %s", ip, port, e) return
def _get_playlists(key): """ Returns all playlist objects of the first database of server with id in param key """ client = DAAPClient() server = ui_state['servers'][key]['address'] port = ui_state['servers'][key]['port'] client.connect(server, port) session = client.login() database = session.databases()[0] playlists = database.playlists() return playlists
def do_connect(self, spec): if len(spec) == 0: server = "localhost" port = 3689 elif spec.count(" ") == 0: server = spec port = 3689 elif spec.count(" ") == 1: (server, port) = spec.split(" ") else: return client = DAAPClient() client.connect(server, port) self.session = client.login() self.do_database( self.session.library().id )
class DAAPProxy(object): def __init__( self, host, port=3689): self.host=host self.port=port self.client=DAAPClient() self.client.connect( host, port) self.session=self.client.login() self.databases=self.session.databases() libid=self.session.library().id self.database=None for d in self.databases: if str( d.id) == str( id): self.database=d if self.database is None: self.database=d self.tracks=self.database.tracks() def generate_url( self, track): return 'http://%s:%d/databases/%d/items/%d.%s?session-id=%d' % ( self.host, self.port, self.database.id, track.id, track.type, self.session.sessionid ) def print_rss( self, file=sys.stdout): file.write( '<?xml version="1.0"?>\n') file.write( '<rss version="2.0">\n') file.write( '<channel>\n') file.write( '<title>%s (daap)</title>\n' % ( self.host )) file.write( '<description>Live RSS feed generated by DAAP-Proxy.</description>\n') file.write( '<link>http://%s:%s/</link>\n' % ( self.host, self.port )) for t in self.tracks: try: name=ascii( '%s - %s' % ( t.artist, t.name )) except: name='%s - %s' % ( repr( t.artist), repr( t.name) ) file.write( '<item>\n') file.write( '<title>%s</title>\n' % ( name )) file.write( '<description>%s</description>\n' % ( name )) file.write( '<enclosure url="%s" length="0" type="audio/mpeg"/>\n' % ( self.generate_url( t) )) file.write( '</item>\n') file.write( '</channel>\n')
def main(): prof = hotshot.Profile('daap.prof') connection = DAAPClient() # I'm new to this python thing. There's got to be a better idiom # for this. try: host = sys.argv[1] except IndexError: host = "localhost" try: port = sys.argv[2] except IndexError: port = 3689 try: # do everything in a big try, so we can disconnect at the end connection.connect( host, port ) # auth isn't supported yet. Just log in session = connection.login() prof.start() library = session.library() tracks = library.tracks() finally: # this here, so we logout even if there's an error somewhere, # or itunes will eventually refuse more connections. try: session.logout() except Exception: pass # save profiling data prof.stop() prof.close() # load profile data and print out stats stats = hotshot.stats.load("daap.prof") stats.print_stats()
def do_connect(self, spec): """ connect [<server> [<port>] ] Connects to the give server/port. Defaults to localhost. """ if len(spec) == 0: server = "localhost" port = 3689 elif spec.count(" ") == 0: server = spec port = 3689 elif spec.count(" ") == 1: (server, port) = spec.split(" ") else: print("Need server and port") return print("Connecting to %s:%s"%(repr(server), repr(port))) client = DAAPClient() client.connect(server, port) self.session = client.login() self.do_database( self.session.library().id ) self.prompt = "(%s:%s): "%(server,port)
def __init__(self, host, port): self.host = host self.port = port self.client = DAAPClient() self.client.connect(host, port) logger.info("Connected to %s:%s"%(host,port)) self.session = self.client.login() databases = self.session.databases() for d in databases: if str(d.id) == str(self.session.library().id): self.database = d self.tracks = self.database.tracks() logger.info("Got %s tracks"%len(self.tracks))
def __init__( self, host, port=3689): self.host=host self.port=port self.client=DAAPClient() self.client.connect( host, port) self.session=self.client.login() self.databases=self.session.databases() libid=self.session.library().id self.database=None for d in self.databases: if str( d.id) == str( id): self.database=d if self.database is None: self.database=d self.tracks=self.database.tracks()
def connect(self, password = None): """ Connect, login, and retrieve the track list. """ try: client = DAAPClient() if AUTH and password: client.connect(self.server, self.port, password) else: client.connect(self.server, self.port) self.session = client.login() self.connected = True # except DAAPError: except Exception: logger.exception('failed to connect to ({0},{1})'.format( self.server, self.port)) self.auth = True self.connected = False raise
def connect(self, password = None): """ Connect, login, and retrieve the track list. """ try: client = DAAPClient() if AUTH and password: client.connect(self.server, self.port, password) else: client.connect(self.server, self.port) self.session = client.login() self.connected = True # except DAAPError: except: logger.exception('failed to connect to ({0},{1})'.format( self.server, self.port)) self.auth = True self.connected = False raise
# # Check For python-avahi, we can work without # avahi, but wont be able to discover shares. # try: import avahi AVAHI = True except ImportError: logger.warning('avahi not installed, can\'t auto-discover servers') AVAHI = False # detect authoriztion support in python-daap try: tmp = DAAPClient() tmp.connect("spam","eggs","sausage") #dummy login del tmp except TypeError: AUTH = False except: AUTH = True # Globals Warming MANAGER = None class AttrDict(dict): def __getattr__(self, name): return self[name] import functools
# # Check For python-avahi, we can work without # avahi, but wont be able to discover shares. # try: import avahi AVAHI = True except ImportError: logger.warning('avahi not installed, can\'t auto-discover servers') AVAHI = False # detect authoriztion support in python-daap try: tmp = DAAPClient() tmp.connect("spam", "eggs", "sausage") #dummy login del tmp except TypeError: AUTH = False except: AUTH = True # Globals Warming MANAGER = None class AttrDict(dict): def __getattr__(self, name): return self[name]
class DAAPresolver: def __init__(self, host, port): self.host = host self.port = port self.client = DAAPClient() self.client.connect(host, port) logger.info("Connected to %s:%s"%(host,port)) self.session = self.client.login() databases = self.session.databases() for d in databases: if str(d.id) == str(self.session.library().id): self.database = d self.tracks = self.database.tracks() logger.info("Got %s tracks"%len(self.tracks)) def fulltext(self, search): founds = [] logger.info('Searching %s in %d tracks'%(search, len(self.tracks))) seqMatch = difflib.SequenceMatcher(None, "foobar", search) for t in self.tracks: seqMatch.set_seq1(t.artist) score = seqMatch.quick_ratio() seqMatch.set_seq1(t.album) score = max( seqMatch.quick_ratio(), score ) seqMatch.set_seq1(t.name) score = max( seqMatch.quick_ratio(), score ) if score >= 0.3: found = dict() found["artist"] = t.artist found["track"] = t.name found["album"] = t.album if isinstance(t.time, int): found["duration"] = int(t.time/1000) found["url"] = 'http://%s:%s/databases/%d/items/%d.mp3?session-id=%s'%(self.host, self.port, self.database.id, t.id, self.session.sessionid) found["score"] = score #found["source"] = 'DAAP' founds.append(found) logger.info('Found %d tracks'%len(founds)) return founds def artistandtrack(self, artist, track): founds = [] logger.info('Searching %s - %s in %d tracks'%(artist, track, len(self.tracks))) seqMatchArtist = difflib.SequenceMatcher(None, "foobar", self.stripFeat(artist)) seqMatchTrack = difflib.SequenceMatcher(None, "foobar", self.stripFeat(track)) for t in self.tracks: seqMatchArtist.set_seq1(self.stripFeat(t.artist)) seqMatchTrack.set_seq1(self.stripFeat(t.name)) scoreArtist = seqMatchArtist.quick_ratio() scoreTrack = seqMatchTrack.quick_ratio() score = (scoreArtist + scoreTrack) /2 if score >= 0.85: logger.info("%s - %s : %s - %s : %f,%f,%s"%(artist, track, t.artist, t.name, scoreArtist, scoreTrack, score)) found = dict() found["artist"] = t.artist found["track"] = t.name found["album"] = t.album if isinstance(t.time, int): found["duration"] = int(t.time/1000) found["url"] = 'http://%s:%s/databases/%d/items/%d.mp3?session-id=%s'%(self.host, self.port, self.database.id, t.id, self.session.sessionid) found["score"] = 1 #round(score, 2) #found["source"] = 'DAAP' founds.append(found) logger.info('Found %d tracks'%len(founds)) return founds def stripFeat(self, s): patterns = ['^(.*?)\(feat\..*?\).*?$', '^(.*?)feat\..*?$'] for pattern in patterns: reg = re.search(pattern, s) if reg: s= reg.group(1) return s