Skip to content

Commit

Permalink
feat/ocp_stream_utils (#257)
Browse files Browse the repository at this point in the history
* feat/ocp_stream_utils

helper methods to parse the ocp stream from PluginStream objects

* more tests

* more tests
  • Loading branch information
JarbasAl authored Jun 21, 2024
1 parent 3fa1504 commit a05ab7b
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 8 deletions.
16 changes: 16 additions & 0 deletions ovos_utils/ocp.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,22 @@ class PluginStream:
image: str = ""
skill_icon: str = ""

def extract_uri(self, video=True) -> str:
from ovos_plugin_manager.ocp import load_stream_extractors
xtract = load_stream_extractors()
meta = xtract.extract_stream(f"{self.extractor_id}//{self.stream}",
video=video)
return meta["uri"]

def extract_media_entry(self, video=True) -> MediaEntry:
from ovos_plugin_manager.ocp import load_stream_extractors
xtract = load_stream_extractors()
meta = xtract.extract_stream(f"{self.extractor_id}//{self.stream}",
video=video)
kwargs = {k: v for k, v in meta.items()
if k in inspect.signature(MediaEntry).parameters}
return MediaEntry(**kwargs)

@property
def infocard(self) -> dict:
"""
Expand Down
75 changes: 67 additions & 8 deletions test/unittests/test_ocp_media.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from ovos_utils.ocp import MediaEntry, Playlist, MediaType, PlaybackType, TrackState

valid_search_results = [
dict_search_results = [
{'media_type': MediaType.MUSIC,
'playback': PlaybackType.AUDIO,
'image': 'https://freemusicarchive.org/legacy/fma-smaller.jpg',
Expand All @@ -17,23 +17,56 @@
'image': 'https://freemusicarchive.org/legacy/fma-smaller.jpg',
'skill_icon': 'https://freemusicarchive.org/legacy/fma-smaller.jpg',
'uri': 'https://freemusicarchive.org/track/05_-_Quantum_Jazz_-_Passing_Fields/stream/',
'skill_id': 'skill-free_music_archive.neongeckocom',
'title': 'Passing Fields',
'artist': 'Quantum Jazz',
'match_confidence': 65},
{'media_type': MediaType.MUSIC,
'playback': PlaybackType.AUDIO,
'image': 'https://freemusicarchive.org/legacy/fma-smaller.jpg',
'skill_icon': 'https://freemusicarchive.org/legacy/fma-smaller.jpg',
'skill_id': 'skill-free_music_archive.neongeckocom',
'uri': 'https://freemusicarchive.org/track/04_-_Quantum_Jazz_-_All_About_The_Sun/stream/',
'title': 'All About The Sun',
'artist': 'Quantum Jazz',
'match_confidence': 65}
]

search_results = [
MediaEntry(media_type=MediaType.MUSIC,
playback=PlaybackType.AUDIO,
image='https://freemusicarchive.org/legacy/fma-smaller.jpg',
uri='https://freemusicarchive.org/track/07_-_Quantum_Jazz_-_Orbiting_A_Distant_Planet/stream/',
skill_icon='https://freemusicarchive.org/legacy/fma-smaller.jpg',
title='Orbiting A Distant Planet',
artist='Quantum Jazz',
skill_id='skill-free_music_archive.neongeckocom',
match_confidence=65
),
MediaEntry(media_type=MediaType.MUSIC,
playback=PlaybackType.AUDIO,
image='https://freemusicarchive.org/legacy/fma-smaller.jpg',
uri='https://freemusicarchive.org/track/05_-_Quantum_Jazz_-_Passing_Fields/stream/',
skill_icon='https://freemusicarchive.org/legacy/fma-smaller.jpg',
title='Passing Fields',
artist='Quantum Jazz',
skill_id='skill-free_music_archive.neongeckocom',
match_confidence=65),
MediaEntry(media_type=MediaType.MUSIC,
playback=PlaybackType.AUDIO,
image='https://freemusicarchive.org/legacy/fma-smaller.jpg',
uri='https://freemusicarchive.org/track/04_-_Quantum_Jazz_-_All_About_The_Sun/stream/',
skill_icon='https://freemusicarchive.org/legacy/fma-smaller.jpg',
title='All About The Sun',
artist='Quantum Jazz',
skill_id='skill-free_music_archive.neongeckocom',
match_confidence=65)
]


class TestMediaEntry(unittest.TestCase):
def test_init(self):
data = valid_search_results[0]
data = dict_search_results[0]

# Test MediaEntry init
entry = MediaEntry(**data)
Expand All @@ -52,15 +85,25 @@ def test_init(self):
new_entry = MediaEntry(**data)
self.assertEqual(entry, new_entry)

def test_as_dict(self):
for idx, track in enumerate(search_results):
for k, v in track.as_dict.items():
if k in dict_search_results[idx]:
self.assertEqual(v, dict_search_results[idx][k])

for idx, track in enumerate(dict_search_results):
self.assertEqual(MediaEntry.from_dict(track), search_results[idx])

def test_from_dict(self):
dict_data = valid_search_results[1]
dict_data = dict_search_results[1]
from_dict = MediaEntry.from_dict(dict_data)
self.assertIsInstance(from_dict, MediaEntry)
from_init = MediaEntry(dict_data["uri"], dict_data["title"],
image=dict_data["image"],
match_confidence=dict_data["match_confidence"],
playback=PlaybackType.AUDIO,
skill_icon=dict_data["skill_icon"],
skill_id=dict_data["skill_id"],
media_type=dict_data["media_type"],
artist=dict_data["artist"])
self.assertEqual(from_init, from_dict)
Expand All @@ -85,17 +128,33 @@ def test_properties(self):
self.assertTrue(pl.is_last_track)

# Playlist of dicts
pl = Playlist(valid_search_results, title="my playlist")
pl = Playlist(dict_search_results, title="my playlist")
self.assertEqual(pl.title, "my playlist")
self.assertEqual(pl.position, 0)
self.assertEqual(len(pl), len(valid_search_results))
self.assertEqual(len(pl.entries), len(valid_search_results))
self.assertEqual(len(pl), len(dict_search_results))
self.assertEqual(len(pl.entries), len(dict_search_results))
for entry in pl.entries:
self.assertIsInstance(entry, MediaEntry)
self.assertIsInstance(pl.current_track, MediaEntry)
self.assertTrue(pl.is_first_track)
self.assertFalse(pl.is_last_track)

# Playlist of MediaEntry
pl = Playlist(search_results, title="Test Jazz")
self.assertEqual(pl.title, "Test Jazz")
self.assertEqual(pl.position, 0)
self.assertEqual(len(pl), len(search_results))
self.assertEqual(len(pl.entries), len(search_results))
for entry in pl.entries:
self.assertIsInstance(entry, MediaEntry)
self.assertIsInstance(pl.current_track, MediaEntry)
self.assertTrue(pl.is_first_track)
self.assertFalse(pl.is_last_track)

self.assertListEqual(pl.entries, search_results)
for idx, e in enumerate(pl.as_dict["playlist"]):
self.assertEqual(MediaEntry.from_dict(e), search_results[idx])

def test_goto_start(self):
# TODO
pass
Expand Down Expand Up @@ -150,7 +209,7 @@ def test_validate_position(self):
self.assertEqual(pl.position, 0)

# Test playlist of len 1
pl = Playlist([valid_search_results[0]])
pl = Playlist([dict_search_results[0]])
pl.position = 0
pl._validate_position()
self.assertEqual(pl.position, 0)
Expand All @@ -159,7 +218,7 @@ def test_validate_position(self):
self.assertEqual(pl.position, 0)

# Test playlist of len>1
pl = Playlist(valid_search_results)
pl = Playlist(dict_search_results)
pl.position = 0
pl._validate_position()
self.assertEqual(pl.position, 0)
Expand Down

0 comments on commit a05ab7b

Please sign in to comment.