mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-07 08:26:53 +08:00
fix: return Emby item server ids
This commit is contained in:
@@ -42,6 +42,8 @@ def play_item(
|
|||||||
success=True,
|
success=True,
|
||||||
data={
|
data={
|
||||||
"url": play_url,
|
"url": play_url,
|
||||||
|
"item_id": item.item_id or itemid,
|
||||||
|
"server_id": item.server_id,
|
||||||
"server_type": item.server,
|
"server_type": item.server,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -160,11 +160,14 @@ class Emby:
|
|||||||
else:
|
else:
|
||||||
library_type = MediaType.UNKNOWN.value
|
library_type = MediaType.UNKNOWN.value
|
||||||
image = self.__get_local_image_by_id(library.get("Id"))
|
image = self.__get_local_image_by_id(library.get("Id"))
|
||||||
server_query = f"serverId={self.serverid}&" if self.serverid else ""
|
server_id = library.get("ServerId") or self.serverid
|
||||||
|
server_query = f"serverId={server_id}&" if server_id else ""
|
||||||
libraries.append(
|
libraries.append(
|
||||||
schemas.MediaServerLibrary(
|
schemas.MediaServerLibrary(
|
||||||
server="emby",
|
server="emby",
|
||||||
id=library.get("Id"),
|
id=library.get("Id"),
|
||||||
|
item_id=library.get("Id"),
|
||||||
|
server_id=server_id,
|
||||||
name=library.get("Name"),
|
name=library.get("Name"),
|
||||||
path=library.get("Path"),
|
path=library.get("Path"),
|
||||||
type=library_type,
|
type=library_type,
|
||||||
@@ -652,6 +655,7 @@ class Emby:
|
|||||||
return schemas.MediaServerItem(
|
return schemas.MediaServerItem(
|
||||||
server="emby",
|
server="emby",
|
||||||
library=item.get("ParentId"),
|
library=item.get("ParentId"),
|
||||||
|
server_id=item.get("ServerId"),
|
||||||
item_id=item.get("Id"),
|
item_id=item.get("Id"),
|
||||||
item_type=item.get("Type"),
|
item_type=item.get("Type"),
|
||||||
title=item.get("Name"),
|
title=item.get("Name"),
|
||||||
@@ -1092,12 +1096,14 @@ class Emby:
|
|||||||
logger.error(f"连接Emby出错:" + str(e))
|
logger.error(f"连接Emby出错:" + str(e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_play_url(self, item_id: str) -> str:
|
def get_play_url(self, item_id: str, server_id: Optional[str] = None) -> str:
|
||||||
"""
|
"""
|
||||||
拼装媒体播放链接
|
拼装媒体播放链接
|
||||||
:param item_id: 媒体的的ID
|
:param item_id: 媒体的的ID
|
||||||
|
:param server_id: 媒体服务器ID
|
||||||
"""
|
"""
|
||||||
server_query = f"&serverId={self.serverid}" if self.serverid else ""
|
server_id = server_id or self.serverid
|
||||||
|
server_query = f"&serverId={server_id}" if server_id else ""
|
||||||
return f"{self._playhost or self._host}web/index.html#!" \
|
return f"{self._playhost or self._host}web/index.html#!" \
|
||||||
f"/item?id={item_id}&context=home{server_query}"
|
f"/item?id={item_id}&context=home{server_query}"
|
||||||
|
|
||||||
@@ -1165,7 +1171,8 @@ class Emby:
|
|||||||
str(item_path).startswith(folder) for folder in library_folders):
|
str(item_path).startswith(folder) for folder in library_folders):
|
||||||
continue
|
continue
|
||||||
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
|
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
|
||||||
link = self.get_play_url(item.get("Id"))
|
server_id = item.get("ServerId") or self.serverid
|
||||||
|
link = self.get_play_url(item.get("Id"), server_id=server_id)
|
||||||
if item_type == MediaType.MOVIE.value:
|
if item_type == MediaType.MOVIE.value:
|
||||||
title = item.get("Name")
|
title = item.get("Name")
|
||||||
subtitle = str(item.get("ProductionYear")) if item.get("ProductionYear") else None
|
subtitle = str(item.get("ProductionYear")) if item.get("ProductionYear") else None
|
||||||
@@ -1186,7 +1193,7 @@ class Emby:
|
|||||||
ret_resume.append(schemas.MediaServerPlayItem(
|
ret_resume.append(schemas.MediaServerPlayItem(
|
||||||
id=item.get("Id"),
|
id=item.get("Id"),
|
||||||
item_id=item.get("Id"),
|
item_id=item.get("Id"),
|
||||||
server_id=self.serverid,
|
server_id=server_id,
|
||||||
title=title,
|
title=title,
|
||||||
subtitle=subtitle,
|
subtitle=subtitle,
|
||||||
type=item_type,
|
type=item_type,
|
||||||
@@ -1237,12 +1244,13 @@ class Emby:
|
|||||||
str(item_path).startswith(folder) for folder in library_folders):
|
str(item_path).startswith(folder) for folder in library_folders):
|
||||||
continue
|
continue
|
||||||
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
|
item_type = MediaType.MOVIE.value if item.get("Type") == "Movie" else MediaType.TV.value
|
||||||
link = self.get_play_url(item.get("Id"))
|
server_id = item.get("ServerId") or self.serverid
|
||||||
|
link = self.get_play_url(item.get("Id"), server_id=server_id)
|
||||||
image = self.__get_local_image_by_id(item_id=item.get("Id"))
|
image = self.__get_local_image_by_id(item_id=item.get("Id"))
|
||||||
ret_latest.append(schemas.MediaServerPlayItem(
|
ret_latest.append(schemas.MediaServerPlayItem(
|
||||||
id=item.get("Id"),
|
id=item.get("Id"),
|
||||||
item_id=item.get("Id"),
|
item_id=item.get("Id"),
|
||||||
server_id=self.serverid,
|
server_id=server_id,
|
||||||
title=item.get("Name"),
|
title=item.get("Name"),
|
||||||
subtitle=str(item.get("ProductionYear")) if item.get("ProductionYear") else None,
|
subtitle=str(item.get("ProductionYear")) if item.get("ProductionYear") else None,
|
||||||
type=item_type,
|
type=item_type,
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ class MediaServerLibrary(BaseModel):
|
|||||||
server: Optional[str] = None
|
server: Optional[str] = None
|
||||||
# ID
|
# ID
|
||||||
id: Optional[Union[str, int]] = None
|
id: Optional[Union[str, int]] = None
|
||||||
|
# 媒体服务器项目ID
|
||||||
|
item_id: Optional[Union[str, int]] = None
|
||||||
|
# 媒体服务器ID
|
||||||
|
server_id: Optional[str] = None
|
||||||
# 名称
|
# 名称
|
||||||
name: Optional[str] = None
|
name: Optional[str] = None
|
||||||
# 路径
|
# 路径
|
||||||
@@ -101,6 +105,8 @@ class MediaServerItem(BaseModel):
|
|||||||
server: Optional[str] = None
|
server: Optional[str] = None
|
||||||
# 媒体库ID
|
# 媒体库ID
|
||||||
library: Optional[Union[str, int]] = None
|
library: Optional[Union[str, int]] = None
|
||||||
|
# 媒体服务器ID
|
||||||
|
server_id: Optional[str] = None
|
||||||
# ID
|
# ID
|
||||||
item_id: Optional[str] = None
|
item_id: Optional[str] = None
|
||||||
# 类型
|
# 类型
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ class EmbyDashboardLinksTest(unittest.TestCase):
|
|||||||
request_utils_cls.return_value.get_res.return_value = _FakeResponse([
|
request_utils_cls.return_value.get_res.return_value = _FakeResponse([
|
||||||
{
|
{
|
||||||
"Id": "emby-item-id",
|
"Id": "emby-item-id",
|
||||||
|
"ServerId": "item-server-id",
|
||||||
"Name": "测试电影",
|
"Name": "测试电影",
|
||||||
"Type": "Movie",
|
"Type": "Movie",
|
||||||
"ProductionYear": 2026,
|
"ProductionYear": 2026,
|
||||||
@@ -90,13 +91,39 @@ class EmbyDashboardLinksTest(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertEqual(items[0].id, "emby-item-id")
|
self.assertEqual(items[0].id, "emby-item-id")
|
||||||
self.assertEqual(items[0].item_id, "emby-item-id")
|
self.assertEqual(items[0].item_id, "emby-item-id")
|
||||||
self.assertEqual(items[0].server_id, "server-id")
|
self.assertEqual(items[0].server_id, "item-server-id")
|
||||||
self.assertIn("id=emby-item-id", items[0].link)
|
self.assertIn("id=emby-item-id", items[0].link)
|
||||||
self.assertIn("serverId=server-id", items[0].link)
|
self.assertIn("serverId=item-server-id", items[0].link)
|
||||||
|
|
||||||
|
def test_get_librarys_returns_item_and_server_ids(self):
|
||||||
|
"""媒体库卡片需要返回 Emby parentId 和 server_id 供前端生成 App 跳转。"""
|
||||||
|
client = self._build_client()
|
||||||
|
|
||||||
|
with (
|
||||||
|
patch.object(client, "_Emby__get_emby_librarys") as librarys,
|
||||||
|
patch.object(client, "_Emby__get_local_image_by_id") as image_by_id,
|
||||||
|
):
|
||||||
|
librarys.return_value = [
|
||||||
|
{
|
||||||
|
"Id": "library-id",
|
||||||
|
"ServerId": "library-server-id",
|
||||||
|
"Name": "电影库",
|
||||||
|
"CollectionType": "movies",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
image_by_id.return_value = "http://emby.local/image"
|
||||||
|
|
||||||
|
items = client.get_librarys()
|
||||||
|
|
||||||
|
self.assertEqual(items[0].id, "library-id")
|
||||||
|
self.assertEqual(items[0].item_id, "library-id")
|
||||||
|
self.assertEqual(items[0].server_id, "library-server-id")
|
||||||
|
self.assertIn("parentId=library-id", items[0].link)
|
||||||
|
self.assertIn("serverId=library-server-id", items[0].link)
|
||||||
|
|
||||||
def test_play_item_returns_server_type(self):
|
def test_play_item_returns_server_type(self):
|
||||||
"""播放地址接口需要返回 server_type,供前端跳转时选择正确媒体服务器类型。"""
|
"""播放地址接口需要返回 server_type,供前端跳转时选择正确媒体服务器类型。"""
|
||||||
item = schemas.MediaServerItem(server="emby", item_id="emby-item-id")
|
item = schemas.MediaServerItem(server="emby", item_id="emby-item-id", server_id="server-id")
|
||||||
|
|
||||||
with (
|
with (
|
||||||
patch("app.api.endpoints.mediaserver.MediaServerHelper") as helper_cls,
|
patch("app.api.endpoints.mediaserver.MediaServerHelper") as helper_cls,
|
||||||
@@ -111,6 +138,8 @@ class EmbyDashboardLinksTest(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertTrue(response.success)
|
self.assertTrue(response.success)
|
||||||
self.assertEqual(response.data["url"], "http://emby.local/web/index.html#!/item?id=emby-item-id")
|
self.assertEqual(response.data["url"], "http://emby.local/web/index.html#!/item?id=emby-item-id")
|
||||||
|
self.assertEqual(response.data["item_id"], "emby-item-id")
|
||||||
|
self.assertEqual(response.data["server_id"], "server-id")
|
||||||
self.assertEqual(response.data["server_type"], "emby")
|
self.assertEqual(response.data["server_type"], "emby")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user