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
Exemple #2
0
    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
Exemple #3
0
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
Exemple #4
0
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')
Exemple #7
0
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()
Exemple #8
0
    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))
Exemple #10
0
    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()
Exemple #11
0
    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
Exemple #12
0
    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
Exemple #13
0
#
#   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
Exemple #14
0
#
#   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