Skip to content

Commit cdd6c21

Browse files
committed
Added video trailer attribute for video trailer playback in UMC
1 parent 5002b19 commit cdd6c21

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

custom_components/plex_recently_added/manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"iot_class": "local_polling",
1010
"issue_tracker": "https://github.com/custom-components/sensor.plex_recently_added/issues",
1111
"requirements": [],
12-
"version": "0.4.6"
12+
"version": "0.4.7"
1313
}

custom_components/plex_recently_added/parser.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def parse_data(data, max, base_url, token, identifier, section_key, images_base_
6767
data_output["genres"] = ", ".join([genre['tag'] for genre in item.get('Genre', [])][:3])
6868
data_output["rating"] = ('\N{BLACK STAR} ' + str(item.get("rating"))) if int(float(item.get("rating", 0))) > 0 else ''
6969
data_output['summary'] = item.get('summary', '')
70+
data_output['trailer'] = item.get('trailer')
7071
data_output["poster"] = (f'{images_base_url}?path={thumb}') if thumb else ""
7172
data_output["fanart"] = (f'{images_base_url}?path={art}') if art else ""
7273
data_output["deep_link"] = deep_link if identifier else None
@@ -75,4 +76,3 @@ def parse_data(data, max, base_url, token, identifier, section_key, images_base_
7576

7677
return output
7778

78-

custom_components/plex_recently_added/plex_api.py

+33-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ def __init__(
3939
self._exclude_keywords = exclude_keywords
4040
self._images_base_url = f'/{name.lower() + "_" if len(name) > 0 else ""}plex_recently_added'
4141

42+
async def get_trailer_url(self, item_key):
43+
extras_url = f'http{self._ssl}://{self._host}:{self._port}/library/metadata/{item_key}/extras?X-Plex-Token={self._token}'
44+
try:
45+
extras_res = await self._hass.async_add_executor_job(
46+
requests.get,
47+
extras_url,
48+
{
49+
"headers": {
50+
"User-agent": USER_AGENT,
51+
"Accept": ACCEPTS,
52+
},
53+
"timeout": 10
54+
}
55+
)
56+
check_headers(extras_res)
57+
root = ElementTree.fromstring(extras_res.text)
58+
59+
for video in root.findall(".//Video"):
60+
if video.get("type") == "clip" and video.get("subtype") == "trailer":
61+
part = video.find(".//Part")
62+
if part is not None and part.get("key"):
63+
return f'http{self._ssl}://{self._host}:{self._port}{part.get("key")}&X-Plex-Token={self._token}'
64+
65+
except Exception as e:
66+
print(f"Error fetching trailer: {str(e)}")
67+
return None
68+
4269
async def update(self):
4370
info_url = 'http{0}://{1}:{2}'.format(
4471
self._ssl,
@@ -117,6 +144,11 @@ async def update(self):
117144
check_headers(sub_sec)
118145
root = ElementTree.fromstring(sub_sec.text)
119146
parsed_libs = parse_library(root)
147+
148+
# Fetch trailer URLs for each item
149+
for item in parsed_libs:
150+
item['trailer'] = await self.get_trailer_url(item['ratingKey'])
151+
120152
if library["type"] not in data['all']:
121153
data['all'][library["type"]] = []
122154
data['all'][library["type"]] += parsed_libs
@@ -135,4 +167,4 @@ async def update(self):
135167

136168
class FailedToLogin(Exception):
137169
"Raised when the Plex user fail to Log-in"
138-
pass
170+
pass

0 commit comments

Comments
 (0)