Пример #1
0
    def test_build_queries(self):
        spl = SmartPlaylistPlugin()
        self.assertEqual(spl._matched_playlists, None)
        self.assertEqual(spl._unmatched_playlists, None)

        config['smartplaylist']['playlists'].set([])
        spl.build_queries()
        self.assertEqual(spl._matched_playlists, set())
        self.assertEqual(spl._unmatched_playlists, set())

        config['smartplaylist']['playlists'].set([
            {'name': u'foo',
             'query': u'FOO foo'},
            {'name': u'bar',
             'album_query': [u'BAR bar1', u'BAR bar2']},
            {'name': u'baz',
             'query': u'BAZ baz',
             'album_query': u'BAZ baz'}
        ])
        spl.build_queries()
        self.assertEqual(spl._matched_playlists, set())
        foo_foo = parse_query_string(u'FOO foo', Item)
        baz_baz = parse_query_string(u'BAZ baz', Item)
        baz_baz2 = parse_query_string(u'BAZ baz', Album)
        bar_bar = OrQuery((parse_query_string(u'BAR bar1', Album)[0],
                           parse_query_string(u'BAR bar2', Album)[0]))
        self.assertEqual(spl._unmatched_playlists, set([
            (u'foo', foo_foo, (None, None)),
            (u'baz', baz_baz, baz_baz2),
            (u'bar', (None, None), (bar_bar, None)),
        ]))
Пример #2
0
    def test_build_queries_with_sorts(self):
        spl = SmartPlaylistPlugin()
        config['smartplaylist']['playlists'].set([
            {'name': u'no_sort',
             'query': u'foo'},
            {'name': u'one_sort',
             'query': u'foo year+'},
            {'name': u'only_empty_sorts',
             'query': [u'foo', u'bar']},
            {'name': u'one_non_empty_sort',
             'query': [u'foo year+', u'bar']},
            {'name': u'multiple_sorts',
             'query': [u'foo year+', u'bar genre-']},
            {'name': u'mixed',
             'query': [u'foo year+', u'bar', u'baz genre+ id-']}
        ])

        spl.build_queries()
        sorts = dict((name, sort)
                     for name, (_, sort), _ in spl._unmatched_playlists)

        asseq = self.assertEqual  # less cluttered code
        S = FixedFieldSort  # short cut since we're only dealing with this
        asseq(sorts["no_sort"], NullSort())
        asseq(sorts["one_sort"], S(u'year'))
        asseq(sorts["only_empty_sorts"], None)
        asseq(sorts["one_non_empty_sort"], S(u'year'))
        asseq(sorts["multiple_sorts"],
              MultipleSort([S('year'), S(u'genre', False)]))
        asseq(sorts["mixed"],
              MultipleSort([S('year'), S(u'genre'), S(u'id', False)]))
Пример #3
0
    def test_db_changes(self):
        spl = SmartPlaylistPlugin()

        nones = None, None
        pl1 = '1', (u'q1', None), nones
        pl2 = '2', (u'q2', None), nones
        pl3 = '3', (u'q3', None), nones

        spl._unmatched_playlists = set([pl1, pl2, pl3])
        spl._matched_playlists = set()

        spl.matches = Mock(return_value=False)
        spl.db_change(None, u"nothing")
        self.assertEqual(spl._unmatched_playlists, set([pl1, pl2, pl3]))
        self.assertEqual(spl._matched_playlists, set())

        spl.matches.side_effect = lambda _, q, __: q == u'q3'
        spl.db_change(None, u"matches 3")
        self.assertEqual(spl._unmatched_playlists, set([pl1, pl2]))
        self.assertEqual(spl._matched_playlists, set([pl3]))

        spl.matches.side_effect = lambda _, q, __: q == u'q1'
        spl.db_change(None, u"matches 3")
        self.assertEqual(spl._matched_playlists, set([pl1, pl3]))
        self.assertEqual(spl._unmatched_playlists, set([pl2]))
Пример #4
0
    def test_playlist_update(self):
        spl = SmartPlaylistPlugin()

        i = Mock(path='/tagada.mp3')
        i.evaluate_template.side_effect = lambda x, _: x
        q = Mock()
        a_q = Mock()
        lib = Mock()
        lib.items.return_value = [i]
        lib.albums.return_value = []
        pl = 'my_playlist.m3u', (q, None), (a_q, None)
        spl._matched_playlists = [pl]

        dir = mkdtemp()
        config['smartplaylist']['relative_to'] = False
        config['smartplaylist']['playlist_dir'] = dir
        try:
            spl.update_playlists(lib)
        except Exception:
            rmtree(dir)
            raise

        lib.items.assert_called_once_with(q, None)
        lib.albums.assert_called_once_with(a_q, None)

        m3u_filepath = path.join(dir, pl[0])
        self.assertTrue(path.exists(m3u_filepath))
        with open(syspath(m3u_filepath), 'r') as f:
            content = f.read()
        rmtree(dir)

        self.assertEqual(content, "/tagada.mp3\n")
Пример #5
0
    def test_playlist_update(self):
        spl = SmartPlaylistPlugin()

        i = Mock(path=b'/tagada.mp3')
        i.evaluate_template.side_effect = lambda x, _: x
        q = Mock()
        a_q = Mock()
        lib = Mock()
        lib.items.return_value = [i]
        lib.albums.return_value = []
        pl = b'my_playlist.m3u', (q, None), (a_q, None)
        spl._matched_playlists = [pl]

        dir = bytestring_path(mkdtemp())
        config['smartplaylist']['relative_to'] = False
        config['smartplaylist']['playlist_dir'] = py3_path(dir)
        try:
            spl.update_playlists(lib)
        except Exception:
            rmtree(dir)
            raise

        lib.items.assert_called_once_with(q, None)
        lib.albums.assert_called_once_with(a_q, None)

        m3u_filepath = path.join(dir, pl[0])
        self.assertTrue(path.exists(m3u_filepath))
        with open(syspath(m3u_filepath), 'rb') as f:
            content = f.read()
        rmtree(dir)

        self.assertEqual(content, b'/tagada.mp3\n')
Пример #6
0
    def test_build_queries_with_sorts(self):
        spl = SmartPlaylistPlugin()
        config['smartplaylist']['playlists'].set([
            {'name': 'no_sort', 'query': 'foo'},
            {'name': 'one_sort', 'query': 'foo year+'},
            {'name': 'only_empty_sorts', 'query': ['foo', 'bar']},
            {'name': 'one_non_empty_sort', 'query': ['foo year+', 'bar']},
            {'name': 'multiple_sorts', 'query': ['foo year+', 'bar genre-']},
            {'name': 'mixed', 'query': ['foo year+', 'bar', 'baz genre+ id-']}
        ])

        spl.build_queries()
        sorts = dict((name, sort)
                     for name, (_, sort), _ in spl._unmatched_playlists)

        asseq = self.assertEqual  # less cluttered code
        S = FixedFieldSort  # short cut since we're only dealing with this
        asseq(sorts["no_sort"], NullSort())
        asseq(sorts["one_sort"], S('year'))
        asseq(sorts["only_empty_sorts"], None)
        asseq(sorts["one_non_empty_sort"], S('year'))
        asseq(sorts["multiple_sorts"],
              MultipleSort([S('year'), S('genre', False)]))
        asseq(sorts["mixed"],
              MultipleSort([S('year'), S('genre'), S('id', False)]))
Пример #7
0
    def test_build_queries(self):
        spl = SmartPlaylistPlugin()
        self.assertEqual(spl._matched_playlists, None)
        self.assertEqual(spl._unmatched_playlists, None)

        config['smartplaylist']['playlists'].set([])
        spl.build_queries()
        self.assertEqual(spl._matched_playlists, set())
        self.assertEqual(spl._unmatched_playlists, set())

        config['smartplaylist']['playlists'].set([
            {'name': 'foo',
             'query': 'FOO foo'},
            {'name': 'bar',
             'album_query': ['BAR bar1', 'BAR bar2']},
            {'name': 'baz',
             'query': 'BAZ baz',
             'album_query': 'BAZ baz'}
        ])
        spl.build_queries()
        self.assertEqual(spl._matched_playlists, set())
        foo_foo = parse_query_string('FOO foo', Item)
        baz_baz = parse_query_string('BAZ baz', Item)
        baz_baz2 = parse_query_string('BAZ baz', Album)
        bar_bar = OrQuery((parse_query_string('BAR bar1', Album)[0],
                           parse_query_string('BAR bar2', Album)[0]))
        self.assertEqual(spl._unmatched_playlists, set([
            ('foo', foo_foo, (None, None)),
            ('baz', baz_baz, baz_baz2),
            ('bar', (None, None), (bar_bar, None)),
        ]))
Пример #8
0
    def test_playlist_update(self):
        spl = SmartPlaylistPlugin()

        i = Mock(path=b'/tagada.mp3')
        i.evaluate_template.side_effect = \
            lambda pl, _: pl.replace(b'$title', b'ta:ga:da').decode()

        lib = Mock()
        lib.replacements = CHAR_REPLACE
        lib.items.return_value = [i]
        lib.albums.return_value = []

        q = Mock()
        a_q = Mock()
        pl = b'$title-my<playlist>.m3u', (q, None), (a_q, None)
        spl._matched_playlists = [pl]

        dir = bytestring_path(mkdtemp())
        config['smartplaylist']['relative_to'] = False
        config['smartplaylist']['playlist_dir'] = py3_path(dir)
        try:
            spl.update_playlists(lib)
        except Exception:
            rmtree(dir)
            raise

        lib.items.assert_called_once_with(q, None)
        lib.albums.assert_called_once_with(a_q, None)

        m3u_filepath = path.join(dir, b'ta_ga_da-my_playlist_.m3u')
        self.assertTrue(path.exists(m3u_filepath))
        with open(syspath(m3u_filepath), 'rb') as f:
            content = f.read()
        rmtree(dir)

        self.assertEqual(content, b'/tagada.mp3\n')
Пример #9
0
    def test_playlist_update(self):
        spl = SmartPlaylistPlugin()

        i = Mock(path=b'/tagada.mp3')
        i.evaluate_template.side_effect = \
            lambda pl, _: pl.replace(b'$title', b'ta:ga:da').decode()

        lib = Mock()
        lib.replacements = CHAR_REPLACE
        lib.items.return_value = [i]
        lib.albums.return_value = []

        q = Mock()
        a_q = Mock()
        pl = b'$title-my<playlist>.m3u', (q, None), (a_q, None)
        spl._matched_playlists = [pl]

        dir = bytestring_path(mkdtemp())
        config['smartplaylist']['relative_to'] = False
        config['smartplaylist']['playlist_dir'] = py3_path(dir)
        try:
            spl.update_playlists(lib)
        except Exception:
            rmtree(dir)
            raise

        lib.items.assert_called_once_with(q, None)
        lib.albums.assert_called_once_with(a_q, None)

        m3u_filepath = path.join(dir, b'ta_ga_da-my_playlist_.m3u')
        self.assertTrue(path.exists(m3u_filepath))
        with open(syspath(m3u_filepath), 'rb') as f:
            content = f.read()
        rmtree(dir)

        self.assertEqual(content, b'/tagada.mp3\n')
Пример #10
0
    def test_matches(self):
        spl = SmartPlaylistPlugin()

        a = MagicMock(Album)
        i = MagicMock(Item)

        self.assertFalse(spl.matches(i, None, None))
        self.assertFalse(spl.matches(a, None, None))

        query = Mock()
        query.match.side_effect = {i: True}.__getitem__
        self.assertTrue(spl.matches(i, query, None))
        self.assertFalse(spl.matches(a, query, None))

        a_query = Mock()
        a_query.match.side_effect = {a: True}.__getitem__
        self.assertFalse(spl.matches(i, None, a_query))
        self.assertTrue(spl.matches(a, None, a_query))

        self.assertTrue(spl.matches(i, query, a_query))
        self.assertTrue(spl.matches(a, query, a_query))
Пример #11
0
    def test_matches(self):
        spl = SmartPlaylistPlugin()

        a = MagicMock(Album)
        i = MagicMock(Item)

        self.assertFalse(spl.matches(i, None, None))
        self.assertFalse(spl.matches(a, None, None))

        query = Mock()
        query.match.side_effect = {i: True}.__getitem__
        self.assertTrue(spl.matches(i, query, None))
        self.assertFalse(spl.matches(a, query, None))

        a_query = Mock()
        a_query.match.side_effect = {a: True}.__getitem__
        self.assertFalse(spl.matches(i, None, a_query))
        self.assertTrue(spl.matches(a, None, a_query))

        self.assertTrue(spl.matches(i, query, a_query))
        self.assertTrue(spl.matches(a, query, a_query))
Пример #12
0
    def test_db_changes(self):
        spl = SmartPlaylistPlugin()

        nones = None, None
        pl1 = '1', (u'q1', None), nones
        pl2 = '2', (u'q2', None), nones
        pl3 = '3', (u'q3', None), nones

        spl._unmatched_playlists = set([pl1, pl2, pl3])
        spl._matched_playlists = set()

        spl.matches = Mock(return_value=False)
        spl.db_change(None, u"nothing")
        self.assertEqual(spl._unmatched_playlists, set([pl1, pl2, pl3]))
        self.assertEqual(spl._matched_playlists, set())

        spl.matches.side_effect = lambda _, q, __: q == u'q3'
        spl.db_change(None, u"matches 3")
        self.assertEqual(spl._unmatched_playlists, set([pl1, pl2]))
        self.assertEqual(spl._matched_playlists, set([pl3]))

        spl.matches.side_effect = lambda _, q, __: q == u'q1'
        spl.db_change(None, u"matches 3")
        self.assertEqual(spl._matched_playlists, set([pl1, pl3]))
        self.assertEqual(spl._unmatched_playlists, set([pl2]))
Пример #13
0
    def test_db_changes(self):
        spl = SmartPlaylistPlugin()

        i1 = MagicMock(Item)
        i2 = MagicMock(Item)
        a = MagicMock(Album)
        i1.get_album.return_value = a

        q1 = Mock()
        q1.matches.side_effect = {i1: False, i2: False}.__getitem__
        a_q1 = Mock()
        a_q1.matches.side_effect = {a: True}.__getitem__
        q2 = Mock()
        q2.matches.side_effect = {i1: False, i2: True}.__getitem__

        pl1 = '1', (q1, None), (a_q1, None)
        pl2 = '2', (None, None), (a_q1, None)
        pl3 = '3', (q2, None), (None, None)

        spl._unmatched_playlists = set([pl1, pl2, pl3])
        spl._matched_playlists = set()
        spl.db_change(None, i1)
        self.assertEqual(spl._unmatched_playlists, set([pl2]))
        self.assertEqual(spl._matched_playlists, set([pl1, pl3]))

        spl._unmatched_playlists = set([pl1, pl2, pl3])
        spl._matched_playlists = set()
        spl.db_change(None, i2)
        self.assertEqual(spl._unmatched_playlists, set([pl2]))
        self.assertEqual(spl._matched_playlists, set([pl1, pl3]))

        spl._unmatched_playlists = set([pl1, pl2, pl3])
        spl._matched_playlists = set()
        spl.db_change(None, a)
        self.assertEqual(spl._unmatched_playlists, set([pl3]))
        self.assertEqual(spl._matched_playlists, set([pl1, pl2]))
        spl.db_change(None, i2)
        self.assertEqual(spl._unmatched_playlists, set())
        self.assertEqual(spl._matched_playlists, set([pl1, pl2, pl3]))