142 lines
4.6 KiB
Python
142 lines
4.6 KiB
Python
"""Tests for DIDL-Lite parsing and domain model mapping."""
|
|
|
|
from r36s_dlna_browser.dlna.models import (
|
|
ItemType,
|
|
MediaItem,
|
|
classify_upnp_class,
|
|
parse_didl_item,
|
|
)
|
|
|
|
|
|
class TestClassifyUpnpClass:
|
|
def test_container(self):
|
|
assert classify_upnp_class("object.container.storageFolder") == ItemType.CONTAINER
|
|
|
|
def test_audio(self):
|
|
assert classify_upnp_class("object.item.audioItem.musicTrack") == ItemType.AUDIO
|
|
|
|
def test_video(self):
|
|
assert classify_upnp_class("object.item.videoItem") == ItemType.VIDEO
|
|
|
|
def test_image(self):
|
|
assert classify_upnp_class("object.item.imageItem.photo") == ItemType.IMAGE
|
|
|
|
def test_unknown(self):
|
|
assert classify_upnp_class("object.item.something") == ItemType.UNKNOWN
|
|
|
|
def test_empty(self):
|
|
assert classify_upnp_class("") == ItemType.UNKNOWN
|
|
|
|
|
|
class TestParseDIDLItem:
|
|
def test_audio_item(self):
|
|
didl = {
|
|
"id": "42",
|
|
"title": "My Song",
|
|
"parent_id": "10",
|
|
"upnp_class": "object.item.audioItem.musicTrack",
|
|
"resources": [
|
|
{
|
|
"url": "http://server/song.mp3",
|
|
"protocol_info": "http-get:*:audio/mpeg:*",
|
|
"size": "5000000",
|
|
"duration": "0:03:45",
|
|
}
|
|
],
|
|
"album_art_uri": "http://server/art.jpg",
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.object_id == "42"
|
|
assert item.title == "My Song"
|
|
assert item.item_type == ItemType.AUDIO
|
|
assert item.resource_url == "http://server/song.mp3"
|
|
assert item.mime_type == "http-get:*:audio/mpeg:*"
|
|
assert item.size == 5000000
|
|
assert item.duration == "0:03:45"
|
|
assert item.album_art_url == "http://server/art.jpg"
|
|
assert not item.is_container
|
|
|
|
def test_container_item(self):
|
|
didl = {
|
|
"id": "5",
|
|
"title": "Music",
|
|
"parent_id": "0",
|
|
"upnp_class": "object.container.storageFolder",
|
|
"child_count": "12",
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.object_id == "5"
|
|
assert item.title == "Music"
|
|
assert item.item_type == ItemType.CONTAINER
|
|
assert item.child_count == 12
|
|
assert item.is_container
|
|
|
|
def test_missing_resources(self):
|
|
didl = {"id": "99", "title": "NoRes", "upnp_class": "object.item.audioItem"}
|
|
item = parse_didl_item(didl)
|
|
assert item.resource_url == ""
|
|
assert item.size == 0
|
|
|
|
def test_single_resource_dict(self):
|
|
didl = {
|
|
"id": "1",
|
|
"title": "Track",
|
|
"upnp_class": "object.item.audioItem",
|
|
"resources": {"url": "http://srv/track.flac", "size": "100"},
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.resource_url == "http://srv/track.flac"
|
|
assert item.size == 100
|
|
|
|
def test_resource_string(self):
|
|
didl = {
|
|
"id": "2",
|
|
"title": "Track2",
|
|
"upnp_class": "object.item.videoItem",
|
|
"resources": ["http://srv/vid.mp4"],
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.resource_url == "http://srv/vid.mp4"
|
|
|
|
def test_prefers_media_resource_over_subtitle_resource(self):
|
|
didl = {
|
|
"id": "3",
|
|
"title": "Movie",
|
|
"upnp_class": "object.item.videoItem",
|
|
"resources": [
|
|
{
|
|
"url": "http://srv/movie.srt",
|
|
"protocol_info": "http-get:*:text/srt:*",
|
|
},
|
|
{
|
|
"url": "http://srv/movie.mkv",
|
|
"protocol_info": "http-get:*:video/x-matroska:*",
|
|
"size": "1200",
|
|
},
|
|
],
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.resource_url == "http://srv/movie.mkv"
|
|
assert item.mime_type == "http-get:*:video/x-matroska:*"
|
|
|
|
def test_alt_key_names(self):
|
|
"""Handles alternative key formats (@id, @parentID, class, etc.)."""
|
|
didl = {
|
|
"@id": "7",
|
|
"title": "Alt",
|
|
"@parentID": "3",
|
|
"class": "object.container",
|
|
"@childCount": "5",
|
|
}
|
|
item = parse_didl_item(didl)
|
|
assert item.object_id == "7"
|
|
assert item.parent_id == "3"
|
|
assert item.item_type == ItemType.CONTAINER
|
|
assert item.child_count == 5
|
|
|
|
def test_empty_dict(self):
|
|
item = parse_didl_item({})
|
|
assert item.object_id == ""
|
|
assert item.title == ""
|
|
assert item.item_type == ItemType.UNKNOWN
|