python-plexapi/tests/test_audio.py

496 lines
16 KiB
Python
Raw Normal View History

2017-01-09 14:21:54 +00:00
# -*- coding: utf-8 -*-
2021-08-04 21:02:01 +00:00
from urllib.parse import quote_plus
2021-09-16 22:23:59 +00:00
import pytest
import plexapi
2021-09-16 22:23:59 +00:00
from plexapi.exceptions import BadRequest
from . import conftest as utils
2021-05-09 22:05:06 +00:00
from . import test_media, test_mixins
def test_audio_Artist_attr(artist):
2023-11-13 18:35:36 +00:00
artist_guids = [
"mbid://069a1c1f-14eb-4d36-b0a0-77dffbd67713",
"plex://artist/5d07bdaf403c64029060f8c4",
]
artist.reload()
assert utils.is_datetime(artist.addedAt)
assert artist.albumSort == -1
2021-02-15 01:10:11 +00:00
if artist.art:
assert utils.is_art(artist.art)
if artist.countries:
2020-12-03 23:18:35 +00:00
assert "United States of America" in [i.tag for i in artist.countries]
# assert "Electronic" in [i.tag for i in artist.genres]
2023-11-13 18:35:36 +00:00
assert artist.guid in artist_guids
assert artist_guids[0] in [i.id for i in artist.guids]
2020-12-24 00:39:54 +00:00
assert artist.index == 1
assert utils.is_metadata(artist._initpath)
assert utils.is_metadata(artist.key)
assert utils.is_int(artist.librarySectionID)
2020-04-29 21:23:22 +00:00
assert artist.listType == "audio"
2021-05-16 05:38:54 +00:00
assert utils.is_datetime(artist.lastRatedAt)
assert utils.is_datetime(artist.lastViewedAt)
assert len(artist.locations) == 1
assert len(artist.locations[0]) >= 10
assert artist.ratingKey >= 1
assert artist._server._baseurl == utils.SERVER_BASEURL
2019-09-21 20:54:50 +00:00
assert isinstance(artist.similar, list)
if artist.summary:
assert "Alias" in artist.summary
assert artist.theme is None
2021-02-15 01:10:11 +00:00
if artist.thumb:
assert utils.is_thumb(artist.thumb)
2020-04-29 21:23:22 +00:00
assert artist.title == "Broke For Free"
assert artist.titleSort == "Broke For Free"
assert artist.type == "artist"
assert utils.is_datetime(artist.updatedAt)
2017-04-29 05:47:21 +00:00
assert utils.is_int(artist.viewCount, gte=0)
2021-09-16 22:23:59 +00:00
def test_audio_Artist_get(artist):
track = artist.get(album="Layers", title="As Colourful as Ever")
assert track.title == "As Colourful as Ever"
2017-01-09 14:21:54 +00:00
def test_audio_Artist_history(artist):
history = artist.history()
2020-04-15 18:41:15 +00:00
assert isinstance(history, list)
def test_audio_Artist_track(artist):
2020-04-29 21:23:22 +00:00
track = artist.track("As Colourful as Ever")
assert track.title == "As Colourful as Ever"
2020-12-24 07:03:08 +00:00
track = artist.track(album="Layers", track=1)
assert track.parentTitle == "Layers"
assert track.index == 1
2021-09-16 22:23:59 +00:00
with pytest.raises(BadRequest):
artist.track()
2017-01-09 14:21:54 +00:00
def test_audio_Artist_tracks(artist):
tracks = artist.tracks()
2020-04-29 21:23:22 +00:00
assert len(tracks) == 1
2017-01-09 14:21:54 +00:00
def test_audio_Artist_album(artist):
2020-04-29 21:23:22 +00:00
album = artist.album("Layers")
assert album.title == "Layers"
2017-01-09 14:21:54 +00:00
def test_audio_Artist_albums(artist):
albums = artist.albums(filters={})
2020-04-29 21:23:22 +00:00
assert len(albums) == 1 and albums[0].title == "Layers"
2017-01-09 14:21:54 +00:00
2021-09-16 22:23:59 +00:00
def test_audio_Artist_hubs(artist):
hubs = artist.hubs()
assert isinstance(hubs, list)
def test_audio_Artist_mixins_edit_advanced_settings(artist):
test_mixins.edit_advanced_settings(artist)
@pytest.mark.xfail(reason="Changing images fails randomly")
def test_audio_Artist_mixins_images(artist):
test_mixins.lock_art(artist)
test_mixins.lock_poster(artist)
test_mixins.edit_art(artist)
test_mixins.edit_poster(artist)
2021-02-15 05:19:42 +00:00
test_mixins.attr_artUrl(artist)
test_mixins.attr_posterUrl(artist)
def test_audio_Artist_mixins_themes(artist):
test_mixins.edit_theme(artist)
2021-05-30 22:49:28 +00:00
def test_audio_Artist_mixins_rating(artist):
test_mixins.edit_rating(artist)
def test_audio_Artist_mixins_fields(artist):
test_mixins.edit_added_at(artist)
test_mixins.edit_audience_rating(artist)
test_mixins.edit_critic_rating(artist)
test_mixins.edit_sort_title(artist)
test_mixins.edit_summary(artist)
test_mixins.edit_title(artist)
test_mixins.edit_user_rating(artist)
2021-01-24 23:03:23 +00:00
def test_audio_Artist_mixins_tags(artist):
test_mixins.edit_collection(artist)
test_mixins.edit_country(artist)
test_mixins.edit_genre(artist)
test_mixins.edit_label(artist)
2021-01-24 23:03:23 +00:00
test_mixins.edit_mood(artist)
test_mixins.edit_similar_artist(artist)
test_mixins.edit_style(artist)
2021-01-24 22:40:02 +00:00
2021-05-09 22:05:06 +00:00
def test_audio_Artist_media_tags(artist):
artist.reload()
test_media.tag_collection(artist)
test_media.tag_country(artist)
test_media.tag_genre(artist)
test_media.tag_mood(artist)
test_media.tag_similar(artist)
test_media.tag_style(artist)
def test_audio_Artist_PlexWebURL(plex, artist):
2021-08-04 21:02:01 +00:00
url = artist.getWebURL()
assert url.startswith('https://app.plex.tv/desktop')
assert plex.machineIdentifier in url
assert 'details' in url
assert quote_plus(artist.key) in url
def test_audio_Album_attrs(album):
assert utils.is_datetime(album.addedAt)
2021-02-15 01:10:11 +00:00
if album.art:
assert utils.is_art(album.art)
2021-09-16 22:23:59 +00:00
assert isinstance(album.formats, list)
assert isinstance(album.genres, list)
assert album.guid == "plex://album/5d07c7e5403c640290bb5bfc"
assert "mbid://80b4a679-a2a4-4d18-835d-3e081185d7ba" in [i.id for i in album.guids]
2020-12-24 00:39:54 +00:00
assert album.index == 1
assert utils.is_metadata(album._initpath)
assert utils.is_metadata(album.key)
2021-05-16 05:38:54 +00:00
assert utils.is_datetime(album.lastRatedAt)
assert utils.is_datetime(album.lastViewedAt)
assert utils.is_int(album.librarySectionID)
2020-04-29 21:23:22 +00:00
assert album.listType == "audio"
2020-10-08 20:15:43 +00:00
assert utils.is_datetime(album.originallyAvailableAt)
assert utils.is_metadata(album.parentKey)
assert utils.is_int(album.parentRatingKey)
assert album.parentTheme is None or utils.is_metadata(album.parentTheme)
2017-04-23 05:54:53 +00:00
if album.parentThumb:
2021-02-15 01:10:11 +00:00
assert utils.is_thumb(album.parentThumb)
2020-04-29 21:23:22 +00:00
assert album.parentTitle == "Broke For Free"
assert album.ratingKey >= 1
assert album._server._baseurl == utils.SERVER_BASEURL
assert album.studio == "[no label]"
2021-09-16 22:23:59 +00:00
assert isinstance(album.subformats, list)
2020-04-29 21:23:22 +00:00
assert album.summary == ""
if album.thumb:
2021-02-15 01:10:11 +00:00
assert utils.is_thumb(album.thumb)
2020-04-29 21:23:22 +00:00
assert album.title == "Layers"
assert album.titleSort == "Layers"
assert album.type == "album"
assert utils.is_datetime(album.updatedAt)
2017-04-29 05:47:21 +00:00
assert utils.is_int(album.viewCount, gte=0)
2020-04-29 21:23:22 +00:00
assert album.year in (2012,)
def test_audio_Album_history(album):
history = album.history()
2020-04-14 20:13:30 +00:00
assert isinstance(history, list)
def test_audio_Track_history(track):
history = track.history()
2020-04-14 20:13:30 +00:00
assert isinstance(history, list)
def test_audio_Album_tracks(album):
tracks = album.tracks()
2020-04-29 21:23:22 +00:00
assert len(tracks) == 1
def test_audio_Album_track(album):
track = album.track("As Colourful as Ever")
assert track.title == "As Colourful as Ever"
track = album.track(track=1)
assert track.index == 1
track = album.track(1)
assert track.index == 1
2021-09-16 22:23:59 +00:00
with pytest.raises(BadRequest):
album.track()
def test_audio_Album_get(album):
track = album.get("As Colourful as Ever")
assert track.title == "As Colourful as Ever"
def test_audio_Album_artist(album):
artist = album.artist()
2023-09-17 22:36:45 +00:00
assert artist.title == "Broke For Free"
2017-01-09 14:21:54 +00:00
@pytest.mark.xfail(reason="Changing images fails randomly")
def test_audio_Album_mixins_images(album):
test_mixins.lock_art(album)
test_mixins.lock_poster(album)
test_mixins.edit_art(album)
test_mixins.edit_poster(album)
2021-02-15 05:19:42 +00:00
test_mixins.attr_artUrl(album)
test_mixins.attr_posterUrl(album)
def test_audio_Album_mixins_themes(album):
test_mixins.attr_themeUrl(album)
2021-05-30 22:49:28 +00:00
def test_audio_Album_mixins_rating(album):
test_mixins.edit_rating(album)
def test_audio_Album_mixins_fields(album):
test_mixins.edit_added_at(album)
test_mixins.edit_audience_rating(album)
test_mixins.edit_critic_rating(album)
test_mixins.edit_originally_available(album)
test_mixins.edit_sort_title(album)
test_mixins.edit_studio(album)
test_mixins.edit_summary(album)
test_mixins.edit_title(album)
test_mixins.edit_user_rating(album)
2021-01-24 23:03:23 +00:00
def test_audio_Album_mixins_tags(album):
test_mixins.edit_collection(album)
test_mixins.edit_genre(album)
test_mixins.edit_label(album)
test_mixins.edit_mood(album)
test_mixins.edit_style(album)
2021-01-24 22:40:02 +00:00
2021-05-09 22:05:06 +00:00
def test_audio_Album_media_tags(album):
album.reload()
test_media.tag_collection(album)
test_media.tag_genre(album)
test_media.tag_label(album)
test_media.tag_mood(album)
test_media.tag_style(album)
def test_audio_Album_PlexWebURL(plex, album):
2021-08-04 21:02:01 +00:00
url = album.getWebURL()
assert url.startswith('https://app.plex.tv/desktop')
assert plex.machineIdentifier in url
assert 'details' in url
assert quote_plus(album.key) in url
def test_audio_Track_attrs(album):
2020-04-29 21:23:22 +00:00
track = album.get("As Colourful As Ever").reload()
assert utils.is_datetime(track.addedAt)
2021-02-15 01:10:11 +00:00
if track.art:
assert utils.is_art(track.art)
2017-02-04 19:18:10 +00:00
assert track.chapterSource is None
assert utils.is_int(track.duration)
assert track.genres == []
2021-02-15 03:03:19 +00:00
if track.grandparentArt:
2021-02-15 03:11:53 +00:00
assert utils.is_art(track.grandparentArt)
assert utils.is_metadata(track.grandparentKey)
assert utils.is_int(track.grandparentRatingKey)
assert track.grandparentTheme is None or utils.is_metadata(track.grandparentTheme)
2017-04-23 05:54:53 +00:00
if track.grandparentThumb:
2021-02-15 01:10:11 +00:00
assert utils.is_thumb(track.grandparentThumb)
2020-04-29 21:23:22 +00:00
assert track.grandparentTitle == "Broke For Free"
assert track.guid == "plex://track/5d07e453403c6402907b80aa"
assert "mbid://6524bc2d-3f58-4afa-9e06-00a651f5d813" in [i.id for i in track.guids]
2021-09-16 22:23:59 +00:00
assert track.hasSonicAnalysis is False
assert track.index == 1
assert track.trackNumber == track.index
assert utils.is_metadata(track._initpath)
assert utils.is_metadata(track.key)
2021-05-16 05:38:54 +00:00
assert utils.is_datetime(track.lastRatedAt)
2020-10-08 20:15:43 +00:00
assert utils.is_datetime(track.lastViewedAt)
assert utils.is_int(track.librarySectionID)
2020-04-29 21:23:22 +00:00
assert track.listType == "audio"
2020-12-24 07:03:08 +00:00
assert len(track.locations) == 1
assert len(track.locations[0]) >= 10
2017-01-09 14:21:54 +00:00
# Assign 0 track.media
media = track.media[0]
2017-01-09 14:21:54 +00:00
assert track.moods == []
2020-04-29 21:23:22 +00:00
assert track.originalTitle in (None, "Broke For Free")
assert int(track.parentIndex) == 1
assert utils.is_metadata(track.parentKey)
assert utils.is_int(track.parentRatingKey)
if track.parentThumb:
2021-02-15 01:10:11 +00:00
assert utils.is_thumb(track.parentThumb)
2020-04-29 21:23:22 +00:00
assert track.parentTitle == "Layers"
2017-02-04 19:18:10 +00:00
assert track.playlistItemID is None
assert track.primaryExtraKey is None
assert track.ratingCount is None or utils.is_int(track.ratingCount)
assert utils.is_int(track.ratingKey)
assert track._server._baseurl == utils.SERVER_BASEURL
assert track.skipCount is None
2020-04-29 21:23:22 +00:00
assert track.summary == ""
if track.thumb:
2021-02-15 01:10:11 +00:00
assert utils.is_thumb(track.thumb)
2020-04-29 21:23:22 +00:00
assert track.title == "As Colourful as Ever"
assert track.titleSort == "As Colourful as Ever"
assert track.type == "track"
assert utils.is_datetime(track.updatedAt)
2017-04-29 05:47:21 +00:00
assert utils.is_int(track.viewCount, gte=0)
2017-01-09 14:21:54 +00:00
assert track.viewOffset == 0
2017-02-04 19:18:10 +00:00
assert track.year is None
2021-09-16 22:23:59 +00:00
assert track.url(None) is None
assert media.aspectRatio is None
assert media.audioChannels == 2
2020-04-29 21:23:22 +00:00
assert media.audioCodec == "mp3"
assert media.bitrate == 128
assert media.container == "mp3"
assert utils.is_int(media.duration)
assert media.height is None
2017-04-29 05:47:21 +00:00
assert utils.is_int(media.id, gte=1)
assert utils.is_metadata(media._initpath)
assert media.optimizedForStreaming is None
# Assign 0 media.parts
part = media.parts[0]
assert media._server._baseurl == utils.SERVER_BASEURL
assert media.videoCodec is None
assert media.videoFrameRate is None
assert media.videoResolution is None
assert media.width is None
2020-04-29 21:23:22 +00:00
assert part.container == "mp3"
assert utils.is_int(part.duration)
2020-04-29 21:23:22 +00:00
assert part.file.endswith(".mp3")
assert utils.is_int(part.id)
assert utils.is_metadata(part._initpath)
assert utils.is_part(part.key)
# assert part.media == <Media:Holy.Moment>
assert part._server._baseurl == utils.SERVER_BASEURL
2020-04-29 21:23:22 +00:00
assert part.size == 3761053
# Assign 0 part.streams
stream = part.streams[0]
2020-04-29 21:23:22 +00:00
assert stream.audioChannelLayout == "stereo"
assert stream.bitDepth is None
2020-04-29 21:23:22 +00:00
assert stream.bitrate == 128
assert stream.bitrateMode is None
assert stream.channels == 2
2020-04-29 21:23:22 +00:00
assert stream.codec == "mp3"
assert stream.duration is None
assert utils.is_int(stream.id)
assert stream.index == 0
assert utils.is_metadata(stream._initpath)
assert stream.language is None
assert stream.languageCode is None
# assert stream.part == <MediaPart:22>
2020-04-29 21:23:22 +00:00
assert stream.samplingRate == 48000
assert stream.selected is True
assert stream._server._baseurl == utils.SERVER_BASEURL
assert stream.streamType == 2
assert stream.title is None
assert stream.type == 2
Update to MediaPartStream and inheriting classes (#590) * moving common child (VideoStream, AudioStream, SubtitleStream) attributes to the parent (MediaPartStream) * removal of no longer present attribs in video, audio, subtitle streams * additional attribs to video and mediapart streams * removal of previously unique subtitleStream attribs. attribs are now common or no longer present. * docstring cleanup of video, audio, and subtitle stream; pass 1 * remove codecID checks as this attribute is now longer used. * adding key attrib to parent MediaPartStream. * add transient to SubtitleStream, found in uploaded subtitles * removing dialogNorm related assertion as this attrib has been removed. * update Media class based on PR comments optimizedVersion to be added, need SEARCHTYPES * update MediaPartStream class based on PR comments * update VideoStream class based on PR comments * update AudioStream class based on PR comments * update SubtitleStream class based on PR comments * add LyricStream class based on PR comments * add streamType int and LyricStream to MediaPartStream.parse method * add MediaPart.lyricStreams method * spelling correction * more movement based on PR comments * alpha ordering MediaPart * alpha sort VideoStream * docstring corrections * remove assert stream.dialogNorm from audio test as dialogNorm has been removed. * adding LyricStream to _buildStreams function * adding changes from @johnnywong16 https://github.com/JonnyWong16/python-plexapi/commit/e346f0b4dc92ab04a7b69d3ecb28734883a0e792 * moving unused imports down and together * Address docstring review comments * Change isChildOf for any kwargs * Add Media.isOptimizedVersion property * Add photo and track specific attributes * Remove dead MediaPartStream.parse method * Update media doc strings * Add optimized version doc string * Cast video stream codedHeight and codedWidth to int * Add required bandwidths to streams * Update video tests * Update audio tests * Fix video tests * Fix video tests * Fix video tests Co-authored-by: Jason Lawrence <jjlawren@users.noreply.github.com> Co-authored-by: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com>
2021-01-24 20:21:56 +00:00
assert stream.albumGain is None
assert stream.albumPeak is None
assert stream.albumRange is None
assert stream.endRamp is None
assert stream.gain is None
assert stream.loudness is None
assert stream.lra is None
assert stream.peak is None
assert stream.startRamp is None
def test_audio_Track_album(album):
tracks = album.tracks()
assert tracks[0].album() == album
def test_audio_Track_artist(album, artist):
tracks = album.tracks()
assert tracks[0].artist() == artist
def test_audio_Track_lyricStreams(track):
assert not track.lyricStreams()
@pytest.mark.authenticated
def test_audio_Track_sonicAdventure(account_plexpass, music):
tracks = music.searchTracks()
adventure = tracks[0].sonicAdventure(tracks[-1])
assert all(isinstance(t, plexapi.audio.Track) for t in adventure)
2021-02-15 05:19:42 +00:00
def test_audio_Track_mixins_images(track):
test_mixins.attr_artUrl(track)
test_mixins.attr_posterUrl(track)
def test_audio_Track_mixins_themes(track):
test_mixins.attr_themeUrl(track)
2021-05-30 22:49:28 +00:00
def test_audio_Track_mixins_rating(track):
test_mixins.edit_rating(track)
def test_audio_Track_mixins_fields(track):
test_mixins.edit_added_at(track)
test_mixins.edit_audience_rating(track)
test_mixins.edit_critic_rating(track)
test_mixins.edit_title(track)
test_mixins.edit_track_artist(track)
test_mixins.edit_track_number(track)
test_mixins.edit_track_disc_number(track)
test_mixins.edit_user_rating(track)
2021-01-24 23:03:23 +00:00
def test_audio_Track_mixins_tags(track):
test_mixins.edit_collection(track)
test_mixins.edit_genre(track)
test_mixins.edit_label(track)
2021-01-24 23:03:23 +00:00
test_mixins.edit_mood(track)
2021-01-24 22:40:02 +00:00
2021-05-09 22:05:06 +00:00
def test_audio_Track_media_tags(track):
track.reload()
test_media.tag_collection(track)
test_media.tag_mood(track)
def test_audio_Track_PlexWebURL(plex, track):
2021-08-04 21:02:01 +00:00
url = track.getWebURL()
assert url.startswith('https://app.plex.tv/desktop')
assert plex.machineIdentifier in url
assert 'details' in url
assert quote_plus(track.parentKey) in url
def test_audio_Audio_section(artist, album, track):
assert artist.section()
assert album.section()
assert track.section()
assert track.section().key == album.section().key == artist.section().key
@pytest.mark.authenticated
def test_audio_Audio_sonicallySimilar(account_plexpass, artist):
similar_audio = artist.sonicallySimilar()
assert isinstance(similar_audio, list)
assert all(isinstance(i, type(artist)) for i in similar_audio)
similar_audio = artist.sonicallySimilar(limit=1)
assert len(similar_audio) <= 1
similar_audio = artist.sonicallySimilar(maxDistance=0.1)
assert all(i.distance <= 0.1 for i in similar_audio)
def test_audio_Artist_download(monkeydownload, tmpdir, artist):
total = len(artist.tracks())
filepaths = artist.download(savepath=str(tmpdir))
assert len(filepaths) == total
subfolders = artist.download(savepath=str(tmpdir), subfolders=True)
assert len(subfolders) == total
2017-01-09 14:21:54 +00:00
def test_audio_Album_download(monkeydownload, tmpdir, album):
total = len(album.tracks())
filepaths = album.download(savepath=str(tmpdir))
assert len(filepaths) == total
2017-01-09 14:21:54 +00:00
def test_audio_Track_download(monkeydownload, tmpdir, track):
filepaths = track.download(savepath=str(tmpdir))
assert len(filepaths) == 1