Example #1
0
    def get_cds_html(self, tracks):
        list = []
        html = ''
        cd = ''
        for tr in tracks:
            if get_track_tag(tr, 'album', 'unknown').lower() != cd.lower():
                if cd != '':
                    html+='<tr><td colspan=3><hr noshade="noshade"/></td></tr></table>'
                html+='<table class="cd-table">'
                cd=get_track_tag(tr, 'album', 'unknown')
                if cd== 'unknown':
                    track_nbr = len([x.track for x in search.search_tracks_from_string(
                            ex.exaile().collection, 'album==__null__')])
                else:
                    track_nbr = len([x.track for x in search.search_tracks_from_string(
                            ex.exaile().collection, 'album=="%s"' % cd)])
                cover = get_track_cover(tr)
                cover_data = get_image_data(cover, (60, 60))
                
                html+='''<tr class="cd-tr">\
<td><a href="album://%s"><img class="cd-img" src="%s"/></a></td>\
<td class="cd-title-td"><a href="album://%s"><b>%s</b><br/>%s</a></td>\
<td class="cd-right-td">%s tracks</td>\
</tr><tr><td colspan=3><hr noshade="noshade"/></td></tr>''' % \
    (cd, cover_data, cd, cd, get_track_tag(tr, 'date', ''), track_nbr)

            anchor = self.get_track_anchor_from_track(tr, img=True)
            html+='''<tr class="cd-track-tr">\
<td colspan=3 class='tracktd'>%s</td>\
</tr>''' % anchor
        html+='</table>'
        return html
Example #2
0
 def get_selected_tracks(self):
     tmp = self.hover.split('://', 1)[1]
     if self.hover.split('://')[0] == 'track':
         return [
             self.currentpage.tracks[int(self.hover.split('://', 1)[1])]
         ]
     if self.hover.split('://')[0] == 'artist':
         return [
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('artist=="%s"' % tmp),
                 keyword_tags=['album', 'tracknumber'])
         ]
     if self.hover.split('://')[0] == 'album':
         return [
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('artist=="%s"' % tmp),
                 keyword_tags=['tracknumber'])
         ]
     if self.hover.split('://')[0] == 'tag':
         return [
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('genre=="%s"' % tmp),
                 keyword_tags=['artist', 'album', 'tracknumber'])
         ]
     return []
Example #3
0
 def _compils(self):
     compils = [x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, '! %s==__null__' % self['artist'])]
     if len(compils)>0:
         return self.get_cds_html([x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('album=="%s"' % compil for compil in compils), ['album', 'tracknumber'])])
     return ''
Example #4
0
 def _compils(self):
     compils = [
         x.track for x in search.search_tracks_from_string(
             ex.exaile().collection, '! %s==__null__' % self['artist'])
     ]
     if len(compils) > 0:
         return self.get_cds_html([
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, (
                     'album=="%s"' % compil
                     for compil in compils), ['album', 'tracknumber'])
         ])
     return ''
Example #5
0
def track_in_collection(artist, title):
    tracks = [x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, ('artist=="%s" title=="%s"' % (artist, title)))]
    if len(tracks)>0:
        return tracks[0]
    else:
        return None
Example #6
0
def _create_search_playlist(name, search_string, exaile):
    '''Create a playlist based on a search string'''
    tracks = [x.track for x in search.search_tracks_from_string(exaile.collection, search_string)]

    # create the playlist
    pl = playlist.Playlist(name, tracks)
    main.get_playlist_notebook().create_tab_from_playlist(pl)
Example #7
0
def get_top_artists(field, limit):
    artists = [
        x.artist for x in search.search_tracks_from_string(
            ex.exaile().collection, '! %s==__null__' % field)
    ]
    artists = util.sort_tracks([field], artists, True)
    return artists[:limit]
Example #8
0
def _create_search_playlist( name, search_string, exaile ):
    '''Create a playlist based on a search string'''
    tracks = [ x.track for x in search.search_tracks_from_string( exaile.collection, search_string ) ]
        
    # create the playlist
    pl = playlist.Playlist( name, tracks )
    main.get_playlist_notebook().create_tab_from_playlist( pl )
Example #9
0
def get_top_albums(field, limit):
    albums = [
        x.track for x in search.search_tracks_from_string(
            ex.exaile().collection, '! %s==__null__' % field)
    ]
    albums = util.sort_tracks([field], albums, True)
    return albums[:limit]
Example #10
0
    def search(self,
               query,
               sort_fields=[],
               return_lim=-1,
               tracks=None,
               reverse=False):
        """
            DEPRECATED, DO NOT USE IN NEW CODE
        """
        import warnings
        warnings.warn("TrackDB.search is deprecated.", DeprecationWarning)
        tracks = [
            x.track for x in search_tracks_from_string(
                self,
                query,
                case_sensitive=False,
                keyword_tags=['artist', 'albumartist', 'album', 'title'])
        ]

        if sort_fields:
            tracks = sort_tracks(sort_fields, tracks, reverse)
        if return_lim > 0:
            tracks = tracks[:return_lim]

        return tracks
Example #11
0
 def get_selected_tracks(self):
     tmp = self.hover.split('://', 1)[1]
     if self.hover.split('://')[0]=='track':
         return [self.currentpage.tracks[int(self.hover.split('://', 1)[1])]]
     if self.hover.split('://')[0]=='artist':
         return [x.track for x in search.search_tracks_from_string(
             	ex.exaile().collection, ('artist=="%s"' % tmp),
                 keyword_tags=['album', 'tracknumber'])]
     if self.hover.split('://')[0]=='album':
 	    return [x.track for x in search.search_tracks_from_string(
             	ex.exaile().collection, ('artist=="%s"' % tmp),
                 keyword_tags=['tracknumber'])]
     if self.hover.split('://')[0]=='tag':
 	    return [x.track for x in search.search_tracks_from_string(
             	ex.exaile().collection, ('genre=="%s"' % tmp),
                 keyword_tags=['artist', 'album', 'tracknumber'])]
     return []
Example #12
0
 def track_in_collection(self, artist, title):
     if artist == self['artist']:
         tracks = [x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('artist=="%s" title=="%s"' % (artist, title)))]
         if len(tracks)>0: return tracks[0]
         else: return None
     else:
         return ContextPage.track_in_collection(self, artist, title)
Example #13
0
 def test_search_tracks_from_string(self):
     tracks = [track.Track(x) for x in ('foo', 'bar', 'baz', 'quux')]
     tracks[0].set_tag_raw('artist', 'foooo')
     tracks[2].set_tag_raw('artist', 'foooooo')
     gen = search.search_tracks_from_string(tracks, 'foo', keyword_tags=['artist'])
     assert gen.next().track == tracks[0]
     assert gen.next().track == tracks[2]
     with pytest.raises(StopIteration):
         gen.next()
Example #14
0
 def _most_played_albums(self, limit=5):
     cds = get_top_albums('__playcount', int(limit))
     if len(cds) > 0:
         return self.get_cds_html([
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, (
                     'album=="%s"' % cd
                     for cd in cds), ['album', 'tracknumber'])
         ])
     return ''
Example #15
0
 def test_search_tracks_with_int_from_string(self):
     # unlike mp3, mp4 will return integers for BPM.. make sure that works
     tracks = [track.Track(x) for x in ('foo', 'bar', 'baz', 'quux')]
     tracks[1].set_tag_raw('bpm', '2')
     tracks[2].set_tag_raw('bpm', 2)
     gen = search.search_tracks_from_string(tracks, '2', keyword_tags=['bpm'])
     assert gen.next().track == tracks[1]
     assert gen.next().track == tracks[2]
     with pytest.raises(StopIteration):
         gen.next()
Example #16
0
 def test_search_tracks_from_string(self):
     matcher = search.TracksMatcher("foo", keyword_tags=['artist'])
     tracks = [track.Track(x) for x in ('foo', 'bar', 'baz', 'quux')]
     tracks[0].set_tag_raw('artist', 'foooo')
     tracks[2].set_tag_raw('artist', 'foooooo')
     gen = search.search_tracks_from_string(tracks, 'foo',
             keyword_tags=['artist'])
     self.assertEqual(gen.next().track, tracks[0])
     self.assertEqual(gen.next().track, tracks[2])
     self.assertRaises(StopIteration, gen.next)
Example #17
0
def track_in_collection(artist, title):
    tracks = [
        x.track
        for x in search.search_tracks_from_string(ex.exaile().collection, (
            'artist=="%s" title=="%s"' % (artist, title)))
    ]
    if len(tracks) > 0:
        return tracks[0]
    else:
        return None
Example #18
0
    def test_search_tracks_with_unicodemark_from_string(self):
        tracks = [track.Track(x) for x in ('foo', 'bar', 'baz', 'quux')]
        tracks[0].set_tag_raw('artist', 'foooo')
        tracks[2].set_tag_raw('artist', u'中')

        # the weird character is normalized, so you can't search based on that
        gen = search.search_tracks_from_string(tracks, u'中', keyword_tags=['artist'])

        assert gen.next().track == tracks[2]
        with pytest.raises(StopIteration):
            gen.next()
Example #19
0
 def track_in_collection(self, artist, title):
     if artist == self['artist']:
         tracks = [
             x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('artist=="%s" title=="%s"' %
                                          (artist, title)))
         ]
         if len(tracks) > 0: return tracks[0]
         else: return None
     else:
         return ContextPage.track_in_collection(self, artist, title)
Example #20
0
 def _lfm_top_albums(self, period='overall', limit=10):
     if self.get_lfm_user():
         cds = [album.get_item().get_title() for album in self.get_lfm_user().get_top_albums(period,int(limit))]
         tracks = []
         if len(cds)>0:
             for cd in cds:
                 tracks+= [x.track for x in search.search_tracks_from_string(
                             ex.exaile().collection, ('album=="%s"' % cd), ['tracknumber'])]
             return self.get_cds_html(tracks)
         return ""
     return "Enter your username in the settings"
Example #21
0
    def test_search_tracks_ignore_diacritic_from_string(self, sstr):
        '''Ensure that searching for tracks with diacritics return
           appropriately normalized results'''
        tracks = [track.Track(x) for x in ('foo', 'bar', 'baz', 'quux')]
        tracks[0].set_tag_raw('artist', 'motley crue')
        tracks[1].set_tag_raw('artist', 'rubbish')
        tracks[2].set_tag_raw('artist', u'motley crüe')

        gen = search.search_tracks_from_string(tracks, sstr, keyword_tags=['artist'])

        assert gen.next().track == tracks[0]
        assert gen.next().track == tracks[2]
        with pytest.raises(StopIteration):
            gen.next()
Example #22
0
    def get_cds_html(self, tracks):
        list = []
        html = ''
        cd = ''
        for tr in tracks:
            if get_track_tag(tr, 'album', 'unknown').lower() != cd.lower():
                if cd != '':
                    html += '<tr><td colspan=3><hr noshade="noshade"/></td></tr></table>'
                html += '<table class="cd-table">'
                cd = get_track_tag(tr, 'album', 'unknown')
                if cd == 'unknown':
                    track_nbr = len([
                        x.track for x in search.search_tracks_from_string(
                            ex.exaile().collection, 'album==__null__')
                    ])
                else:
                    track_nbr = len([
                        x.track for x in search.search_tracks_from_string(
                            ex.exaile().collection, 'album=="%s"' % cd)
                    ])
                cover = get_track_cover(tr)
                cover_data = get_image_data(cover, (60, 60))

                html+='''<tr class="cd-tr">\
<td><a href="album://%s"><img class="cd-img" src="%s"/></a></td>\
<td class="cd-title-td"><a href="album://%s"><b>%s</b><br/>%s</a></td>\
<td class="cd-right-td">%s tracks</td>\
</tr><tr><td colspan=3><hr noshade="noshade"/></td></tr>''' % \
    (cd, cover_data, cd, cd, get_track_tag(tr, 'date', ''), track_nbr)

            anchor = self.get_track_anchor_from_track(tr, img=True)
            html += '''<tr class="cd-track-tr">\
<td colspan=3 class='tracktd'>%s</td>\
</tr>''' % anchor
        html += '</table>'
        return html
Example #23
0
    def search(self, query, sort_fields=[], return_lim=-1,
            tracks=None, reverse=False):
        """
            DEPRECATED, DO NOT USE IN NEW CODE
        """
        import warnings
        warnings.warn("TrackDB.search is deprecated.", DeprecationWarning)
        tracks = [ x.track for x in search_tracks_from_string(self, query,
                case_sensitive=False, keyword_tags=['artist', 'albumartist',
                'album', 'title']) ]

        if sort_fields:
            tracks = sort_tracks(sort_fields, tracks, reverse)
        if return_lim > 0:
            tracks = tracks[:return_lim]

        return tracks
Example #24
0
 def _lfm_top_albums(self, period='overall', limit=10):
     if self.get_lfm_user():
         cds = [
             album.get_item().get_title()
             for album in self.get_lfm_user().get_top_albums(
                 period, int(limit))
         ]
         tracks = []
         if len(cds) > 0:
             for cd in cds:
                 tracks += [
                     x.track for x in search.search_tracks_from_string(
                         ex.exaile().collection, ('album=="%s"' %
                                                  cd), ['tracknumber'])
                 ]
             return self.get_cds_html(tracks)
         return ""
     return "Enter your username in the settings"
Example #25
0
def export_tags(exaile):
    '''
        Exports all tags to a user specified JSON file
    '''

    uri = dialogs.save(
        parent=exaile.gui.main.window,
        output_fname='tags.json',
        output_setting='plugin/grouptagger/export_dir',
        title=_('Export tags to JSON'),
        extensions={'.json': 'grouptagger JSON export'},
    )

    if uri is not None:

        # collect the data
        trackdata = {}
        for strack in search.search_tracks_from_string(exaile.collection, ''):
            track = strack.track
            tags = list(sorted(get_track_groups(track)))
            if tags:
                trackdata[track.get_loc_for_io()] = tags

        data = {
            '_meta': {
                'date': time.strftime('%Y-%m-%d %H:%M:%S'),
                'exporter': 'Exaile/%s' % exaile.get_version(),
                'version': 1,
            },
            'tracks': trackdata,
        }

        # save it
        with GioFileOutputStream(Gio.File.new_for_uri(uri), 'w') as fp:
            json.dump(data,
                      fp,
                      sort_keys=True,
                      indent=4,
                      separators=(',', ': '))

        logger.info("Exported tags of %s tracks to %s", len(trackdata), uri)
Example #26
0
    def find_similar_tracks(self, track, limit=-1, exclude=[]):
        """
            finds tracks from the collection that are similar
            to the passed track.

            @param track: the track to find similar tracks to
            @param limit: limit the returned list to this many
                tracks. If there are more tracks than this
                found, a random selection of those tracks is
                returned.
        """
        logger.debug(u"Searching for %(limit)s tracks related to %(track)s" % {
            'limit': limit,
            'track': track
        })
        artists = self.find_similar_artists(track)
        if artists == []:
            return []
        tracks = []
        random.shuffle(artists)
        i = 0
        while (limit > len(tracks) or limit == -1) and i < len(artists):
            artist = artists[i][1].replace('"', '\\\"')
            i += 1
            searchres = search.search_tracks_from_string(self.collection,
                                                         'artist=="%s"' %
                                                         artist,
                                                         case_sensitive=False)
            choices = [x.track for x in searchres]
            if choices == []:
                continue
            random.shuffle(choices)
            j = 0
            while j < len(choices):
                track = choices[j]
                if track not in exclude:
                    tracks.append(track)
                    break
                j += 1
        return tracks
Example #27
0
def export_tags(exaile):
    '''
        Exports all tags to a user specified JSON file
    '''

    uri = dialogs.save(
        parent=exaile.gui.main.window,
        output_fname='tags.json',
        output_setting='plugin/grouptagger/export_dir',
        title=_('Export tags to JSON'),
        extensions={'.json': 'grouptagger JSON export'},
    )

    if uri is not None:

        # collect the data
        trackdata = {}
        for strack in search.search_tracks_from_string(exaile.collection, ''):
            track = strack.track
            tags = list(sorted(get_track_groups(track)))
            if tags:
                trackdata[track.get_loc_for_io()] = tags

        data = {
            '_meta': {
                'date': time.strftime('%Y-%m-%d %H:%M:%S'),
                'exporter': 'Exaile/%s' % exaile.get_version(),
                'version': 1,
            },
            'tracks': trackdata,
        }

        # save it
        with GioFileOutputStream(Gio.File.new_for_uri(uri), 'w') as fp:
            json.dump(data, fp, sort_keys=True, indent=4, separators=(',', ': '))

        logger.info("Exported tags of %s tracks to %s", len(trackdata), uri)
Example #28
0
    def find_similar_tracks(self, track, limit=-1, exclude=[]):
        """
            finds tracks from the collection that are similar
            to the passed track.

            @param track: the track to find similar tracks to
            @param limit: limit the returned list to this many
                tracks. If there are more tracks than this
                found, a random selection of those tracks is
                returned.
        """
        logger.debug(u"Searching for %s tracks related to %s", limit, track)
        artists = self.find_similar_artists(track)
        if artists == []:
            return []
        tracks = []
        random.shuffle(artists)
        i = 0
        while (limit > len(tracks) or limit == -1) and i < len(artists):
            artist = artists[i][1].replace('"', '\\\"')
            i += 1
            searchres = search.search_tracks_from_string(
                self.collection, 'artist=="%s"' % artist, case_sensitive=False
            )
            choices = [x.track for x in searchres]
            if choices == []:
                continue
            random.shuffle(choices)
            j = 0
            while j < len(choices):
                track = choices[j]
                if track not in exclude:
                    tracks.append(track)
                    break
                j += 1
        return tracks
Example #29
0
def get_artist_tracks(artist):
    return [
        x.track for x in search.search_tracks_from_string(
            ex.exaile().collection, 'artist=="%s"' %
            artist.lower().replace('"', ''))
    ]
Example #30
0
def artist_in_collection(artist):
    return len([x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, ('artist=="%s"' % artist))])>0
Example #31
0
def tag_in_collection(tag):
    return len([
        x.track
        for x in search.search_tracks_from_string(ex.exaile().collection,
                                                  ('genre=="%s"' % tag))
    ]) > 0
Example #32
0
def get_top_albums(field, limit):
    albums = [x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, '! %s==__null__' % field)]
    albums = util.sort_tracks([field], albums, True)
    return albums[:limit]
Example #33
0
def get_artist_tracks(artist):
    return [x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, 'artist=="%s"'%artist.lower().replace('"', ''))]
Example #34
0
def tag_in_collection(tag):
    return len([x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, ('genre=="%s"' % tag))])>0
Example #35
0
 def _most_played_albums(self, limit=5):
     cds = get_top_albums('__playcount', int(limit))
     if len(cds)>0:
         return self.get_cds_html([x.track for x in search.search_tracks_from_string(
                 ex.exaile().collection, ('album=="%s"' % cd for cd in cds), ['album', 'tracknumber'])])
     return ''
Example #36
0
def get_top_artists(field, limit):
    artists = [x.artist for x in search.search_tracks_from_string(
                ex.exaile().collection, '! %s==__null__' % field)]
    artists = util.sort_tracks([field], artists, True)
    return artists[:limit]
Example #37
0
def album_in_collection(artist, album):
    return len([x.track for x in search.search_tracks_from_string(
                ex.exaile().collection, ('artist=="%s" album=="%s"' % (artist,
		        album)))])>0
Example #38
0
def album_in_collection(artist, album):
    return len([
        x.track
        for x in search.search_tracks_from_string(ex.exaile().collection, (
            'artist=="%s" album=="%s"' % (artist, album)))
    ]) > 0
Example #39
0
def artist_in_collection(artist):
    return len([
        x.track
        for x in search.search_tracks_from_string(ex.exaile().collection,
                                                  ('artist=="%s"' % artist))
    ]) > 0