Exemplo n.º 1
0
    def test_scan(self, mock_scan):
        mock_scan.return_value = {
            'tags': {
                'image': [GIF_DATA, PNG_DATA],
                'preview-image': [JPEG_DATA]
            }
        }

        album = Album(name='foo')
        track = Track(uri=b'local:track:foo.mp3', album=album)
        images = ['/images/' + name for name in GIF_NAME, PNG_NAME, JPEG_NAME]
        image_track = track.copy(album=album.copy(images=images))

        self.library.add(track)
        mock_library.add.assert_called_with(image_track, None, None)
        self.assertTrue(os.path.isfile(os.path.join(self.tempdir, GIF_NAME)))
        self.assertTrue(os.path.isfile(os.path.join(self.tempdir, PNG_NAME)))
        self.assertTrue(os.path.isfile(os.path.join(self.tempdir, JPEG_NAME)))

        self.library.close()
        self.assertEqual(os.listdir(self.tempdir), [])
Exemplo n.º 2
0
 def test_copying_track_with_private_internal_value(self):
     artist1 = Artist(name="foo")
     artist2 = Artist(name="bar")
     track = Track(artists=[artist1])
     copy = track.copy(artists=[artist2])
     self.assertIn(artist2, copy.artists)
Exemplo n.º 3
0
 def test_copying_track_with_missing_values(self):
     track = Track(uri="bar")
     copy = track.copy(name="baz")
     self.assertEqual("baz", copy.name)
     self.assertEqual("bar", copy.uri)
Exemplo n.º 4
0
 def test_copying_track(self):
     track = Track()
     self.compare(track, track.copy())
Exemplo n.º 5
0
 def test_copying_track_with_private_internal_value(self):
     artist1 = Artist(name='foo')
     artist2 = Artist(name='bar')
     track = Track(artists=[artist1])
     copy = track.copy(artists=[artist2])
     self.assertIn(artist2, copy.artists)
Exemplo n.º 6
0
 def test_copying_track_with_missing_values(self):
     track = Track(uri='bar')
     copy = track.copy(name='baz')
     self.assertEqual('baz', copy.name)
     self.assertEqual('bar', copy.uri)
Exemplo n.º 7
0
 def test_copying_track(self):
     track = Track()
     self.compare(track, track.copy())
Exemplo n.º 8
0
 def test_copying_track_with_missing_values(self):
     track = Track(uri='bar')
     copy = track.copy(name='baz')
     self.assertEqual('baz', copy.name)
     self.assertEqual('bar', copy.uri)
Exemplo n.º 9
0
class TranslatorTest(unittest.TestCase):
    def setUp(self):
        self.data = {
            'uri': 'uri',
            'duration': 4531000000,
            'mtime': 1234,
            'tags': {
                'album': ['album'],
                'track-number': [1],
                'artist': ['artist'],
                'composer': ['composer'],
                'performer': ['performer'],
                'album-artist': ['albumartist'],
                'title': ['track'],
                'track-count': [2],
                'album-disc-number': [2],
                'album-disc-count': [3],
                'date': [FakeGstDate(2006, 1, 1,)],
                'container-format': ['ID3 tag'],
                'genre': ['genre'],
                'comment': ['comment'],
                'musicbrainz-trackid': ['trackid'],
                'musicbrainz-albumid': ['albumid'],
                'musicbrainz-artistid': ['artistid'],
                'musicbrainz-albumartistid': ['albumartistid'],
                'bitrate': [1000],
            },
        }

        artist = Artist(name='artist', musicbrainz_id='artistid')
        composer = Artist(name='composer')
        performer = Artist(name='performer')
        albumartist = Artist(name='albumartist',
                             musicbrainz_id='albumartistid')

        album = Album(name='album', num_tracks=2, num_discs=3,
                      musicbrainz_id='albumid', artists=[albumartist])

        self.track = Track(uri='uri', name='track', date='2006-01-01',
                           genre='genre', track_no=1, disc_no=2, length=4531,
                           comment='comment', musicbrainz_id='trackid',
                           last_modified=1234, album=album, bitrate=1000,
                           artists=[artist], composers=[composer],
                           performers=[performer])

    def check(self, expected):
        actual = scan.audio_data_to_track(self.data)
        self.assertEqual(expected, actual)

    def test_track(self):
        self.check(self.track)

    def test_none_track_length(self):
        self.data['duration'] = None
        self.check(self.track.copy(length=None))

    def test_none_track_last_modified(self):
        self.data['mtime'] = None
        self.check(self.track.copy(last_modified=None))

    def test_missing_track_no(self):
        del self.data['tags']['track-number']
        self.check(self.track.copy(track_no=None))

    def test_multiple_track_no(self):
        self.data['tags']['track-number'].append(9)
        self.check(self.track)

    def test_missing_track_disc_no(self):
        del self.data['tags']['album-disc-number']
        self.check(self.track.copy(disc_no=None))

    def test_multiple_track_disc_no(self):
        self.data['tags']['album-disc-number'].append(9)
        self.check(self.track)

    def test_missing_track_name(self):
        del self.data['tags']['title']
        self.check(self.track.copy(name=None))

    def test_multiple_track_name(self):
        self.data['tags']['title'] = ['name1', 'name2']
        self.check(self.track.copy(name='name1; name2'))

    def test_missing_track_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-trackid']
        self.check(self.track.copy(musicbrainz_id=None))

    def test_multiple_track_musicbrainz_id(self):
        self.data['tags']['musicbrainz-trackid'].append('id')
        self.check(self.track)

    def test_missing_track_bitrate(self):
        del self.data['tags']['bitrate']
        self.check(self.track.copy(bitrate=None))

    def test_multiple_track_bitrate(self):
        self.data['tags']['bitrate'].append(1234)
        self.check(self.track)

    def test_missing_track_genre(self):
        del self.data['tags']['genre']
        self.check(self.track.copy(genre=None))

    def test_multiple_track_genre(self):
        self.data['tags']['genre'] = ['genre1', 'genre2']
        self.check(self.track.copy(genre='genre1; genre2'))

    def test_missing_track_date(self):
        del self.data['tags']['date']
        self.check(self.track.copy(date=None))

    def test_multiple_track_date(self):
        self.data['tags']['date'].append(FakeGstDate(2030, 1, 1))
        self.check(self.track)

    def test_invalid_track_date(self):
        self.data['tags']['date'] = [FakeGstDate(65535, 1, 1)]
        self.check(self.track.copy(date=None))

    def test_missing_track_comment(self):
        del self.data['tags']['comment']
        self.check(self.track.copy(comment=None))

    def test_multiple_track_comment(self):
        self.data['tags']['comment'] = ['comment1', 'comment2']
        self.check(self.track.copy(comment='comment1; comment2'))

    def test_missing_track_artist_name(self):
        del self.data['tags']['artist']
        self.check(self.track.copy(artists=[]))

    def test_multiple_track_artist_name(self):
        self.data['tags']['artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        self.check(self.track.copy(artists=artists))

    def test_missing_track_artist_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-artistid']
        artist = list(self.track.artists)[0].copy(musicbrainz_id=None)
        self.check(self.track.copy(artists=[artist]))

    def test_multiple_track_artist_musicbrainz_id(self):
        self.data['tags']['musicbrainz-artistid'].append('id')
        self.check(self.track)

    def test_missing_track_composer_name(self):
        del self.data['tags']['composer']
        self.check(self.track.copy(composers=[]))

    def test_multiple_track_composer_name(self):
        self.data['tags']['composer'] = ['composer1', 'composer2']
        composers = [Artist(name='composer1'), Artist(name='composer2')]
        self.check(self.track.copy(composers=composers))

    def test_missing_track_performer_name(self):
        del self.data['tags']['performer']
        self.check(self.track.copy(performers=[]))

    def test_multiple_track_performe_name(self):
        self.data['tags']['performer'] = ['performer1', 'performer2']
        performers = [Artist(name='performer1'), Artist(name='performer2')]
        self.check(self.track.copy(performers=performers))

    def test_missing_album_name(self):
        del self.data['tags']['album']
        album = self.track.album.copy(name=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_name(self):
        self.data['tags']['album'].append('album2')
        self.check(self.track)

    def test_missing_album_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-albumid']
        album = self.track.album.copy(musicbrainz_id=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_musicbrainz_id(self):
        self.data['tags']['musicbrainz-albumid'].append('id')
        self.check(self.track)

    def test_missing_album_num_tracks(self):
        del self.data['tags']['track-count']
        album = self.track.album.copy(num_tracks=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_tracks(self):
        self.data['tags']['track-count'].append(9)
        self.check(self.track)

    def test_missing_album_num_discs(self):
        del self.data['tags']['album-disc-count']
        album = self.track.album.copy(num_discs=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_discs(self):
        self.data['tags']['album-disc-count'].append(9)
        self.check(self.track)

    def test_missing_album_artist_name(self):
        del self.data['tags']['album-artist']
        album = self.track.album.copy(artists=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_name(self):
        self.data['tags']['album-artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        album = self.track.album.copy(artists=artists)
        self.check(self.track.copy(album=album))

    def test_missing_album_artist_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-albumartistid']
        albumartist = list(self.track.album.artists)[0]
        albumartist = albumartist.copy(musicbrainz_id=None)
        album = self.track.album.copy(artists=[albumartist])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_musicbrainz_id(self):
        self.data['tags']['musicbrainz-albumartistid'].append('id')
        self.check(self.track)

    def test_stream_organization_track_name(self):
        del self.data['tags']['title']
        self.data['tags']['organization'] = ['organization']
        self.check(self.track.copy(name='organization'))

    def test_multiple_organization_track_name(self):
        del self.data['tags']['title']
        self.data['tags']['organization'] = ['organization1', 'organization2']
        self.check(self.track.copy(name='organization1; organization2'))

    # TODO: combine all comment types?
    def test_stream_location_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['location'] = ['location']
        self.check(self.track.copy(comment='location'))

    def test_multiple_location_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['location'] = ['location1', 'location2']
        self.check(self.track.copy(comment='location1; location2'))

    def test_stream_copyright_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['copyright'] = ['copyright']
        self.check(self.track.copy(comment='copyright'))

    def test_multiple_copyright_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['copyright'] = ['copyright1', 'copyright2']
        self.check(self.track.copy(comment='copyright1; copyright2'))
Exemplo n.º 10
0
class TagsToTrackTest(unittest.TestCase):
    def setUp(self):  # noqa: N802
        self.tags = {
            'album': ['album'],
            'track-number': [1],
            'artist': ['artist'],
            'composer': ['composer'],
            'performer': ['performer'],
            'album-artist': ['albumartist'],
            'title': ['track'],
            'track-count': [2],
            'album-disc-number': [2],
            'album-disc-count': [3],
            'date': [datetime.date(
                2006,
                1,
                1,
            )],
            'container-format': ['ID3 tag'],
            'genre': ['genre'],
            'comment': ['comment'],
            'musicbrainz-trackid': ['trackid'],
            'musicbrainz-albumid': ['albumid'],
            'musicbrainz-artistid': ['artistid'],
            'musicbrainz-albumartistid': ['albumartistid'],
            'bitrate': [1000],
        }

        artist = Artist(name='artist', musicbrainz_id='artistid')
        composer = Artist(name='composer')
        performer = Artist(name='performer')
        albumartist = Artist(name='albumartist',
                             musicbrainz_id='albumartistid')

        album = Album(name='album',
                      num_tracks=2,
                      num_discs=3,
                      musicbrainz_id='albumid',
                      artists=[albumartist])

        self.track = Track(name='track',
                           date='2006-01-01',
                           genre='genre',
                           track_no=1,
                           disc_no=2,
                           comment='comment',
                           musicbrainz_id='trackid',
                           album=album,
                           bitrate=1000,
                           artists=[artist],
                           composers=[composer],
                           performers=[performer])

    def check(self, expected):
        actual = utils.convert_tags_to_track(self.tags)
        self.assertEqual(expected, actual)

    def test_track(self):
        self.check(self.track)

    def test_missing_track_no(self):
        del self.tags['track-number']
        self.check(self.track.copy(track_no=None))

    def test_multiple_track_no(self):
        self.tags['track-number'].append(9)
        self.check(self.track)

    def test_missing_track_disc_no(self):
        del self.tags['album-disc-number']
        self.check(self.track.copy(disc_no=None))

    def test_multiple_track_disc_no(self):
        self.tags['album-disc-number'].append(9)
        self.check(self.track)

    def test_missing_track_name(self):
        del self.tags['title']
        self.check(self.track.copy(name=None))

    def test_multiple_track_name(self):
        self.tags['title'] = ['name1', 'name2']
        self.check(self.track.copy(name='name1; name2'))

    def test_missing_track_musicbrainz_id(self):
        del self.tags['musicbrainz-trackid']
        self.check(self.track.copy(musicbrainz_id=None))

    def test_multiple_track_musicbrainz_id(self):
        self.tags['musicbrainz-trackid'].append('id')
        self.check(self.track)

    def test_missing_track_bitrate(self):
        del self.tags['bitrate']
        self.check(self.track.copy(bitrate=None))

    def test_multiple_track_bitrate(self):
        self.tags['bitrate'].append(1234)
        self.check(self.track)

    def test_missing_track_genre(self):
        del self.tags['genre']
        self.check(self.track.copy(genre=None))

    def test_multiple_track_genre(self):
        self.tags['genre'] = ['genre1', 'genre2']
        self.check(self.track.copy(genre='genre1; genre2'))

    def test_missing_track_date(self):
        del self.tags['date']
        self.check(self.track.copy(date=None))

    def test_multiple_track_date(self):
        self.tags['date'].append(datetime.date(2030, 1, 1))
        self.check(self.track)

    def test_missing_track_comment(self):
        del self.tags['comment']
        self.check(self.track.copy(comment=None))

    def test_multiple_track_comment(self):
        self.tags['comment'] = ['comment1', 'comment2']
        self.check(self.track.copy(comment='comment1; comment2'))

    def test_missing_track_artist_name(self):
        del self.tags['artist']
        self.check(self.track.copy(artists=[]))

    def test_multiple_track_artist_name(self):
        self.tags['artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        self.check(self.track.copy(artists=artists))

    def test_missing_track_artist_musicbrainz_id(self):
        del self.tags['musicbrainz-artistid']
        artist = list(self.track.artists)[0].copy(musicbrainz_id=None)
        self.check(self.track.copy(artists=[artist]))

    def test_multiple_track_artist_musicbrainz_id(self):
        self.tags['musicbrainz-artistid'].append('id')
        self.check(self.track)

    def test_missing_track_composer_name(self):
        del self.tags['composer']
        self.check(self.track.copy(composers=[]))

    def test_multiple_track_composer_name(self):
        self.tags['composer'] = ['composer1', 'composer2']
        composers = [Artist(name='composer1'), Artist(name='composer2')]
        self.check(self.track.copy(composers=composers))

    def test_missing_track_performer_name(self):
        del self.tags['performer']
        self.check(self.track.copy(performers=[]))

    def test_multiple_track_performe_name(self):
        self.tags['performer'] = ['performer1', 'performer2']
        performers = [Artist(name='performer1'), Artist(name='performer2')]
        self.check(self.track.copy(performers=performers))

    def test_missing_album_name(self):
        del self.tags['album']
        self.check(self.track.copy(album=None))

    def test_multiple_album_name(self):
        self.tags['album'].append('album2')
        self.check(self.track)

    def test_missing_album_musicbrainz_id(self):
        del self.tags['musicbrainz-albumid']
        album = self.track.album.copy(musicbrainz_id=None, images=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_musicbrainz_id(self):
        self.tags['musicbrainz-albumid'].append('id')
        self.check(self.track)

    def test_missing_album_num_tracks(self):
        del self.tags['track-count']
        album = self.track.album.copy(num_tracks=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_tracks(self):
        self.tags['track-count'].append(9)
        self.check(self.track)

    def test_missing_album_num_discs(self):
        del self.tags['album-disc-count']
        album = self.track.album.copy(num_discs=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_discs(self):
        self.tags['album-disc-count'].append(9)
        self.check(self.track)

    def test_missing_album_artist_name(self):
        del self.tags['album-artist']
        album = self.track.album.copy(artists=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_name(self):
        self.tags['album-artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        album = self.track.album.copy(artists=artists)
        self.check(self.track.copy(album=album))

    def test_missing_album_artist_musicbrainz_id(self):
        del self.tags['musicbrainz-albumartistid']
        albumartist = list(self.track.album.artists)[0]
        albumartist = albumartist.copy(musicbrainz_id=None)
        album = self.track.album.copy(artists=[albumartist])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_musicbrainz_id(self):
        self.tags['musicbrainz-albumartistid'].append('id')
        self.check(self.track)

    def test_stream_organization_track_name(self):
        del self.tags['title']
        self.tags['organization'] = ['organization']
        self.check(self.track.copy(name='organization'))

    def test_multiple_organization_track_name(self):
        del self.tags['title']
        self.tags['organization'] = ['organization1', 'organization2']
        self.check(self.track.copy(name='organization1; organization2'))

    # TODO: combine all comment types?
    def test_stream_location_track_comment(self):
        del self.tags['comment']
        self.tags['location'] = ['location']
        self.check(self.track.copy(comment='location'))

    def test_multiple_location_track_comment(self):
        del self.tags['comment']
        self.tags['location'] = ['location1', 'location2']
        self.check(self.track.copy(comment='location1; location2'))

    def test_stream_copyright_track_comment(self):
        del self.tags['comment']
        self.tags['copyright'] = ['copyright']
        self.check(self.track.copy(comment='copyright'))

    def test_multiple_copyright_track_comment(self):
        del self.tags['comment']
        self.tags['copyright'] = ['copyright1', 'copyright2']
        self.check(self.track.copy(comment='copyright1; copyright2'))
Exemplo n.º 11
0
from mopidy.models import Track
from mopidy.utils.path import path_to_uri

from tests import path_to_data_dir

data_dir = path_to_data_dir('')
song1_path = path_to_data_dir('song1.mp3')
song2_path = path_to_data_dir('song2.mp3')
encoded_path = path_to_data_dir('æøå.mp3')
song1_uri = path_to_uri(song1_path)
song2_uri = path_to_uri(song2_path)
encoded_uri = path_to_uri(encoded_path)
song1_track = Track(uri=song1_uri)
song2_track = Track(uri=song2_uri)
encoded_track = Track(uri=encoded_uri)
song1_ext_track = song1_track.copy(name='song1')
song2_ext_track = song2_track.copy(name='song2', length=60000)
encoded_ext_track = encoded_track.copy(name='æøå')

# FIXME use mock instead of tempfile.NamedTemporaryFile


class M3UToUriTest(unittest.TestCase):
    def test_empty_file(self):
        tracks = parse_m3u(path_to_data_dir('empty.m3u'), data_dir)
        self.assertEqual([], tracks)

    def test_basic_file(self):
        tracks = parse_m3u(path_to_data_dir('one.m3u'), data_dir)
        self.assertEqual([song1_track], tracks)
Exemplo n.º 12
0
from mopidy.models import Track
from mopidy.utils.path import path_to_uri

from tests import path_to_data_dir

data_dir = path_to_data_dir('')
song1_path = path_to_data_dir('song1.mp3')
song2_path = path_to_data_dir('song2.mp3')
encoded_path = path_to_data_dir('æøå.mp3')
song1_uri = path_to_uri(song1_path)
song2_uri = path_to_uri(song2_path)
encoded_uri = path_to_uri(encoded_path)
song1_track = Track(uri=song1_uri)
song2_track = Track(uri=song2_uri)
encoded_track = Track(uri=encoded_uri)
song1_ext_track = song1_track.copy(name='song1')
song2_ext_track = song2_track.copy(name='song2', length=60000)
encoded_ext_track = encoded_track.copy(name='æøå')


# FIXME use mock instead of tempfile.NamedTemporaryFile

class M3UToUriTest(unittest.TestCase):
    def test_empty_file(self):
        tracks = parse_m3u(path_to_data_dir('empty.m3u'), data_dir)
        self.assertEqual([], tracks)

    def test_basic_file(self):
        tracks = parse_m3u(path_to_data_dir('one.m3u'), data_dir)
        self.assertEqual([song1_track], tracks)
Exemplo n.º 13
0
def parse_m3u(file_path, media_dir=None):
    r"""
    Convert M3U file list to list of tracks

    Example M3U data::

        # This is a comment
        Alternative\Band - Song.mp3
        Classical\Other Band - New Song.mp3
        Stuff.mp3
        D:\More Music\Foo.mp3
        http://www.example.com:8000/Listen.pls
        http://www.example.com/~user/Mine.mp3

    Example extended M3U data::

        #EXTM3U
        #EXTINF:123, Sample artist - Sample title
        Sample.mp3
        #EXTINF:321,Example Artist - Example title
        Greatest Hits\Example.ogg
        #EXTINF:-1,Radio XMP
        http://mp3stream.example.com:8000/

    - Relative paths of songs should be with respect to location of M3U.
    - Paths are normally platform specific.
    - Lines starting with # are ignored, except for extended M3U directives.
    - Track.name and Track.length are set from extended M3U directives.
    - m3u files are latin-1.
    """
    # TODO: uris as bytes
    tracks = []
    try:
        with open(file_path) as m3u:
            contents = m3u.readlines()
    except IOError as error:
        logger.warning('Couldn\'t open m3u: %s', locale_decode(error))
        return tracks

    if not contents:
        return tracks

    extended = contents[0].decode('latin1').startswith('#EXTM3U')

    track = Track()
    for line in contents:
        line = line.strip().decode('latin1')

        if line.startswith('#'):
            if extended and line.startswith('#EXTINF'):
                track = m3u_extinf_to_track(line)
            continue

        if urlparse.urlsplit(line).scheme:
            tracks.append(track.copy(uri=line))
        elif os.path.normpath(line) == os.path.abspath(line):
            path = path_to_uri(line)
            tracks.append(track.copy(uri=path))
        elif media_dir is not None:
            path = path_to_uri(os.path.join(media_dir, line))
            tracks.append(track.copy(uri=path))

        track = Track()
    return tracks
Exemplo n.º 14
0
class TranslatorTest(unittest.TestCase):
    def setUp(self):
        self.data = {
            'uri': 'uri',
            'duration': 4531000000,
            'mtime': 1234,
            'tags': {
                'album': ['album'],
                'track-number': [1],
                'artist': ['artist'],
                'composer': ['composer'],
                'performer': ['performer'],
                'album-artist': ['albumartist'],
                'title': ['track'],
                'track-count': [2],
                'album-disc-number': [2],
                'album-disc-count': [3],
                'date': [FakeGstDate(
                    2006,
                    1,
                    1,
                )],
                'container-format': ['ID3 tag'],
                'genre': ['genre'],
                'comment': ['comment'],
                'musicbrainz-trackid': ['trackid'],
                'musicbrainz-albumid': ['albumid'],
                'musicbrainz-artistid': ['artistid'],
                'musicbrainz-albumartistid': ['albumartistid'],
                'bitrate': [1000],
            },
        }

        artist = Artist(name='artist', musicbrainz_id='artistid')
        composer = Artist(name='composer')
        performer = Artist(name='performer')
        albumartist = Artist(name='albumartist',
                             musicbrainz_id='albumartistid')

        album = Album(name='album',
                      num_tracks=2,
                      num_discs=3,
                      musicbrainz_id='albumid',
                      artists=[albumartist])

        self.track = Track(uri='uri',
                           name='track',
                           date='2006-01-01',
                           genre='genre',
                           track_no=1,
                           disc_no=2,
                           length=4531,
                           comment='comment',
                           musicbrainz_id='trackid',
                           last_modified=1234,
                           album=album,
                           bitrate=1000,
                           artists=[artist],
                           composers=[composer],
                           performers=[performer])

    def check(self, expected):
        actual = scan.audio_data_to_track(self.data)
        self.assertEqual(expected, actual)

    def test_track(self):
        self.check(self.track)

    def test_none_track_length(self):
        self.data['duration'] = None
        self.check(self.track.copy(length=None))

    def test_none_track_last_modified(self):
        self.data['mtime'] = None
        self.check(self.track.copy(last_modified=None))

    def test_missing_track_no(self):
        del self.data['tags']['track-number']
        self.check(self.track.copy(track_no=None))

    def test_multiple_track_no(self):
        self.data['tags']['track-number'].append(9)
        self.check(self.track)

    def test_missing_track_disc_no(self):
        del self.data['tags']['album-disc-number']
        self.check(self.track.copy(disc_no=None))

    def test_multiple_track_disc_no(self):
        self.data['tags']['album-disc-number'].append(9)
        self.check(self.track)

    def test_missing_track_name(self):
        del self.data['tags']['title']
        self.check(self.track.copy(name=None))

    def test_multiple_track_name(self):
        self.data['tags']['title'] = ['name1', 'name2']
        self.check(self.track.copy(name='name1; name2'))

    def test_missing_track_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-trackid']
        self.check(self.track.copy(musicbrainz_id=None))

    def test_multiple_track_musicbrainz_id(self):
        self.data['tags']['musicbrainz-trackid'].append('id')
        self.check(self.track)

    def test_missing_track_bitrate(self):
        del self.data['tags']['bitrate']
        self.check(self.track.copy(bitrate=None))

    def test_multiple_track_bitrate(self):
        self.data['tags']['bitrate'].append(1234)
        self.check(self.track)

    def test_missing_track_genre(self):
        del self.data['tags']['genre']
        self.check(self.track.copy(genre=None))

    def test_multiple_track_genre(self):
        self.data['tags']['genre'] = ['genre1', 'genre2']
        self.check(self.track.copy(genre='genre1; genre2'))

    def test_missing_track_date(self):
        del self.data['tags']['date']
        self.check(self.track.copy(date=None))

    def test_multiple_track_date(self):
        self.data['tags']['date'].append(FakeGstDate(2030, 1, 1))
        self.check(self.track)

    def test_invalid_track_date(self):
        self.data['tags']['date'] = [FakeGstDate(65535, 1, 1)]
        self.check(self.track.copy(date=None))

    def test_missing_track_comment(self):
        del self.data['tags']['comment']
        self.check(self.track.copy(comment=None))

    def test_multiple_track_comment(self):
        self.data['tags']['comment'] = ['comment1', 'comment2']
        self.check(self.track.copy(comment='comment1; comment2'))

    def test_missing_track_artist_name(self):
        del self.data['tags']['artist']
        self.check(self.track.copy(artists=[]))

    def test_multiple_track_artist_name(self):
        self.data['tags']['artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        self.check(self.track.copy(artists=artists))

    def test_missing_track_artist_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-artistid']
        artist = list(self.track.artists)[0].copy(musicbrainz_id=None)
        self.check(self.track.copy(artists=[artist]))

    def test_multiple_track_artist_musicbrainz_id(self):
        self.data['tags']['musicbrainz-artistid'].append('id')
        self.check(self.track)

    def test_missing_track_composer_name(self):
        del self.data['tags']['composer']
        self.check(self.track.copy(composers=[]))

    def test_multiple_track_composer_name(self):
        self.data['tags']['composer'] = ['composer1', 'composer2']
        composers = [Artist(name='composer1'), Artist(name='composer2')]
        self.check(self.track.copy(composers=composers))

    def test_missing_track_performer_name(self):
        del self.data['tags']['performer']
        self.check(self.track.copy(performers=[]))

    def test_multiple_track_performe_name(self):
        self.data['tags']['performer'] = ['performer1', 'performer2']
        performers = [Artist(name='performer1'), Artist(name='performer2')]
        self.check(self.track.copy(performers=performers))

    def test_missing_album_name(self):
        del self.data['tags']['album']
        album = self.track.album.copy(name=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_name(self):
        self.data['tags']['album'].append('album2')
        self.check(self.track)

    def test_missing_album_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-albumid']
        album = self.track.album.copy(musicbrainz_id=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_musicbrainz_id(self):
        self.data['tags']['musicbrainz-albumid'].append('id')
        self.check(self.track)

    def test_missing_album_num_tracks(self):
        del self.data['tags']['track-count']
        album = self.track.album.copy(num_tracks=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_tracks(self):
        self.data['tags']['track-count'].append(9)
        self.check(self.track)

    def test_missing_album_num_discs(self):
        del self.data['tags']['album-disc-count']
        album = self.track.album.copy(num_discs=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_discs(self):
        self.data['tags']['album-disc-count'].append(9)
        self.check(self.track)

    def test_missing_album_artist_name(self):
        del self.data['tags']['album-artist']
        album = self.track.album.copy(artists=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_name(self):
        self.data['tags']['album-artist'] = ['name1', 'name2']
        artists = [Artist(name='name1'), Artist(name='name2')]
        album = self.track.album.copy(artists=artists)
        self.check(self.track.copy(album=album))

    def test_missing_album_artist_musicbrainz_id(self):
        del self.data['tags']['musicbrainz-albumartistid']
        albumartist = list(self.track.album.artists)[0]
        albumartist = albumartist.copy(musicbrainz_id=None)
        album = self.track.album.copy(artists=[albumartist])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_musicbrainz_id(self):
        self.data['tags']['musicbrainz-albumartistid'].append('id')
        self.check(self.track)

    def test_stream_organization_track_name(self):
        del self.data['tags']['title']
        self.data['tags']['organization'] = ['organization']
        self.check(self.track.copy(name='organization'))

    def test_multiple_organization_track_name(self):
        del self.data['tags']['title']
        self.data['tags']['organization'] = ['organization1', 'organization2']
        self.check(self.track.copy(name='organization1; organization2'))

    # TODO: combine all comment types?
    def test_stream_location_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['location'] = ['location']
        self.check(self.track.copy(comment='location'))

    def test_multiple_location_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['location'] = ['location1', 'location2']
        self.check(self.track.copy(comment='location1; location2'))

    def test_stream_copyright_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['copyright'] = ['copyright']
        self.check(self.track.copy(comment='copyright'))

    def test_multiple_copyright_track_comment(self):
        del self.data['tags']['comment']
        self.data['tags']['copyright'] = ['copyright1', 'copyright2']
        self.check(self.track.copy(comment='copyright1; copyright2'))
Exemplo n.º 15
0
class TagsToTrackTest(unittest.TestCase):
    def setUp(self):  # noqa: N802
        self.tags = {
            "album": ["album"],
            "track-number": [1],
            "artist": ["artist"],
            "composer": ["composer"],
            "performer": ["performer"],
            "album-artist": ["albumartist"],
            "title": ["track"],
            "track-count": [2],
            "album-disc-number": [2],
            "album-disc-count": [3],
            "date": [datetime.date(2006, 1, 1)],
            "container-format": ["ID3 tag"],
            "genre": ["genre"],
            "comment": ["comment"],
            "musicbrainz-trackid": ["trackid"],
            "musicbrainz-albumid": ["albumid"],
            "musicbrainz-artistid": ["artistid"],
            "musicbrainz-albumartistid": ["albumartistid"],
            "bitrate": [1000],
        }

        artist = Artist(name="artist", musicbrainz_id="artistid")
        composer = Artist(name="composer")
        performer = Artist(name="performer")
        albumartist = Artist(name="albumartist", musicbrainz_id="albumartistid")

        album = Album(name="album", num_tracks=2, num_discs=3, musicbrainz_id="albumid", artists=[albumartist])

        self.track = Track(
            name="track",
            date="2006-01-01",
            genre="genre",
            track_no=1,
            disc_no=2,
            comment="comment",
            musicbrainz_id="trackid",
            album=album,
            bitrate=1000,
            artists=[artist],
            composers=[composer],
            performers=[performer],
        )

    def check(self, expected):
        actual = utils.convert_tags_to_track(self.tags)
        self.assertEqual(expected, actual)

    def test_track(self):
        self.check(self.track)

    def test_missing_track_no(self):
        del self.tags["track-number"]
        self.check(self.track.copy(track_no=None))

    def test_multiple_track_no(self):
        self.tags["track-number"].append(9)
        self.check(self.track)

    def test_missing_track_disc_no(self):
        del self.tags["album-disc-number"]
        self.check(self.track.copy(disc_no=None))

    def test_multiple_track_disc_no(self):
        self.tags["album-disc-number"].append(9)
        self.check(self.track)

    def test_missing_track_name(self):
        del self.tags["title"]
        self.check(self.track.copy(name=None))

    def test_multiple_track_name(self):
        self.tags["title"] = ["name1", "name2"]
        self.check(self.track.copy(name="name1; name2"))

    def test_missing_track_musicbrainz_id(self):
        del self.tags["musicbrainz-trackid"]
        self.check(self.track.copy(musicbrainz_id=None))

    def test_multiple_track_musicbrainz_id(self):
        self.tags["musicbrainz-trackid"].append("id")
        self.check(self.track)

    def test_missing_track_bitrate(self):
        del self.tags["bitrate"]
        self.check(self.track.copy(bitrate=None))

    def test_multiple_track_bitrate(self):
        self.tags["bitrate"].append(1234)
        self.check(self.track)

    def test_missing_track_genre(self):
        del self.tags["genre"]
        self.check(self.track.copy(genre=None))

    def test_multiple_track_genre(self):
        self.tags["genre"] = ["genre1", "genre2"]
        self.check(self.track.copy(genre="genre1; genre2"))

    def test_missing_track_date(self):
        del self.tags["date"]
        self.check(self.track.copy(date=None))

    def test_multiple_track_date(self):
        self.tags["date"].append(datetime.date(2030, 1, 1))
        self.check(self.track)

    def test_missing_track_comment(self):
        del self.tags["comment"]
        self.check(self.track.copy(comment=None))

    def test_multiple_track_comment(self):
        self.tags["comment"] = ["comment1", "comment2"]
        self.check(self.track.copy(comment="comment1; comment2"))

    def test_missing_track_artist_name(self):
        del self.tags["artist"]
        self.check(self.track.copy(artists=[]))

    def test_multiple_track_artist_name(self):
        self.tags["artist"] = ["name1", "name2"]
        artists = [Artist(name="name1"), Artist(name="name2")]
        self.check(self.track.copy(artists=artists))

    def test_missing_track_artist_musicbrainz_id(self):
        del self.tags["musicbrainz-artistid"]
        artist = list(self.track.artists)[0].copy(musicbrainz_id=None)
        self.check(self.track.copy(artists=[artist]))

    def test_multiple_track_artist_musicbrainz_id(self):
        self.tags["musicbrainz-artistid"].append("id")
        self.check(self.track)

    def test_missing_track_composer_name(self):
        del self.tags["composer"]
        self.check(self.track.copy(composers=[]))

    def test_multiple_track_composer_name(self):
        self.tags["composer"] = ["composer1", "composer2"]
        composers = [Artist(name="composer1"), Artist(name="composer2")]
        self.check(self.track.copy(composers=composers))

    def test_missing_track_performer_name(self):
        del self.tags["performer"]
        self.check(self.track.copy(performers=[]))

    def test_multiple_track_performe_name(self):
        self.tags["performer"] = ["performer1", "performer2"]
        performers = [Artist(name="performer1"), Artist(name="performer2")]
        self.check(self.track.copy(performers=performers))

    def test_missing_album_name(self):
        del self.tags["album"]
        self.check(self.track.copy(album=None))

    def test_multiple_album_name(self):
        self.tags["album"].append("album2")
        self.check(self.track)

    def test_missing_album_musicbrainz_id(self):
        del self.tags["musicbrainz-albumid"]
        album = self.track.album.copy(musicbrainz_id=None, images=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_musicbrainz_id(self):
        self.tags["musicbrainz-albumid"].append("id")
        self.check(self.track)

    def test_missing_album_num_tracks(self):
        del self.tags["track-count"]
        album = self.track.album.copy(num_tracks=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_tracks(self):
        self.tags["track-count"].append(9)
        self.check(self.track)

    def test_missing_album_num_discs(self):
        del self.tags["album-disc-count"]
        album = self.track.album.copy(num_discs=None)
        self.check(self.track.copy(album=album))

    def test_multiple_album_num_discs(self):
        self.tags["album-disc-count"].append(9)
        self.check(self.track)

    def test_missing_album_artist_name(self):
        del self.tags["album-artist"]
        album = self.track.album.copy(artists=[])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_name(self):
        self.tags["album-artist"] = ["name1", "name2"]
        artists = [Artist(name="name1"), Artist(name="name2")]
        album = self.track.album.copy(artists=artists)
        self.check(self.track.copy(album=album))

    def test_missing_album_artist_musicbrainz_id(self):
        del self.tags["musicbrainz-albumartistid"]
        albumartist = list(self.track.album.artists)[0]
        albumartist = albumartist.copy(musicbrainz_id=None)
        album = self.track.album.copy(artists=[albumartist])
        self.check(self.track.copy(album=album))

    def test_multiple_album_artist_musicbrainz_id(self):
        self.tags["musicbrainz-albumartistid"].append("id")
        self.check(self.track)

    def test_stream_organization_track_name(self):
        del self.tags["title"]
        self.tags["organization"] = ["organization"]
        self.check(self.track.copy(name="organization"))

    def test_multiple_organization_track_name(self):
        del self.tags["title"]
        self.tags["organization"] = ["organization1", "organization2"]
        self.check(self.track.copy(name="organization1; organization2"))

    # TODO: combine all comment types?
    def test_stream_location_track_comment(self):
        del self.tags["comment"]
        self.tags["location"] = ["location"]
        self.check(self.track.copy(comment="location"))

    def test_multiple_location_track_comment(self):
        del self.tags["comment"]
        self.tags["location"] = ["location1", "location2"]
        self.check(self.track.copy(comment="location1; location2"))

    def test_stream_copyright_track_comment(self):
        del self.tags["comment"]
        self.tags["copyright"] = ["copyright"]
        self.check(self.track.copy(comment="copyright"))

    def test_multiple_copyright_track_comment(self):
        del self.tags["comment"]
        self.tags["copyright"] = ["copyright1", "copyright2"]
        self.check(self.track.copy(comment="copyright1; copyright2"))