def debug(): config = Config(db_url='sqlite:////home/andrew/.uykfgdb') session = startup(config) for data in session.query(CacheData).filter(CacheData.exception == True).all(): print('key %r' % data.key) print('value %r' % decode_value(data.value)) session.query(CacheData).filter(CacheData.exception == True).delete()
def show(names): config = Config.default() session = startup(config) for name in names: for artist in session.query(Artist).filter(Artist.name.like(name)).all(): try: nest_artist = session.query(NestArtist).filter(NestArtist.artists.any(id=artist.id)).one() print('%s (%s)' % (artist.name, nest_artist.name)) except NoResultFound: nest_artist = None print('%s' % artist.name) print(' tags:\n %s' % ' '.join('"%s"' % tag.text for tag in artist.tags)) print(' albums:') for album in session.query(Album).join(Track).join(Artist)\ .filter(Artist.id == artist.id).distinct().all(): print(' %s' % album.name) if nest_artist: for other in nest_artist.artists: if other != artist: for album in session.query(Album).join(Track).join(Artist)\ .filter(Artist.id == other.id).distinct().all(): print(' %s (as %s)' % (album.name, other.name)) print(' linked to:') for link in session.query(Link).filter(Link.src == artist): print(' %s' % link.dst.name) print(' linked from:') for link in session.query(Link).filter(Link.dst == artist): print(' %s' % link.src.name)
def next(constraints): config = Config.default() session = startup(config) count, inc_tag, exc_tag, inc_artist, exc_artist, path = parse_constraints(constraints) tracks = session.query(Track).join(Artist) if inc_artist: query = session.query(Artist.id).filter(or_(Artist.name.like(name) for name in inc_artist)) tracks = tracks.filter(Artist.id.in_(query)) if exc_artist: query = session.query(Artist.id).filter(or_(Artist.name.like(name) for name in exc_artist)) tracks = tracks.filter(~Artist.id.in_(query)) if inc_tag: query = session.query(Artist.id).join(Artist.tags).filter(or_(Tag.text.like(tag) for tag in inc_tag)) tracks = tracks.filter(Artist.id.in_(query)) if exc_tag: query = session.query(Artist.id).join(Artist.tags).filter(or_(Tag.text.like(tag) for tag in exc_tag)) tracks = tracks.filter(~Artist.id.in_(query)) if path: (path, file) = split(path) track = session.query(Track).join(Album).filter(Album.path == path, Track.file == file).one() neighbours = all_neighbours(session, track, config.max_links) tracks = tracks.filter(Track.id.in_(neighbours)) for track in tracks.order_by(random()).limit(count): print('file://%s' % join(track.album.path, track.file))
def test_network(self): session = startup(Config(db_url='sqlite:///')) alice = Artist(name='alice') session.add(alice) bob = Artist(name='bob') session.add(bob) session.add(Link(src=bob, dst=alice)) assert len(alice.srcs) == 1, alice.srcs assert alice.srcs[0].src == bob
def drop(name): warning('deleting %s' % name) config = Config.default() session = startup(config) finder = Finder(config, session) for artist in session.query(Artist).filter(Artist.name == name).all(): for track in session.query(Track).filter(Track.artist_id == artist.id).all(): warning('deleting %s from %s' % (track.name, track.album)) session.delete(track) session.commit() cull_artists(session, finder) cull_albums(session)
def add(count, names): config = Config.default() session = startup(config) tracks = session.query(Track.id) for name in names: debug('filtering by %s' % name) query = session.query(Track.id).join(Artist).join(Artist.tags) if name.startswith('-'): tracks = query.filter(Track.id.in_(tracks), not_(Artist.tags.any(Tag.text.like(name[1:])))) else: tracks = query.filter(Track.id.in_(tracks), Artist.tags.any(Tag.text.like(name))) tracks = session.query(Track).filter(Track.id.in_(tracks)).order_by(random()).limit(count) add_tracks(session, config, tracks.all())
def who(names): config = Config.default() session = startup(config) artists = session.query(Artist.id) for name in names: debug('filtering by %s' % name) query = session.query(Artist.id).join(Artist.tags) if name.startswith('-'): artists = query.filter(Artist.id.in_(artists), not_(Artist.tags.any(Tag.text.like(name[1:])))) else: artists = query.filter(Artist.id.in_(artists), Artist.tags.any(Tag.text.like(name))) for artist in session.query(Artist).filter(Artist.id.in_(artists)).order_by(Artist.name): print(artist.name)
def test_db(self): session = startup(Config(db_url='sqlite:///', modules=['uykfg.nest'])) nest_artist = NestArtist() session.add(nest_artist) session.commit() artist = Artist(name='bob', tag_id=nest_artist.id) nest_artist.artist = artist session.add(artist) session.commit() session = Session() artists = session.query(Artist).all() assert len(artists) == 1, artists nest_artists = session.query(NestArtist).all() assert len(nest_artists) == 1, nest_artists assert nest_artists[0].artist == artists[0]
def test_fallback(self): config = Config(db_url='sqlite://') session = startup(config) cached_explode = Cache(explode, session) # first time, sets cache assert 'value' == cached_explode(1) # second time, uses fallback assert 'value' == cached_explode(1) # third time, new cache (new key) try: cached_explode(2) assert False, 'expected error' except Exception: pass # fourth time, not fallback try: cached_explode(1) assert False, 'expected error' except Exception: pass
def test_catalogue(self): session = startup(Config(db_url='sqlite:///')) artist = Artist(name='bob') session.add(artist) track1 = Track(name='track1', artist=artist, number='1', file='file1', modified=time()) session.add(track1) track2 = Track(name='track2', artist=artist, number='2', file='file2', modified=time()) session.add(track2) album = Album(name='album', tracks=[track1, track2], path='/') session.add(album) session.commit() artists = session.query(Artist).all() assert len(artists) == 1, artists assert len(artists[0].tracks) == 2, artists[0].tracks tracks = session.query(Track).all() assert len(tracks) == 2, tracks albums = session.query(Album).all() assert len(albums) == 1, albums assert tracks[0].album == albums[0]
def test_cache(self): config = Config(db_url='sqlite://') session = startup(config) cached_stringify = Cache(stringify, session) self._assert(stringify(1, 2, three=4), "(1, 2) {'three': 4}") self._assert(cached_stringify(1, 2, three=4), "(1, 2) {'three': 4}") assert cached_stringify.hits == 0, cached_stringify.hits assert cached_stringify.misses == 1, cached_stringify.misses self._assert(cached_stringify(1, 2, three=4), "(1, 2) {'three': 4}") assert cached_stringify.hits == 1, cached_stringify.hits assert cached_stringify.misses == 1, cached_stringify.misses self._assert(cached_stringify(1, 2, three=5), "(1, 2) {'three': 5}") assert cached_stringify.misses == 2, cached_stringify.misses assert cached_stringify._owner.total_size == 154, cached_stringify._owner.total_size cached_stringify = Cache(stringify, session, max_size=77, value_lifetime=1) self._assert(cached_stringify(1, 2, three=6), "(1, 2) {'three': 6}") assert cached_stringify.misses == 1, cached_stringify.misses assert cached_stringify._owner.total_size == 77, cached_stringify._owner.total_size sleep(3) self._assert(cached_stringify(1, 2, three=7), "(1, 2) {'three': 7}") assert cached_stringify.misses == 2, cached_stringify.misses assert cached_stringify._owner.total_size == 77, cached_stringify._owner.total_size
def scan(all): config = Config.default() session = startup(config) finder = Finder(config, session) scan_all(session, finder, config, all)
def scan_directory(self, file): config = Config(mp3_path=join(parent(__file__), file), db_url='sqlite:///') # config = Config(mp3_path=join(parent(__file__), file), db_url='sqlite:////tmp/test.sql') session = startup(config) scan_all(session, DummyFinder(), config) return session, config
def finder(self): config = Config.default() session = startup(config) return session, Finder(config, session)
def play(): config = Config.default() session = startup(config) play_links(session, config)
def link(): config = Config.default() session = startup(config) linker = Linker(config, session) link_all(session, linker)
.filter(NestArtist.artists.any(id=artist.id)).one() def local_artist(self, session, id3name): for artist in session.query(Artist).filter(Artist.name == id3name): if not session.query(NestArtist).filter(NestArtist.artists.any(id=artist.id)).count(): debug('existing local artist %s' % id3name) return artist debug('creating local artist %s' % id3name) artist = Artist(name=id3name) session.add(artist) return artist def delete_artist(self, session, artist): try: nest_artist = self._nest_artist_from_music_artist(session, artist) nest_artist.artists.remove(artist) except NoResultFound: debug('no nest artist for %s' % artist.name) if __name__ == '__main__': config = Config.default() session = startup(config) finder = Finder(config, session) class Object: pass id3 = Object() id3.artist = 'Miles' id3.title = 'Blue' print(finder.find_artist(session, id3))
def transfer(root, size): config = Config.default() session = startup(config) transfer_size(session, config, root, size)