Ejemplo n.º 1
0
    def test_get_album_list2(self):
        self._make_request('getAlbumList2', error=10)
        self._make_request('getAlbumList2', {'type': 'void'}, error=0)
        self._make_request('getAlbumList2', {
            'type': 'random',
            'size': 'size_t'
        },
                           error=0)
        self._make_request('getAlbumList2', {
            'type': 'newest',
            'offset': '&v + 2'
        },
                           error=0)

        types = [
            'random', 'newest', 'frequent', 'recent', 'starred',
            'alphabeticalByName', 'alphabeticalByArtist'
        ]
        for t in types:
            self._make_request('getAlbumList2', {'type': t},
                               tag='albumList2',
                               skip_post=True)

        rv, child = self._make_request('getAlbumList2', {'type': 'random'},
                                       tag='albumList2',
                                       skip_post=True)

        with db_session:
            Track.get().delete()
            Album.get().delete()
        rv, child = self._make_request('getAlbumList2', {'type': 'random'},
                                       tag='albumList2')
        self.assertEqual(len(child), 0)
Ejemplo n.º 2
0
    def test_get_album_list2(self):
        self._make_request("getAlbumList2", error=10)
        self._make_request("getAlbumList2", {"type": "void"}, error=0)
        self._make_request(
            "getAlbumList2", {"type": "random", "size": "size_t"}, error=0
        )
        self._make_request(
            "getAlbumList2", {"type": "newest", "offset": "&v + 2"}, error=0
        )

        types = [
            "random",
            "newest",
            "frequent",
            "recent",
            "starred",
            "alphabeticalByName",
            "alphabeticalByArtist",
        ]
        for t in types:
            self._make_request(
                "getAlbumList2", {"type": t}, tag="albumList2", skip_post=True
            )

        rv, child = self._make_request(
            "getAlbumList2", {"type": "random"}, tag="albumList2", skip_post=True
        )

        with db_session:
            Track.get().delete()
            Album.get().delete()
        rv, child = self._make_request(
            "getAlbumList2", {"type": "random"}, tag="albumList2"
        )
        self.assertEqual(len(child), 0)
Ejemplo n.º 3
0
    def setUp(self):
        super().setUp()

        with db_session:
            folder = Folder(
                name="Root",
                path=os.path.abspath("tests/assets"),
                root=True,
                cover_art="cover.jpg",
            )
            folder = Folder.get(name="Root")
            self.folderid = folder.id

            artist = Artist(name="Artist")
            album = Album(artist=artist, name="Album")

            track = Track(
                title="23bytes",
                number=1,
                disc=1,
                artist=artist,
                album=album,
                path=os.path.abspath("tests/assets/23bytes"),
                root_folder=folder,
                folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
            self.trackid = track.id

            self.formats = ["mp3", "flac", "ogg", "m4a"]
            for i in range(len(self.formats)):
                track_embeded_art = Track(
                    title="[silence]",
                    number=1,
                    disc=1,
                    artist=artist,
                    album=album,
                    path=os.path.abspath(
                        "tests/assets/formats/silence.{}".format(
                            self.formats[i])),
                    root_folder=folder,
                    folder=folder,
                    duration=2,
                    bitrate=320,
                    last_modification=0,
                )
                self.formats[i] = track_embeded_art.id
Ejemplo n.º 4
0
    def setUp(self):
        super().setUp()

        with db_session:
            Folder(root=True, name="Empty root", path="/tmp")
            root = Folder(root=True, name="Root folder", path="tests/assets")

            for letter in "ABC":
                folder = Folder(
                    name=letter + "rtist",
                    path="tests/assets/{}rtist".format(letter),
                    parent=root,
                )

                artist = Artist(name=letter + "rtist")

                for lether in "AB":
                    afolder = Folder(
                        name=letter + lether + "lbum",
                        path="tests/assets/{0}rtist/{0}{1}lbum".format(
                            letter, lether),
                        parent=folder,
                    )

                    album = Album(name=letter + lether + "lbum", artist=artist)

                    for num, song in enumerate(["One", "Two", "Three"]):
                        Track(
                            disc=1,
                            number=num,
                            title=song,
                            duration=2,
                            album=album,
                            artist=artist,
                            genre="Music!",
                            bitrate=320,
                            path="tests/assets/{0}rtist/{0}{1}lbum/{2}".format(
                                letter, lether, song),
                            last_modification=0,
                            root_folder=root,
                            folder=afolder,
                        )

            self.assertEqual(Folder.select().count(), 11)
            self.assertEqual(Folder.select(lambda f: f.root).count(), 2)
            self.assertEqual(Artist.select().count(), 3)
            self.assertEqual(Album.select().count(), 6)
            self.assertEqual(Track.select().count(), 18)
Ejemplo n.º 5
0
    def setUp(self):
        super(PlaylistTestCase, self).setUp()

        with db_session:
            folder = Folder(name="Root", path="tests/assets", root=True)
            artist = Artist(name="Artist!")
            album = Album(name="Album!", artist=artist)

            track = Track(
                path="tests/assets/23bytes",
                title="23bytes",
                artist=artist,
                album=album,
                folder=folder,
                root_folder=folder,
                duration=2,
                disc=1,
                number=1,
                bitrate=320,
                last_modification=0,
            )

            playlist = Playlist(name="Playlist!", user=User.get(name="alice"))
            for _ in range(4):
                playlist.add(track)

        self.playlistid = playlist.id
Ejemplo n.º 6
0
    def setUp(self):
        super(MediaTestCase, self).setUp()

        self.folder = Folder()
        self.folder.name = 'Root'
        self.folder.path = os.path.abspath('tests/assets')
        self.folder.root = True
        self.folder.has_cover_art = True  # 420x420 PNG

        artist = Artist()
        artist.name = 'Artist'

        album = Album()
        album.artist = artist
        album.name = 'Album'

        self.track = Track()
        self.track.title = '23bytes'
        self.track.number = 1
        self.track.disc = 1
        self.track.artist = artist
        self.track.album = album
        self.track.path = os.path.abspath('tests/assets/23bytes')
        self.track.root_folder = self.folder
        self.track.folder = self.folder
        self.track.duration = 2
        self.track.bitrate = 320
        self.track.content_type = 'audio/mpeg'
        self.track.last_modification = 0

        self.store.add(self.track)
        self.store.commit()
Ejemplo n.º 7
0
    def test_issue133(self):
        scanner = Scanner()
        scanner.queue_folder("folder")
        scanner.run()

        track = Track.select().first()
        self.assertNotIn("\x00", track.title)
Ejemplo n.º 8
0
    def setUp(self):
        super(AnnotationTestCase, self).setUp()

        with db_session:
            root = Folder(name='Root', root=True, path='tests')
            folder = Folder(name='Folder', path='tests/assets', parent=root)
            artist = Artist(name='Artist')
            album = Album(name='Album', artist=artist)

            track = Track(title='Track',
                          album=album,
                          artist=artist,
                          disc=1,
                          number=1,
                          path='tests/assets/empty',
                          folder=folder,
                          root_folder=root,
                          duration=2,
                          bitrate=320,
                          content_type='audio/mpeg',
                          last_modification=0)

            self.folderid = folder.id
            self.artistid = artist.id
            self.albumid = album.id
            self.trackid = track.id
            self.user = User.get(name='alice')
Ejemplo n.º 9
0
    def setUp(self):
        super().setUp()

        with db_session:
            folder = Folder(
                name="Root",
                path=os.path.abspath("tests/assets"),
                root=True,
                cover_art="cover.jpg",
            )
            self.folderid = folder.id

            artist = Artist(name="Artist")
            album = Album(artist=artist, name="Album")

            Track(
                title="23bytes",
                number=1,
                disc=1,
                artist=artist,
                album=album,
                path=os.path.abspath("tests/assets/23bytes"),
                root_folder=folder,
                folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
Ejemplo n.º 10
0
    def setUp(self):
        super(MediaTestCase, self).setUp()

        with db_session:
            folder = Folder(name='Root',
                            path=os.path.abspath('tests/assets'),
                            root=True,
                            cover_art='cover.jpg')
            self.folderid = folder.id

            artist = Artist(name='Artist')
            album = Album(artist=artist, name='Album')

            track = Track(title='23bytes',
                          number=1,
                          disc=1,
                          artist=artist,
                          album=album,
                          path=os.path.abspath('tests/assets/23bytes'),
                          root_folder=folder,
                          folder=folder,
                          duration=2,
                          bitrate=320,
                          content_type='audio/mpeg',
                          last_modification=0)
            self.trackid = track.id
Ejemplo n.º 11
0
    def setUp(self):
        super().setUp()

        with db_session:
            root = Folder(name="Root", root=True, path="tests")
            folder = Folder(name="Folder", path="tests/assets", parent=root)
            artist = Artist(name="Artist")
            album = Album(name="Album", artist=artist)

            # Populate folder ids
            root = Folder.get(name="Root")
            folder = Folder.get(name="Folder")

            track = Track(
                title="Track",
                album=album,
                artist=artist,
                disc=1,
                number=1,
                path="tests/assets/empty",
                folder=folder,
                root_folder=root,
                duration=2,
                bitrate=320,
                last_modification=0,
            )

            self.folderid = folder.id
            self.artistid = artist.id
            self.albumid = album.id
            self.trackid = track.id
            self.user = User.get(name="alice")
Ejemplo n.º 12
0
    def test_get_album_list2(self):
        self._make_request('getAlbumList2', error = 10)
        self._make_request('getAlbumList2', { 'type': 'void' }, error = 0)
        self._make_request('getAlbumList2', { 'type': 'random', 'size': 'size_t' }, error = 0)
        self._make_request('getAlbumList2', { 'type': 'newest', 'offset': '&v + 2' }, error = 0)

        types = [ 'random', 'newest', 'frequent', 'recent', 'starred', 'alphabeticalByName', 'alphabeticalByArtist' ]
        for t in types:
            self._make_request('getAlbumList2', { 'type': t }, tag = 'albumList2', skip_post = True)

        rv, child = self._make_request('getAlbumList2', { 'type': 'random' }, tag = 'albumList2', skip_post = True)

        with db_session:
            Track.get().delete()
            Album.get().delete()
        rv, child = self._make_request('getAlbumList2', { 'type': 'random' }, tag = 'albumList2')
        self.assertEqual(len(child), 0)
Ejemplo n.º 13
0
    def test_get_song(self):
        self._make_request('getSong', error = 10)
        self._make_request('getSong', { 'id': 'nastynasty' }, error = 0)
        self._make_request('getSong', { 'id': str(uuid.uuid4()) }, error = 70)

        with db_session:
            s = Track.select().first()
        self._make_request('getSong', { 'id': str(s.id) }, tag = 'song')
Ejemplo n.º 14
0
    def test_get_song(self):
        self._make_request("getSong", error=10)
        self._make_request("getSong", {"id": "nastynasty"}, error=0)
        self._make_request("getSong", {"id": str(uuid.uuid4())}, error=70)

        with db_session:
            s = Track.select().first()
        self._make_request("getSong", {"id": str(s.id)}, tag="song")
Ejemplo n.º 15
0
    def test_get_song(self):
        self._make_request('getSong', error=10)
        self._make_request('getSong', {'id': 'nastynasty'}, error=0)
        self._make_request('getSong', {'id': str(uuid.uuid4())}, error=70)

        with db_session:
            s = Track.select().first()
        self._make_request('getSong', {'id': str(s.id)}, tag='song')
Ejemplo n.º 16
0
    def setUp(self):
        super(MediaTestCase, self).setUp()

        with db_session:
            folder = Folder(name='Root',
                            path=os.path.abspath('tests/assets'),
                            root=True,
                            cover_art='cover.jpg')
            self.folderid = folder.id

            artist = Artist(name='Artist')
            album = Album(artist=artist, name='Album')

            track = Track(title='23bytes',
                          number=1,
                          disc=1,
                          artist=artist,
                          album=album,
                          path=os.path.abspath('tests/assets/23bytes'),
                          root_folder=folder,
                          folder=folder,
                          duration=2,
                          bitrate=320,
                          content_type='audio/mpeg',
                          last_modification=0)
            self.trackid = track.id

            self.formats = [('mp3', 'mpeg'), ('flac', 'flac'), ('ogg', 'ogg')]
            for i in range(len(self.formats)):
                track_embeded_art = Track(
                    title='[silence]',
                    number=1,
                    disc=1,
                    artist=artist,
                    album=album,
                    path=os.path.abspath(
                        'tests/assets/formats/silence.{0}'.format(
                            self.formats[i][0])),
                    root_folder=folder,
                    folder=folder,
                    duration=2,
                    bitrate=320,
                    content_type='audio/{0}'.format(self.formats[i][1]),
                    last_modification=0)
                self.formats[i] = track_embeded_art.id
Ejemplo n.º 17
0
    def setUp(self):
        super(BrowseTestCase, self).setUp()

        with db_session:
            Folder(root = True, name = 'Empty root', path = '/tmp')
            root = Folder(root = True, name = 'Root folder', path = 'tests/assets')

            for letter in 'ABC':
                folder = Folder(
                    name = letter + 'rtist',
                    path = 'tests/assets/{}rtist'.format(letter),
                    parent = root
                )

                artist = Artist(name = letter + 'rtist')

                for lether in 'AB':
                    afolder = Folder(
                        name = letter + lether + 'lbum',
                        path = 'tests/assets/{0}rtist/{0}{1}lbum'.format(letter, lether),
                        parent = folder
                    )

                    album = Album(name = letter + lether + 'lbum', artist = artist)

                    for num, song in enumerate([ 'One', 'Two', 'Three' ]):
                        track = Track(
                            disc = 1,
                            number = num,
                            title = song,
                            duration = 2,
                            album = album,
                            artist = artist,
                            bitrate = 320,
                            path = 'tests/assets/{0}rtist/{0}{1}lbum/{2}'.format(letter, lether, song),
                            last_modification = 0,
                            root_folder = root,
                            folder = afolder
                        )

            self.assertEqual(Folder.select().count(), 11)
            self.assertEqual(Folder.select(lambda f: f.root).count(), 2)
            self.assertEqual(Artist.select().count(), 3)
            self.assertEqual(Album.select().count(), 6)
            self.assertEqual(Track.select().count(), 18)
Ejemplo n.º 18
0
 def test_add_multiple(self):
     self._addfile()
     self._addfile()
     self._addfile()
     self.assertTrackCountEqual(0)
     self._sleep()
     with db_session:
         self.assertEqual(Track.select().count(), 3)
         self.assertEqual(Artist.select().count(), 1)
Ejemplo n.º 19
0
    def setUp(self):
        super().setUp()

        with db_session:
            FolderManager.add("Folder", "tests/assets/folder")
            scanner = Scanner()
            scanner.queue_folder("Folder")
            scanner.run()

            self.trackid = Track.get().id
Ejemplo n.º 20
0
    def setUp(self):
        super().setUp()

        with db_session:
            FolderManager.add("folder", os.path.abspath("tests/assets/folder"))
            scanner = Scanner()
            scanner.queue_folder("folder")
            scanner.run()

            self.trackid = Track.select().first().id
            self.userid = User.get(name="alice").id
Ejemplo n.º 21
0
    def setUp(self):
        super(TranscodingTestCase, self).setUp()
        self._patch_client()

        with db_session:
            folder = FolderManager.add('Folder', 'tests/assets/folder')
            scanner = Scanner()
            scanner.scan(folder)
            scanner.finish()

            self.trackid = Track.get().id
Ejemplo n.º 22
0
    def setUp(self):
        super(TranscodingTestCase, self).setUp()
        self._patch_client()

        with db_session:
            folder = FolderManager.add('Folder', 'tests/assets/folder')
            scanner = Scanner()
            scanner.scan(folder)
            scanner.finish()

            self.trackid = Track.get().id
Ejemplo n.º 23
0
    def setUp(self):
        super(TranscodingTestCase, self).setUp()
        self._patch_client()

        with db_session:
            folder = FolderManager.add("Folder", "tests/assets/folder")
            scanner = Scanner()
            scanner.queue_folder("Folder")
            scanner.run()

            self.trackid = Track.get().id
Ejemplo n.º 24
0
    def test_rename(self):
        path = self._addfile()
        self._sleep()

        trackid = None
        with db_session:
            self.assertEqual(Track.select().count(), 1)
            trackid = Track.select().first().id

        newpath = self._temppath(".mp3")
        shutil.move(path, newpath)
        self._sleep()

        with db_session:
            track = Track.select().first()
            self.assertIsNotNone(track)
            self.assertNotEqual(track.path, path)
            self.assertEqual(track.path, newpath)
            self.assertEqual(
                track._path_hash,
                memoryview(sha1(newpath.encode("utf-8")).digest()))
            self.assertEqual(track.id, trackid)
Ejemplo n.º 25
0
    def setUp(self):
        super().setUp()

        with db_session:
            folder = Folder(
                name="Root",
                path=os.path.abspath("tests/assets/lyrics"),
                root=True,
            )

            artist = Artist(name="Artist")
            album = Album(artist=artist, name="Album")

            Track(
                title="Nope",
                number=1,
                disc=1,
                artist=artist,
                album=album,
                path=os.path.abspath("tests/assets/lyrics/empty.mp3"),
                root_folder=folder,
                folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
            Track(
                title="Yay",
                number=1,
                disc=1,
                artist=artist,
                album=album,
                path=os.path.abspath("tests/assets/lyrics/withlyrics.mp3"),
                root_folder=folder,
                folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
Ejemplo n.º 26
0
    def test_update_playlist(self):
        self._make_request('updatePlaylist', error = 10)
        self._make_request('updatePlaylist', { 'playlistId': 1234 }, error = 0)
        self._make_request('updatePlaylist', { 'playlistId': str(uuid.uuid4()) }, error = 70)

        with db_session:
            playlist = Playlist.select(lambda p: p.user.name == 'alice').order_by(Playlist.created).first()
        pid = str(playlist.id)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': 'string' }, error = 0)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': 'string' }, error = 0)

        name = str(playlist.name)
        self._make_request('updatePlaylist', { 'u': 'bob', 'p': 'B0b', 'playlistId': pid, 'name': 'new name' }, error = 50)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(child.get('name'), name)
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'name': 'new name' }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(child.get('name'), 'new name')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ -1, 2 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 0, 2 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 1)
        self.assertEqual(self._find(child, './entry').get('title'), 'Three')

        with db_session:
            songs = { s.title: str(s.id) for s in Track.select() }

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': [ songs['One'], songs['Two'], songs['Two'] ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'One', 'Two', 'Two' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 2, 1 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'Two' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': songs['One'] }, skip_post = True)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 1, 1 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'One' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': str(uuid.uuid4()) }, error = 70)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)
Ejemplo n.º 27
0
    def test_create_playlist(self):
        self._make_request('createPlaylist', error = 10)
        self._make_request('createPlaylist', { 'name': 'wrongId', 'songId': 'abc' }, error = 0)
        self._make_request('createPlaylist', { 'name': 'unknownId', 'songId': str(uuid.uuid4()) }, error = 70)
        self._make_request('createPlaylist', { 'playlistId': 'abc' }, error = 0)
        self._make_request('createPlaylist', { 'playlistId': str(uuid.uuid4()) }, error = 70)

        # create
        self._make_request('createPlaylist', { 'name': 'new playlist' }, skip_post = True)
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)
        playlist = self._find(child, "./playlist[@name='new playlist']")
        self.assertEqual(len(playlist), 0)

        # "update" newly created
        self._make_request('createPlaylist', { 'playlistId': playlist.get('id') })
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)

        # renaming
        self._make_request('createPlaylist', { 'playlistId': playlist.get('id'), 'name': 'renamed' })
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)
        self.assertIsNone(self._find(child, "./playlist[@name='new playlist']"))
        playlist = self._find(child, "./playlist[@name='renamed']")
        self.assertIsNotNone(playlist)

        # update from other user
        self._make_request('createPlaylist', { 'u': 'bob', 'p': 'B0b', 'playlistId': playlist.get('id') }, error = 50)

        # create more useful playlist
        with db_session:
            songs = { s.title: str(s.id) for s in Track.select() }
        self._make_request('createPlaylist', { 'name': 'songs', 'songId': list(map(lambda s: songs[s], [ 'Three', 'One', 'Two' ])) }, skip_post = True)
        with db_session:
            playlist = Playlist.get(name = 'songs')
        self.assertIsNotNone(playlist)
        rv, child = self._make_request('getPlaylist', { 'id': str(playlist.id) }, tag = 'playlist')
        self.assertEqual(child.get('songCount'), '3')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 3)
        self.assertEqual(child[0].get('title'), 'Three')
        self.assertEqual(child[1].get('title'), 'One')
        self.assertEqual(child[2].get('title'), 'Two')

        # update
        self._make_request('createPlaylist', { 'playlistId': str(playlist.id), 'songId': songs['Two'] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': str(playlist.id) }, tag = 'playlist')
        self.assertEqual(child.get('songCount'), '1')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 1)
        self.assertEqual(child[0].get('title'), 'Two')
Ejemplo n.º 28
0
    def test_create_playlist(self):
        self._make_request('createPlaylist', error = 10)
        self._make_request('createPlaylist', { 'name': 'wrongId', 'songId': 'abc' }, error = 0)
        self._make_request('createPlaylist', { 'name': 'unknownId', 'songId': str(uuid.uuid4()) }, error = 70)
        self._make_request('createPlaylist', { 'playlistId': 'abc' }, error = 0)
        self._make_request('createPlaylist', { 'playlistId': str(uuid.uuid4()) }, error = 70)

        # create
        self._make_request('createPlaylist', { 'name': 'new playlist' }, skip_post = True)
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)
        playlist = self._find(child, "./playlist[@name='new playlist']")
        self.assertEqual(len(playlist), 0)

        # "update" newly created
        self._make_request('createPlaylist', { 'playlistId': playlist.get('id') })
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)

        # renaming
        self._make_request('createPlaylist', { 'playlistId': playlist.get('id'), 'name': 'renamed' })
        rv, child = self._make_request('getPlaylists', tag = 'playlists')
        self.assertEqual(len(child), 3)
        self.assertIsNone(self._find(child, "./playlist[@name='new playlist']"))
        playlist = self._find(child, "./playlist[@name='renamed']")
        self.assertIsNotNone(playlist)

        # update from other user
        self._make_request('createPlaylist', { 'u': 'bob', 'p': 'B0b', 'playlistId': playlist.get('id') }, error = 50)

        # create more useful playlist
        with db_session:
            songs = { s.title: str(s.id) for s in Track.select() }
        self._make_request('createPlaylist', { 'name': 'songs', 'songId': list(map(lambda s: songs[s], [ 'Three', 'One', 'Two' ])) }, skip_post = True)
        with db_session:
            playlist = Playlist.get(name = 'songs')
        self.assertIsNotNone(playlist)
        rv, child = self._make_request('getPlaylist', { 'id': str(playlist.id) }, tag = 'playlist')
        self.assertEqual(child.get('songCount'), '3')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 3)
        self.assertEqual(child[0].get('title'), 'Three')
        self.assertEqual(child[1].get('title'), 'One')
        self.assertEqual(child[2].get('title'), 'Two')

        # update
        self._make_request('createPlaylist', { 'playlistId': str(playlist.id), 'songId': songs['Two'] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': str(playlist.id) }, tag = 'playlist')
        self.assertEqual(child.get('songCount'), '1')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 1)
        self.assertEqual(child[0].get('title'), 'Two')
Ejemplo n.º 29
0
    def test_update_playlist(self):
        self._make_request('updatePlaylist', error = 10)
        self._make_request('updatePlaylist', { 'playlistId': 1234 }, error = 0)
        self._make_request('updatePlaylist', { 'playlistId': str(uuid.uuid4()) }, error = 70)

        with db_session:
            playlist = Playlist.select(lambda p: p.user.name == 'alice').order_by(Playlist.created).first()
        pid = str(playlist.id)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': 'string' }, error = 0)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': 'string' }, error = 0)

        name = str(playlist.name)
        self._make_request('updatePlaylist', { 'u': 'bob', 'p': 'B0b', 'playlistId': pid, 'name': 'new name' }, error = 50)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(child.get('name'), name)
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'name': 'new name' }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(child.get('name'), 'new name')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ -1, 2 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 0, 2 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 1)
        self.assertEqual(self._find(child, './entry').get('title'), 'Three')

        with db_session:
            songs = { s.title: str(s.id) for s in Track.select() }

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': [ songs['One'], songs['Two'], songs['Two'] ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'One', 'Two', 'Two' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 2, 1 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'Two' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': songs['One'] }, skip_post = True)
        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIndexToRemove': [ 1, 1 ] }, skip_post = True)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertSequenceEqual(self._xpath(child, './entry/@title'), [ 'Three', 'One' ])

        self._make_request('updatePlaylist', { 'playlistId': pid, 'songIdToAdd': str(uuid.uuid4()) }, error = 70)
        rv, child = self._make_request('getPlaylist', { 'id': pid }, tag = 'playlist')
        self.assertEqual(self._xpath(child, 'count(./entry)'), 2)
Ejemplo n.º 30
0
    def test_change(self):
        path = self._addfile()
        self._sleep()

        trackid = None
        with db_session:
            self.assertEqual(Track.select().count(), 1)
            self.assertEqual(
                Artist.select(lambda a: a.name == "Some artist").count(), 1)
            trackid = Track.select().first().id

        tags = mutagen.File(path, easy=True)
        tags["artist"] = "Renamed"
        tags.save()
        self._sleep()

        with db_session:
            self.assertEqual(Track.select().count(), 1)
            self.assertEqual(
                Artist.select(lambda a: a.name == "Some artist").count(), 0)
            self.assertEqual(
                Artist.select(lambda a: a.name == "Renamed").count(), 1)
            self.assertEqual(Track.select().first().id, trackid)
Ejemplo n.º 31
0
    def setUp(self):
        super().setUp()

        with db_session:
            folder = Folder(name="Root", root=True, path="tests/assets")
            artist = Artist(name="Artist")
            album = Album(name="Album", artist=artist)

            Track(
                title="Track 1",
                album=album,
                artist=artist,
                disc=1,
                number=1,
                year=123,
                path="tests/assets/folder/1",
                folder=folder,
                root_folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
            Track(
                title="Track 2",
                album=album,
                artist=artist,
                disc=1,
                number=1,
                year=124,
                genre="Lampshade",
                path="tests/assets/folder/2",
                folder=folder,
                root_folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
Ejemplo n.º 32
0
    def setUp(self):
        super(BrowseTestCase, self).setUp()

        with db_session:
            Folder(root = True, name = 'Empty root', path = '/tmp')
            root = Folder(root = True, name = 'Root folder', path = 'tests/assets')

            for letter in 'ABC':
                folder = Folder(
                    name = letter + 'rtist',
                    path = 'tests/assets/{}rtist'.format(letter),
                    parent = root
                )

                artist = Artist(name = letter + 'rtist')

                for lether in 'AB':
                    afolder = Folder(
                        name = letter + lether + 'lbum',
                        path = 'tests/assets/{0}rtist/{0}{1}lbum'.format(letter, lether),
                        parent = folder
                    )

                    album = Album(name = letter + lether + 'lbum', artist = artist)

                    for num, song in enumerate([ 'One', 'Two', 'Three' ]):
                        track = Track(
                            disc = 1,
                            number = num,
                            title = song,
                            duration = 2,
                            album = album,
                            artist = artist,
                            bitrate = 320,
                            path = 'tests/assets/{0}rtist/{0}{1}lbum/{2}'.format(letter, lether, song),
                            content_type = 'audio/mpeg',
                            last_modification = 0,
                            root_folder = root,
                            folder = afolder
                        )

            self.assertEqual(Folder.select().count(), 11)
            self.assertEqual(Folder.select(lambda f: f.root).count(), 2)
            self.assertEqual(Artist.select().count(), 3)
            self.assertEqual(Album.select().count(), 6)
            self.assertEqual(Track.select().count(), 18)
Ejemplo n.º 33
0
    def setUp(self):
        super(AlbumSongsTestCase, self).setUp()

        with db_session:
            folder = Folder(name='Root', root=True, path='tests/assets')
            artist = Artist(name='Artist')
            album = Album(name='Album', artist=artist)

            track = Track(title='Track',
                          album=album,
                          artist=artist,
                          disc=1,
                          number=1,
                          path='tests/assets/empty',
                          folder=folder,
                          root_folder=folder,
                          duration=2,
                          bitrate=320,
                          last_modification=0)
Ejemplo n.º 34
0
    def setUp(self):
        super(AlbumSongsTestCase, self).setUp()

        with db_session:
            folder = Folder(name="Root", root=True, path="tests/assets")
            artist = Artist(name="Artist")
            album = Album(name="Album", artist=artist)

            track = Track(
                title="Track",
                album=album,
                artist=artist,
                disc=1,
                number=1,
                path="tests/assets/empty",
                folder=folder,
                root_folder=folder,
                duration=2,
                bitrate=320,
                last_modification=0,
            )
Ejemplo n.º 35
0
    def setUp(self):
        super(PlaylistTestCase, self).setUp()

        with db_session:
            root = Folder(root=True, name="Root folder", path="tests/assets")
            artist = Artist(name="Artist")
            album = Album(name="Album", artist=artist)

            songs = {}
            for num, song in enumerate(["One", "Two", "Three", "Four"]):
                track = Track(
                    disc=1,
                    number=num,
                    title=song,
                    duration=2,
                    album=album,
                    artist=artist,
                    bitrate=320,
                    path="tests/assets/" + song,
                    last_modification=0,
                    root_folder=root,
                    folder=root,
                )
                songs[song] = track

            users = {u.name: u for u in User.select()}

            playlist = Playlist(user=users["alice"], name="Alice's")
            playlist.add(songs["One"])
            playlist.add(songs["Three"])

            playlist = Playlist(user=users["alice"],
                                public=True,
                                name="Alice's public")
            playlist.add(songs["One"])
            playlist.add(songs["Two"])

            playlist = Playlist(user=users["bob"], name="Bob's")
            playlist.add(songs["Two"])
            playlist.add(songs["Four"])
Ejemplo n.º 36
0
    def setUp(self):
        super(PlaylistTestCase, self).setUp()

        with db_session:
            root = Folder(root = True, name = 'Root folder', path = 'tests/assets')
            artist = Artist(name = 'Artist')
            album = Album(name = 'Album', artist = artist)

            songs = {}
            for num, song in enumerate([ 'One', 'Two', 'Three', 'Four' ]):
                track = Track(
                    disc = 1,
                    number = num,
                    title = song,
                    duration = 2,
                    album = album,
                    artist = artist,
                    bitrate = 320,
                    path = 'tests/assets/' + song,
                    content_type = 'audio/mpeg',
                    last_modification = 0,
                    root_folder = root,
                    folder = root
                )
                songs[song] = track

            users = { u.name: u for u in User.select() }

            playlist = Playlist(user = users['alice'], name = "Alice's")
            playlist.add(songs['One'])
            playlist.add(songs['Three'])

            playlist = Playlist(user = users['alice'], public = True, name = "Alice's public")
            playlist.add(songs['One'])
            playlist.add(songs['Two'])

            playlist = Playlist(user = users['bob'], name = "Bob's")
            playlist.add(songs['Two'])
            playlist.add(songs['Four'])
Ejemplo n.º 37
0
    def setUp(self):
        super(PlaylistTestCase, self).setUp()

        root = Folder()
        root.root = True
        root.name = 'Root folder'
        root.path = 'tests/assets'
        self.store.add(root)

        artist = Artist()
        artist.name = 'Artist'

        album = Album()
        album.name = 'Album'
        album.artist = artist

        songs = {}
        for num, song in enumerate([ 'One', 'Two', 'Three', 'Four' ]):
            track = Track()
            track.disc = 1
            track.number = num
            track.title = song
            track.duration = 2
            track.album = album
            track.artist = artist
            track.bitrate = 320
            track.path = 'tests/assets/empty'
            track.content_type = 'audio/mpeg'
            track.last_modification = 0
            track.root_folder = root
            track.folder = root

            self.store.add(track)
            songs[song] = track

        users = { u.name: u for u in self.store.find(User) }

        playlist = Playlist()
        playlist.user = users['alice']
        playlist.name = "Alice's"
        playlist.add(songs['One'])
        playlist.add(songs['Three'])
        self.store.add(playlist)

        playlist = Playlist()
        playlist.user = users['alice']
        playlist.public = True
        playlist.name = "Alice's public"
        playlist.add(songs['One'])
        playlist.add(songs['Two'])
        self.store.add(playlist)

        playlist = Playlist()
        playlist.user = users['bob']
        playlist.name = "Bob's"
        playlist.add(songs['Two'])
        playlist.add(songs['Four'])
        self.store.add(playlist)

        self.store.commit()
Ejemplo n.º 38
0
    def setUp(self):
        super(PlaylistTestCase, self).setUp()

        folder = Folder()
        folder.name = 'Root'
        folder.path = 'tests/assets'
        folder.root = True

        artist = Artist()
        artist.name = 'Artist!'

        album = Album()
        album.name = 'Album!'
        album.artist = artist

        track = Track()
        track.path = 'tests/assets/23bytes'
        track.title = '23bytes'
        track.artist = artist
        track.album = album
        track.folder = folder
        track.root_folder = folder
        track.duration = 2
        track.disc = 1
        track.number = 1
        track.content_type = 'audio/mpeg'
        track.bitrate = 320
        track.last_modification = 0

        playlist = Playlist()
        playlist.name = 'Playlist!'
        playlist.user = self.store.find(User, User.name == 'alice').one()
        for _ in range(4):
            playlist.add(track)

        self.store.add(track)
        self.store.add(playlist)
        self.store.commit()

        self.playlist = playlist
Ejemplo n.º 39
0
    def setUp(self):
        super(BrowseTestCase, self).setUp()

        empty = Folder()
        empty.root = True
        empty.name = 'Empty root'
        empty.path = '/tmp'
        self.store.add(empty)

        root = Folder()
        root.root = True
        root.name = 'Root folder'
        root.path = 'tests/assets'
        self.store.add(root)

        for letter in 'ABC':
            folder = Folder()
            folder.name = letter + 'rtist'
            folder.path = 'tests/assets/{}rtist'.format(letter)
            folder.parent = root

            artist = Artist()
            artist.name = letter + 'rtist'

            for lether in 'AB':
                afolder = Folder()
                afolder.name = letter + lether + 'lbum'
                afolder.path = 'tests/assets/{0}rtist/{0}{1}lbum'.format(letter, lether)
                afolder.parent = folder

                album = Album()
                album.name = letter + lether + 'lbum'
                album.artist = artist

                for num, song in enumerate([ 'One', 'Two', 'Three' ]):
                    track = Track()
                    track.disc = 1
                    track.number = num
                    track.title = song
                    track.duration = 2
                    track.album = album
                    track.artist = artist
                    track.bitrate = 320
                    track.path = 'tests/assets/{0}rtist/{0}{1}lbum/{2}'.format(letter, lether, song)
                    track.content_type = 'audio/mpeg'
                    track.last_modification = 0
                    track.root_folder = root
                    track.folder = afolder
                    self.store.add(track)

        self.store.commit()

        self.assertEqual(self.store.find(Folder).count(), 11)
        self.assertEqual(self.store.find(Folder, Folder.root == True).count(), 2)
        self.assertEqual(self.store.find(Artist).count(), 3)
        self.assertEqual(self.store.find(Album).count(), 6)
        self.assertEqual(self.store.find(Track).count(), 18)
Ejemplo n.º 40
0
	def scan_file(self, path):
		tr = self.__store.find(Track, Track.path == path).one()
		add = False
		if tr:
			if not self.__force and not int(os.path.getmtime(path)) > tr.last_modification:
				return

			tag = self.__try_load_tag(path)
			if not tag:
				self.remove_file(path)
				return
		else:
			tag = self.__try_load_tag(path)
			if not tag:
				return

			tr = Track()
			tr.path = path
			add = True

		artist      = self.__try_read_tag(tag, 'artist', '')
		album       = self.__try_read_tag(tag, 'album', '')
		albumartist = self.__try_read_tag(tag, 'albumartist', artist)

		tr.disc     = self.__try_read_tag(tag, 'discnumber',  1, lambda x: int(x[0].split('/')[0]))
		tr.number   = self.__try_read_tag(tag, 'tracknumber', 1, lambda x: int(x[0].split('/')[0]))
		tr.title    = self.__try_read_tag(tag, 'title', '')
		tr.year     = self.__try_read_tag(tag, 'date', None, lambda x: int(x[0].split('-')[0]))
		tr.genre    = self.__try_read_tag(tag, 'genre')
		tr.duration = int(tag.info.length)

		tr.bitrate  = (tag.info.bitrate if hasattr(tag.info, 'bitrate') else int(os.path.getsize(path) * 8 / tag.info.length)) / 1000
		tr.content_type = get_mime(os.path.splitext(path)[1][1:])
		tr.last_modification = os.path.getmtime(path)

		tralbum = self.__find_album(albumartist, album)
		trartist = self.__find_artist(artist)

		if add:
			trroot = self.__find_root_folder(path)
			trfolder = self.__find_folder(path)

			# Set the references at the very last as searching for them will cause the added track to be flushed, even if
			# it is incomplete, causing not null constraints errors.
			tr.album = tralbum
			tr.artist = trartist
			tr.folder = trfolder
			tr.root_folder = trroot

			self.__store.add(tr)
			self.__added_tracks += 1
		else:
			if tr.album.id != tralbum.id:
				self.__albums_to_check.add(tr.album)
				tr.album = tralbum

			if tr.artist.id != trartist.id:
				self.__artists_to_check.add(tr.artist)
				tr.artist = trartist