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
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 []
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 ''
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 ''
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
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)
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]
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 )
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]
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
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 []
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)
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()
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 ''
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()
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)
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
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()
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)
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"
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()
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
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
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"
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)
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
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
def get_artist_tracks(artist): return [ x.track for x in search.search_tracks_from_string( ex.exaile().collection, 'artist=="%s"' % artist.lower().replace('"', '')) ]
def artist_in_collection(artist): return len([x.track for x in search.search_tracks_from_string( ex.exaile().collection, ('artist=="%s"' % artist))])>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
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]
def get_artist_tracks(artist): return [x.track for x in search.search_tracks_from_string( ex.exaile().collection, 'artist=="%s"'%artist.lower().replace('"', ''))]
def tag_in_collection(tag): return len([x.track for x in search.search_tracks_from_string( ex.exaile().collection, ('genre=="%s"' % tag))])>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 ''
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]
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
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
def artist_in_collection(artist): return len([ x.track for x in search.search_tracks_from_string(ex.exaile().collection, ('artist=="%s"' % artist)) ]) > 0