Exemplo n.º 1
0
 def getAlbumInfoAJAX(self):
     trackid = request.params['trackid'].split('_')[1]
     track = Session.query(Track).filter_by(id=trackid).one()
     json = {}
     albumMbid = track.album.mbid
     # get wikipedia from the release group
     wikipedia = Session.query(MBURL.url) \
                        .join(MBLReleaseGroupURL) \
                        .join(MBLink) \
                        .join(MBLinkType) \
                        .filter(MBLinkType.name=='wikipedia') \
                        .join(MBReleaseGroup) \
                        .filter(MBReleaseGroup.gid==albumMbid) \
                        .all()
     wikipedia = filter(self._filterForEnglishWiki, map(lambda x: x[0], wikipedia))
     if wikipedia:
         wurl = wikipedia[0]
         json['wikipedia'] = wurl
         json['summary'] = albumsummary.get_album_summary(Session, albumMbid, wurl)
     # get amazon from any of the releases
     amazon = Session.query(MBURL) \
                     .join(MBLReleaseURL) \
                     .join(MBLink) \
                     .join(MBLinkType) \
                     .filter(MBLinkType.name=='amazon asin') \
                     .join(MBRelease) \
                     .join(MBReleaseGroup) \
                     .filter(MBReleaseGroup.gid==albumMbid) \
                     .first()
     if amazon:
         json['amazon'] = amazon.url
     json['musicbrainz'] = 'http://musicbrainz.org/release-group/' + albumMbid
     return simplejson.dumps(json)
Exemplo n.º 2
0
 def getLyricsAJAX(self):
     trackid = request.params['trackid'].split('_')[1]
     track = Session.query(Track).filter_by(id=trackid).one()
     if not track.lyrics and \
        (track.lastHitLyricWiki is None or \
         datetime.now() > track.lastHitLyricWiki + timedelta(days=10)):
         
         track.lastHitLyricWiki = datetime.now()
         
         title = track.id3title
         artist = track.id3artist
         params = {
             'artist' : artist,
             'song'   : title,
             'fmt'    : 'json',
         }
         
         url = 'http://lyrics.wikia.com/api.php?%s' % urllib.urlencode(params)
         
         html = urllib.urlopen(url).read()
         
         if not "'lyrics':'Not found'" in html:
             search = re.search("'url':'(?P<url>.*?)'",html)
             lyricurl = urllib.unquote(search.group('url'))
             lyrichtml = urllib.urlopen(lyricurl).read()
             lyrics = re.search("<div class='lyricbox'>.*?</div>(?P<lyrics>.*?)<!-- \n", lyrichtml).group('lyrics')
             lyrics = unescape(lyrics)
             track.lyrics = lyrics
         Session.begin()
         Session.commit()
     json = {}
     if track.lyrics:
         json['lyrics'] = track.lyrics
     return simplejson.dumps(json)
Exemplo n.º 3
0
    def trackArtistAlbumsLOCAL(self):
        trackid = request.params['trackid']

        #note that we can do this because there is 
        #only a single foreign key matched between 
        #tracks and albums.
        artistid=Session.query(Track).filter_by(id=trackid)[0].artistid
        joined=Session.query(Track).filter_by(artistid=artistid)

        aids = []
        out = []
        for t in joined:
            aid = t.albumid
            if not aid in aids:
                aids.append(aid)
                year_re = re.compile('[0-9]{4}')
                early_year = (re.search(year_re,t.id3date)).group()
                json = {
                    'aid':aid,
                    'mbid':t.album.mbid,
                    'name':t.album.name,
                    'year':early_year
                    }
                out.append(json)
        return sjson.dumps(out)
Exemplo n.º 4
0
 def clearAlbumArt(self):
     id = request.params['id']
     Session.begin()
     album = Session.query(Album).filter_by(id=id).one()
     album.albumArtFilename = None
     album.lastHitAlbumArtExchange = None
     Session.commit()
     return 'Cleared album art for ' + album.artist.name + ' - ' + album.name
Exemplo n.º 5
0
 def saveLyricsFramesAJAX(self):
     trackid = request.params['trackid']
     recordedFrames = simplejson.loads(request.params['frames']) # list of (time, lyrics line index) pairs
     recordedFrames.sort(key = itemgetter(0))                    # (sort by time)
     Session.begin()
     track = Session.query(Track).filter_by(id=trackid).one()
     track.lyricsFrames = recordedFrames
     Session.commit()
Exemplo n.º 6
0
 def setAlbumArt(self):
     id = request.params['id']
     url = request.params['url']
     Session.begin()
     album = Session.query(Album).filter_by(id=id).one()
     album.albumArtFilename = albumart._fetchAlbumArt(album.artist.name, album.name, url)
     Session.commit()
     return 'Set album art for ' + album.artist.name + ' - ' + album.name + ' to ' + url + ', saved to ' + album.albumArtFilename
Exemplo n.º 7
0
 def pp2(self):
     artists = Session.query(Artist)
     tracks = Session.query(Track)
     paths = []
     for r in tracks:
         paths.append( os.path.join('.media', r.filepath ))
         
     return render('/hello2.html')
Exemplo n.º 8
0
 def similarTrackAJAX(self):
     id = request.params['id'].split('_')[1]
     track = Session.query(Track).filter_by(id=id).one()
     lastfmArtist = self.lastfmNetwork.get_artist(track.artist.name)
     similarArtists = lastfmArtist.get_similar()
     similarMbids = filter(lambda x: x is not None, map(lambda x: x.mbid, similarArtists))
     randomSimilarArtist = Session.query(Artist).filter(Artist.mbid.in_(similarMbids)).order_by(random()).first()
     return simplejson.dumps([rand.choice(randomSimilarArtist.tracks).toPlaylistJSON()]) \
         if randomSimilarArtist \
         else self.randomTrackAJAX()
Exemplo n.º 9
0
 def randomRooAlbumAJAX(self):
     album = Session.query(Album) \
                    .join(Album.artists) \
                    .filter(Artist.mbid.in_(Bonnaroo.artist_mbids)) \
                    .order_by(random()) \
                    .first()
     tracks = Session.query(Track) \
                     .filter_by(albumid=album.mbid)
     json = map(lambda x: x.toPlaylistJSON(), tracks)
     return simplejson.dumps(json)
Exemplo n.º 10
0
 def _getTracksForPlaylist(self, id):
     playlist = Session.query(Playlist).filter(Playlist.playlist_id==id).one()
     recordings = playlist.tracks
     recording_mbids = map(lambda x: x.gid, recordings)
     tracks = Session.query(Track).filter(Track.mbid.in_(recording_mbids)).all()
     tracks.sort(lambda a,b: cmp(recording_mbids.index(a.mbid), recording_mbids.index(b.mbid)))
     filtertracks = [tracks[0]]
     for track in tracks[1:]:
         if track.mbid != filtertracks[-1].mbid:
             filtertracks.append(track)
     return filtertracks
Exemplo n.º 11
0
 def searchShopAlbumAJAX(self):
     mbid = request.params['mbid']
     (album, albumname, artistname) = Session.query(MBReleaseGroup, MBReleaseName, MBArtistName) \
                                             .join(MBReleaseName) \
                                             .join(MBReleaseGroup.artistcredit, MBArtistCredit.name) \
                                             .filter(MBReleaseGroup.gid==mbid) \
                                             .one()
     user_name = request.environ['repoze.what.credentials']['repoze.what.userid']
     user_id = Session.query(User).filter(User.user_name==user_name).one().user_id
     infohash = shopservice.download(Session, mbid, user_id)
     if infohash:
         return simplejson.dumps({'success' : True})
     else:
         return simplejson.dumps({'success' : False})
Exemplo n.º 12
0
 def searchAJAX(self):
     search = request.params['search']
     maxResults = 50
     artists = Session.query(Artist). \
                       filter(Artist.name.like('%'+search+'%')). \
                       join(Album) \
                       [0:maxResults]
     albums = Session.query(Album). \
                      filter(Album.name.like('%'+search+'%')) \
                      [0:maxResults]
     tracks = Session.query(Track). \
                      filter(Track.id3title.like('%'+search+'%')) \
                      [0:maxResults]
     if len(artists) == maxResults or len(tracks) == maxResults or len(albums) == maxResults:
         truncated = True
     else:
         truncated = False
     artistIdToJSON = {}
     albumsIdToJSON = {}
     for artist in artists:
         if artist.id not in artistIdToJSON:
             artistJSON = artist.toTreeJSON()
             artistIdToJSON[artist.id] = artistJSON
     for album in albums:
         if album.artist and album.artist.id not in artistIdToJSON:
             artistJSON = album.artist.toTreeJSON(children=[])
             artistIdToJSON[album.artist.id] = artistJSON
             albumJSON = album.toTreeJSON()
             artistJSON['children'].append(albumJSON)
         else:
             continue
     for track in tracks:
         if track.album and \
            track.album.artist and \
            track.album.artist.id not in artistIdToJSON:
             artistJSON = track.album.artist.toTreeJSON(children=[])
             artistIdToJSON[track.album.artist.id] = artistJSON
         else:
             continue
         if track.album and track.album.id not in albumsIdToJSON:
             albumJSON = track.album.toTreeJSON(children=[])
             artistJSON['children'].append(albumJSON)
             albumsIdToJSON[track.album.id] = albumJSON
         else:
             continue
         albumJSON['children'].append(track.toTreeJSON())
     json = artistIdToJSON.values()
     json.sort(self._compareTreeFloatVA)
     return simplejson.dumps(json)
Exemplo n.º 13
0
    def alltracks(self):
        tracks = Session.query(Track)
        count = 0
        namefun = lambda x: x.id3title
        out = []
        this_artist_count = 0 
        last_artist = ''
        max_per_artist = 5
        for t in tracks:
            name = namefun(t)
            type = t.__class__.__name__

            this_artist = t.artistid
            if this_artist == last_artist:
                this_artist_count = this_artist_count + 1
            else:
                this_artist_count = 0
                last_artist = this_artist
            if this_artist_count < max_per_artist:
                json = {
                    'type':type,
                    'name':name,
                    'url':self.track_URL_from_id(t.id),
                    'id':t.id,
                    'albumid':t.albumid,
                    'artistid':t.artistid
                    }
                out.append(json)
                count = count + 1
                if count > 50: break

        return sjson.dumps(out)
Exemplo n.º 14
0
 def randomRooTrackAJAX(self):
     track = Session.query(Track) \
                    .join(Album, Album.artists) \
                    .filter(Artist.mbid.in_(Bonnaroo.artist_mbids)) \
                    .order_by(random()) \
                    .first()
     return simplejson.dumps([track.toPlaylistJSON()])
Exemplo n.º 15
0
    def index(self):

        # Return a rendered template
        #return render('/ben_kvp.mako')
        # or, return a string
        
        return 'Hello World - how you doing today {0}'.format(Session.query(User).first())
Exemplo n.º 16
0
    def alltracks(self):
        trk_total_limit = 200;
        trk_artist_limit = 10;

        tracks = Session.query(Track)
        count = 0
        namefun = lambda x: x.id3title
        out = []
        this_artist_count = 0 
        last_artist = ''
        for t in tracks:
            name = namefun(t)

            this_artist = t.artistid
            if this_artist == last_artist:
                this_artist_count = this_artist_count + 1
            else:
                this_artist_count = 0
                last_artist = this_artist
            if this_artist_count < trk_artist_limit:
                json = {
                    'track_name':name,
                    'url':self.track_URL_from_id(t.id),
                    'track_id':t.id,
                    'albumid':t.albumid,
                    'artistid':t.artistid,
                    'datatype':'track',
                    'tostring':name
                    }
                out.append(json)
                count = count + 1
                if count > trk_total_limit: break

        return sjson.dumps(out)
Exemplo n.º 17
0
 def printPaths(self):
     tracks = Session.query(Track)
     paths = []
     for r in tracks:
         paths.append( os.path.join('.media', r.filepath ))
         
     return paths
Exemplo n.º 18
0
 def getArtistInfoAJAX(self):
     json = {}
     # Get the artist credit for the given artist or track
     if 'trackid' in request.params:
         trackid = request.params['trackid'].split('_')[1]
         artistCreditNames = self._getArtistCreditNames(trackid)
         credit = []
         for artistcredit in artistCreditNames:
             credit.append({
                 'text' : artistcredit.name.name,
                 'mbid' : artistcredit.artist.gid
             })
             if artistcredit.joinphrase:
                 credit.append({
                     'text' : artistcredit.joinphrase
                 })
         artistMbid = artistCreditNames[0].artist.gid
     elif 'mbid' in request.params:
         artistMbid = request.params['mbid']
         artist = Session.query(MBArtist).filter(MBArtist.gid==artistMbid).one()
         credit = [{
             'text' : artist.name.name
         }]
     else:
         raise Exception('need trackid or artist mbid')
     json['credit'] = credit
     # Get artist bio, and url relationships
     urls = Session.query(MBURL.url, MBLinkType.name) \
                   .join(MBLArtistURL) \
                   .join(MBLink) \
                   .join(MBLinkType) \
                   .join(MBArtist) \
                   .filter(MBArtist.gid==artistMbid) \
                   .all()
     urls = self._mapify(urls)
     if 'wikipedia' in urls:
         wurls = filter(self._filterForEnglishWiki, urls['wikipedia'])
         if wurls:
             wurl = wurls[0]
             json['wikipedia'] = wurl
             json['bio'] = artistbio.get_artist_bio(Session, artistMbid,  wurl)
     if 'youtube' in urls:
         json['youtube'] = urls['youtube'][0]
     if 'official homepage' in urls:
         json['official'] = urls['official homepage'][0]
     json['musicbrainz'] = 'http://musicbrainz.org/artist/' + artistMbid
     return simplejson.dumps(json)
Exemplo n.º 19
0
 def getAlbumArtAJAX(self):
     trackid = request.params['trackid'].split('_')[1]
     track = Session.query(Track).filter_by(id=trackid).one()
     albumartfilename = albumart.get_art(Session, track.album)
     json = {}
     if albumartfilename is not None:
         json['albumArtURL'] = albumartfilename
     return simplejson.dumps(json)
Exemplo n.º 20
0
 def getAlbumArtAJAX(self):
     trackid = request.params['trackid'].split('_')[1]
     track = Session.query(Track).filter_by(id=trackid).one()
     albumartfilename = albumart.get_art(Session, track.album)
     if albumartfilename:
         return simplejson.dumps({'albumArtURL' : albumartfilename})
     else:
         return '{}'
Exemplo n.º 21
0
    def getAlbumArtAJAX(self):
        trackid = request.params['trackid'].split('_')[1]
        track = Session.query(Track).filter_by(id=trackid).one()
        if not track.album.albumArtFilename and ( \
            track.album.lastHitAlbumArtExchange is None \
            or datetime.now() > track.album.lastHitAlbumArtExchange + timedelta(days=10)):
            
            track.album.lastHitAlbumArtExchange = datetime.now()
            
            album = track.album.name
            artist = track.album.artist.name
            if artist == 'Various Artists':
                q = album
            else:
                q = (artist + ' ' + album)
            q = q.replace("'","")

            site = 'http://www.albumartexchange.com'

            params = {
                'grid' : '2x7',
                'sort' : 7,
                'q'    : q,
            }

            url = site + '/covers.php?%s' % urllib.urlencode(params)
            
            html = urllib.urlopen(url).read()
            
            search = re.search('src="/phputil/scale_image.php\?size=150&amp;src=(?P<src>.*?)"',html)
            
            if search:
                image = site + urllib.unquote(search.group('src'))
                extension = image.rsplit('.', 1)[1]
                delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())
                delchars = delchars.translate(None," ()'&!-+_.")
                filename = (artist + ' - ' + album).encode('utf-8').translate(None, delchars) + '.' + extension
                urllib.urlretrieve(image, 'scatterbrainz/public/art/' + filename)
                albumArt = '/art/' + filename
                track.album.albumArtFilename = albumArt
            Session.begin()
            Session.commit()
        json = {}
        if track.album.albumArtFilename:
            json['albumArtURL'] = track.album.albumArtFilename
        return simplejson.dumps(json)
Exemplo n.º 22
0
 def getArtistInfoAJAX(self):
     trackid = request.params['trackid'].split('_')[1]
     track = Session.query(Track).filter_by(id=trackid).one()
     artist = self.lastfmNetwork.get_artist(track.artist.name)
     return simplejson.dumps({
         'bio'    : artist.get_bio_content(),
         'images' : map(lambda i:[i.sizes.largesquare, i.sizes.original], artist.get_images(limit=20))
     })
Exemplo n.º 23
0
def clearimport(download):
    with importlock:
        assert not download.isdone, 'download is already done'
        assert download.failedimport, 'import isnt failed'
        mbid = download.release_group_mbid
        dirpath = mbid[:2] + '/' + mbid
        cmd = 'rm -rf ' + Config.MUSIC_PATH + dirpath
        log.info('running ' + cmd)
        os.system(cmd)
        if Config.SCP_SHOP_DOWNLOADS:
            cmd = 'rm -rf ' + Config.SCP_FOLDER + '/' + download.infohash
            log.info('running ' + cmd)
            os.system(cmd)
        Session.begin()
        download.failedimport = False
        download.importtrace = None
        Session.commit()
Exemplo n.º 24
0
    def getTrackInfoAJAX(self):
        trackid = request.params['trackid'].split('_')[1]
        track = Session.query(Track).filter_by(id=trackid).one()
        (artistName, albumName, trackName) = (track.id3artist, track.id3album, track.id3title)
        log.info(request.remote_addr + ' playing ' + artistName + ' - ' + trackName)
        if (not track.artist.mbid or not track.album.mbid or not track.album.asin) and \
           (track.album.lastHitMusicbrainz is None \
             or datetime.now() > track.album.lastHitMusicbrainz + timedelta(days=10)):

            track.album.lastHitMusicbrainz = datetime.now()
            
            album = track.album
            artist = album.artist
            release = None
            if album.mbid:
                release = getRelease(album.mbid)
            else:
                if artist.name == 'Various Artists':
                    release = searchRelease(None, album.name)
                else:
                    if artist.name.startswith('The') or artist.name.startswith('the') or artist.name.startswith('THE'):
                        artistSearch = artist.name[4:]
                    else:
                        artistSearch = artist.name
                    release = searchRelease(artistSearch, album.name)
                if release and not album.mbid:
                    album.mbid = release.id.split('/')[-1]
                if release and not artist.mbid:
                    artist.mbid = release.artist.id.split('/')[-1]
            if release:
                albumName = release.title
                asin = release.getAsin()
                if asin:
                    track.album.asin = asin
                if release.artist:
                    artistName = release.artist.name
            Session.begin()
            Session.commit()
        json = {}
        json['artist'] = artistName
        json['album'] = albumName
        json['track'] = trackName
        if track.album.asin:
            json['asin'] = track.album.asin
        return simplejson.dumps(json)
Exemplo n.º 25
0
 def _tracksForArtistPlaylistJSON(self, mbid):
     albums = Session.query(Artist).filter_by(mbid=mbid).one().albums
     albums.sort(lambda a,b: cmp(a.getReleaseDate(), b.getReleaseDate()))
     tracks = []
     for album in albums:
         albumtracks = album.tracks
         albumtracks.sort(self._compareTracks)
         tracks.extend(albumtracks)
     return self._playlistJSON(tracks)
Exemplo n.º 26
0
 def getSimilarArtistsAJAX(self):
     mbid = request.params['mbid']
     artist = Session.query(MBArtist).filter(MBArtist.gid==mbid).one()
     try:
         similarartistmbids = similarartist.get_similar_artists(Session, self.lastfmNetwork, artist)
     except (BadStatusLine, SocketTimeout) as e:
         log.error('[lastfm] down? ' + e.__repr__())
         return '{}'
     similarartists = Session.query(MBArtist, MBArtistName).join(MBArtist.name).filter(MBArtist.gid.in_(similarartistmbids)).all()
     similarmap = {}
     for artist in similarartists:
         similarmap[artist[0].gid] = {'mbid' : artist[0].gid, 'name' : artist[1].name, 'local' : False}
     localsimilarartists = Session.query(Artist).filter(Artist.mbid.in_(similarartistmbids)).all()
     for artist in localsimilarartists:
         similarmap[artist.mbid]['local'] = True
     similarjson = []
     for mbid in similarartistmbids:
         similarjson.append(similarmap[mbid])
     return simplejson.dumps({'similar' : similarjson})
Exemplo n.º 27
0
 def run(self):
     
     # Only let one worker run via pg advisory lock
     acquired = Session.execute(select([func.pg_try_advisory_lock(importlockid)])).fetchone()[0]
     threadid = 'PID ' + str(os.getpid()) + ' thread ' + str(threading.current_thread())
     if acquired:
         log.info('[shop worker] %s acquired lock, starting..' % threadid)
     else:
         return
     
     pendingdownloads = False
     while True:
         try:
             downloads = Session.query(ShopDownload) \
                                .filter(ShopDownload.isdone==False) \
                                .filter(ShopDownload.failedimport==False) \
                                .all()
             pendingdownloads = len(downloads) != 0
             if pendingdownloads:
                 rtorrent = xmlrpclib.ServerProxy(Config.SHOP_RPC_URL)
                 for download in downloads:
                     try:
                         infohash = download.infohash
                         iscomplete = rtorrent.d.get_complete(infohash) == 1
                         if iscomplete:
                             shopservice.importDownload(download)
                     except:
                         exc_type, exc_value, exc_traceback = sys.exc_info()
                         importtrace = repr(traceback.format_exception(exc_type, exc_value, exc_traceback))
                         log.error('[shop worker] caught exception in loop ' + importtrace)
                         Session.rollback()
                         Session.begin()
                         download.failedimport = True
                         download.importtrace = importtrace
                         Session.commit()
         except Exception as e:
             log.error('[shop worker] caught exception out of loop ' + repr(e))
             Session.rollback()
         if pendingdownloads:
             time.sleep(10)
         else:
             time.sleep(30)
Exemplo n.º 28
0
    def allalbums(self):
        if request.params.has_key('mbid') :
            mbid = request.params['mbid']
            artist = Session.query(Artist).filter_by(mbid=mbid)[0].id;
            albums = Session.query(Album).filter_by(artistid=artist);
        else:
            albums = Session.query(Album)
        
        
        out = []
        for  a in albums:

            name = a.name
            mbid = a.mbid
            out.append({'tostring':name,
                        'album_name':name,
                        'album_mbid':mbid,
                        'datatype':'album'})
            
        return sjson.dumps(out)
Exemplo n.º 29
0
    def allartists(self):
        artists = Session.query(Artist)
        out = []
        for  a in artists:

            name = a.name
            mbid = a.mbid
            out.append({'tostring':name,
                        'artist_name':name,
                        'artist_mbid':mbid,
                        'datatype':'artist'})
            
        return sjson.dumps(out)
Exemplo n.º 30
0
 def similarTrackAJAX(self):
     trackid = request.params['id'].split('_')[1]
     artists = Session.query(MBArtist).join(MBArtistCreditName, MBArtistCredit, MBRecording, AudioFile, AudioFile.track).filter(Track.id==trackid).all()
     similarMbids = set([])
     try:
         for artist in artists:
             similarMbids.update(similarartist.get_similar_artists(Session, self.lastfmNetwork, artist))
     except (BadStatusLine, SocketTimeout) as e:
         log.error('[lastfm] down? ' + e.__repr__())
         return ''
     artistMbidsWithAlbums = Session.query(Artist.mbid) \
                                    .join(artist_albums) \
                                    .filter(Artist.mbid.in_(similarMbids)) \
                                    .distinct() \
                                    .subquery()
     randomSimilarArtist = Session.query(Artist) \
                                  .filter(Artist.mbid.in_(artistMbidsWithAlbums)) \
                                  .order_by(random()) \
                                  .first()
     randomAlbum = rand.choice(randomSimilarArtist.albums)
     randomTrack = rand.choice(randomAlbum.tracks)
     return simplejson.dumps([randomTrack.toPlaylistJSON()])