mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-04 23:17:20 +08:00
refactor: 修改emby、jellyfin API url请求传参方式
This commit is contained in:
+111
-52
@@ -59,9 +59,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return []
|
return []
|
||||||
req_url = "%semby/Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}emby/Library/SelectableMediaFolders"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json()
|
return res.json()
|
||||||
else:
|
else:
|
||||||
@@ -77,9 +80,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return []
|
return []
|
||||||
req_url = "%semby/Library/VirtualFolders/Query?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}emby/Library/VirtualFolders/Query"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
library_items = res.json().get("Items")
|
library_items = res.json().get("Items")
|
||||||
librarys = []
|
librarys = []
|
||||||
@@ -116,9 +122,10 @@ class Emby:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = f"{self._host}emby/Users/{user}/Views?api_key={self._apikey}"
|
url = f"{self._host}emby/Users/{user}/Views"
|
||||||
|
params = {"api_key": self._apikey}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json().get("Items")
|
return res.json().get("Items")
|
||||||
else:
|
else:
|
||||||
@@ -166,9 +173,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Users"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
users = res.json()
|
users = res.json()
|
||||||
# 先查询是否有与当前用户名称匹配的
|
# 先查询是否有与当前用户名称匹配的
|
||||||
@@ -195,7 +205,7 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%semby/Users/AuthenticateByName" % self._host
|
url = f"{self._host}emby/Users/AuthenticateByName"
|
||||||
try:
|
try:
|
||||||
res = RequestUtils(headers={
|
res = RequestUtils(headers={
|
||||||
'X-Emby-Authorization': f'MediaBrowser Client="MoviePilot", '
|
'X-Emby-Authorization': f'MediaBrowser Client="MoviePilot", '
|
||||||
@@ -206,7 +216,7 @@ class Emby:
|
|||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
"Accept": "application/json"
|
"Accept": "application/json"
|
||||||
}).post_res(
|
}).post_res(
|
||||||
url=req_url,
|
url=url,
|
||||||
data=json.dumps({
|
data=json.dumps({
|
||||||
"Username": username,
|
"Username": username,
|
||||||
"Pw": password
|
"Pw": password
|
||||||
@@ -229,9 +239,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}System/Info"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json().get("Id")
|
return res.json().get("Id")
|
||||||
else:
|
else:
|
||||||
@@ -247,9 +260,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return 0
|
return 0
|
||||||
req_url = "%semby/Users/Query?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}emby/Users/Query"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json().get("TotalRecordCount")
|
return res.json().get("TotalRecordCount")
|
||||||
else:
|
else:
|
||||||
@@ -266,9 +282,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return schemas.Statistic()
|
return schemas.Statistic()
|
||||||
req_url = "%semby/Items/Counts?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}emby/Items/Counts"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json()
|
result = res.json()
|
||||||
return schemas.Statistic(
|
return schemas.Statistic(
|
||||||
@@ -292,18 +311,19 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = ("%semby/Items?"
|
url = f"{self._host}emby/Items"
|
||||||
"IncludeItemTypes=Series"
|
params={
|
||||||
"&Fields=ProductionYear"
|
"IncludeItemTypes": "Series",
|
||||||
"&StartIndex=0"
|
"Fields": "ProductionYear",
|
||||||
"&Recursive=true"
|
"StartIndex": 0,
|
||||||
"&SearchTerm=%s"
|
"Recursive": "true",
|
||||||
"&Limit=10"
|
"SearchTerm": name,
|
||||||
"&IncludeSearchTypes=false"
|
"Limit": 10,
|
||||||
"&api_key=%s") % (
|
"IncludeSearchTypes": "false",
|
||||||
self._host, name, self._apikey)
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
res_items = res.json().get("Items")
|
res_items = res.json().get("Items")
|
||||||
if res_items:
|
if res_items:
|
||||||
@@ -329,11 +349,19 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%semby/Items?IncludeItemTypes=Movie&Fields=ProductionYear&StartIndex=0" \
|
url = f"{self._host}emby/Items"
|
||||||
"&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % (
|
params = {
|
||||||
self._host, title, self._apikey)
|
"IncludeItemTypes": "Movie",
|
||||||
|
"Fields": "ProductionYear",
|
||||||
|
"StartIndex": 0,
|
||||||
|
"Recursive": "true",
|
||||||
|
"SearchTerm": title,
|
||||||
|
"Limit": 10,
|
||||||
|
"IncludeSearchTypes": "false",
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
res_items = res.json().get("Items")
|
res_items = res.json().get("Items")
|
||||||
if res_items:
|
if res_items:
|
||||||
@@ -403,9 +431,13 @@ class Emby:
|
|||||||
if not season:
|
if not season:
|
||||||
season = ""
|
season = ""
|
||||||
try:
|
try:
|
||||||
req_url = "%semby/Shows/%s/Episodes?Season=%s&IsMissing=false&api_key=%s" % (
|
url = f"{self._host}emby/Shows/{item_id}/Episodes"
|
||||||
self._host, item_id, season, self._apikey)
|
params = {
|
||||||
res_json = RequestUtils().get_res(req_url)
|
"Season": season,
|
||||||
|
"IsMissing": "false",
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
|
res_json = RequestUtils().get_res(url, params)
|
||||||
if res_json:
|
if res_json:
|
||||||
tv_item = res_json.json()
|
tv_item = res_json.json()
|
||||||
res_items = tv_item.get("Items")
|
res_items = tv_item.get("Items")
|
||||||
@@ -438,9 +470,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%semby/Items/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey)
|
url = f"{self._host}emby/Items/{item_id}/RemoteImages"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils(timeout=10).get_res(req_url)
|
res = RequestUtils(timeout=10).get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
images = res.json().get("Images")
|
images = res.json().get("Images")
|
||||||
if images:
|
if images:
|
||||||
@@ -465,9 +500,9 @@ class Emby:
|
|||||||
logger.error("Emby外网播放地址未能获取或为空")
|
logger.error("Emby外网播放地址未能获取或为空")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
req_url = "%sItems/%s/Images/%s" % (self._playhost, item_id, image_type)
|
url = f"{self._playhost}Items/{item_id}/Images/{image_type}"
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url)
|
||||||
if res and res.status_code != 404:
|
if res and res.status_code != 404:
|
||||||
logger.info(f"影片图片链接:{res.url}")
|
logger.info(f"影片图片链接:{res.url}")
|
||||||
return res.url
|
return res.url
|
||||||
@@ -484,9 +519,13 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return False
|
return False
|
||||||
req_url = "%semby/Items/%s/Refresh?Recursive=true&api_key=%s" % (self._host, item_id, self._apikey)
|
url = f"{self._host}emby/Items/{item_id}/Refresh"
|
||||||
|
params = {
|
||||||
|
"Recursive": "true",
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().post_res(req_url)
|
res = RequestUtils().post_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@@ -502,9 +541,12 @@ class Emby:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return False
|
return False
|
||||||
req_url = "%semby/Library/Refresh?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}emby/Library/Refresh"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().post_res(req_url)
|
res = RequestUtils().post_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@@ -581,9 +623,12 @@ class Emby:
|
|||||||
return None
|
return None
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%semby/Users/%s/Items/%s?api_key=%s" % (self._host, self.user, itemid, self._apikey)
|
url = f"{self._host}emby/Users/{self.user}/Items/{itemid}"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res and res.status_code == 200:
|
if res and res.status_code == 200:
|
||||||
item = res.json()
|
item = res.json()
|
||||||
tmdbid = item.get("ProviderIds", {}).get("Tmdb")
|
tmdbid = item.get("ProviderIds", {}).get("Tmdb")
|
||||||
@@ -612,9 +657,13 @@ class Emby:
|
|||||||
yield None
|
yield None
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
yield None
|
yield None
|
||||||
req_url = "%semby/Users/%s/Items?ParentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey)
|
url = f"{self._host}emby/Users/{self.user}/Items"
|
||||||
|
params = {
|
||||||
|
"ParentId": parent,
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res and res.status_code == 200:
|
if res and res.status_code == 200:
|
||||||
results = res.json().get("Items") or []
|
results = res.json().get("Items") or []
|
||||||
for result in results:
|
for result in results:
|
||||||
@@ -1033,10 +1082,15 @@ class Emby:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = (f"{self._host}Users/{user}/Items/Resume?"
|
url = f"{self._host}Users/{user}/Items/Resume"
|
||||||
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
|
params = {
|
||||||
|
"Limit": 100,
|
||||||
|
"MediaTypes": "Video",
|
||||||
|
"Fields": "ProductionYear,Path",
|
||||||
|
"api_key": self._apikey,
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json().get("Items") or []
|
result = res.json().get("Items") or []
|
||||||
ret_resume = []
|
ret_resume = []
|
||||||
@@ -1096,10 +1150,15 @@ class Emby:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = (f"{self._host}Users/{user}/Items/Latest?"
|
url = f"{self._host}Users/{user}/Items/Latest"
|
||||||
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
|
params = {
|
||||||
|
"Limit": 100,
|
||||||
|
"MediaTypes": "Video",
|
||||||
|
"Fields": "ProductionYear,Path",
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json() or []
|
result = res.json() or []
|
||||||
ret_latest = []
|
ret_latest = []
|
||||||
|
|||||||
@@ -55,9 +55,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return []
|
return []
|
||||||
req_url = "%sLibrary/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Library/SelectableMediaFolders"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json()
|
return res.json()
|
||||||
else:
|
else:
|
||||||
@@ -73,9 +76,13 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return []
|
return []
|
||||||
req_url = "%sLibrary/VirtualFolders?api_key=%s" % (self._host, self._apikey)
|
|
||||||
|
url = f"{self._host}Library/VirtualFolders"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
library_items = res.json()
|
library_items = res.json()
|
||||||
librarys = []
|
librarys = []
|
||||||
@@ -112,9 +119,10 @@ class Jellyfin:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = f"{self._host}Users/{user}/Views?api_key={self._apikey}"
|
url = f"{self._host}Users/{user}/Views"
|
||||||
|
params = {"api_key": self._apikey}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json().get("Items")
|
return res.json().get("Items")
|
||||||
else:
|
else:
|
||||||
@@ -165,9 +173,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return 0
|
return 0
|
||||||
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Users"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return len(res.json())
|
return len(res.json())
|
||||||
else:
|
else:
|
||||||
@@ -183,9 +194,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sUsers?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Users"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
users = res.json()
|
users = res.json()
|
||||||
# 先查询是否有与当前用户名称匹配的
|
# 先查询是否有与当前用户名称匹配的
|
||||||
@@ -212,7 +226,7 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sUsers/authenticatebyname" % self._host
|
url = f"{self._host}Users/authenticatebyname"
|
||||||
try:
|
try:
|
||||||
res = RequestUtils(headers={
|
res = RequestUtils(headers={
|
||||||
'X-Emby-Authorization': f'MediaBrowser Client="MoviePilot", '
|
'X-Emby-Authorization': f'MediaBrowser Client="MoviePilot", '
|
||||||
@@ -223,7 +237,7 @@ class Jellyfin:
|
|||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
"Accept": "application/json"
|
"Accept": "application/json"
|
||||||
}).post_res(
|
}).post_res(
|
||||||
url=req_url,
|
url=url,
|
||||||
data=json.dumps({
|
data=json.dumps({
|
||||||
"Username": username,
|
"Username": username,
|
||||||
"Pw": password
|
"Pw": password
|
||||||
@@ -246,9 +260,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sSystem/Info?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}System/Info"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json().get("Id")
|
return res.json().get("Id")
|
||||||
else:
|
else:
|
||||||
@@ -264,9 +281,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return schemas.Statistic()
|
return schemas.Statistic()
|
||||||
req_url = "%sItems/Counts?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Items/Counts"
|
||||||
|
params = {
|
||||||
|
'api_key': self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json()
|
result = res.json()
|
||||||
return schemas.Statistic(
|
return schemas.Statistic(
|
||||||
@@ -287,11 +307,16 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey or not self.user:
|
if not self._host or not self._apikey or not self.user:
|
||||||
return None
|
return None
|
||||||
req_url = ("%sUsers/%s/Items?"
|
url = f"{self._host}Users/{self.user}/Items"
|
||||||
"api_key=%s&searchTerm=%s&IncludeItemTypes=Series&Limit=10&Recursive=true") % (
|
params = {
|
||||||
self._host, self.user, self._apikey, name)
|
"IncludeItemTypes": "Series",
|
||||||
|
"Recursive": "true",
|
||||||
|
"searchTerm": name,
|
||||||
|
"Limit": 10,
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
res_items = res.json().get("Items")
|
res_items = res.json().get("Items")
|
||||||
if res_items:
|
if res_items:
|
||||||
@@ -317,11 +342,16 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey or not self.user:
|
if not self._host or not self._apikey or not self.user:
|
||||||
return None
|
return None
|
||||||
req_url = ("%sUsers/%s/Items?"
|
url = f"{self._host}Users/{self.user}/Items"
|
||||||
"api_key=%s&searchTerm=%s&IncludeItemTypes=Movie&Limit=10&Recursive=true") % (
|
params = {
|
||||||
self._host, self.user, self._apikey, title)
|
"IncludeItemTypes": "Movie",
|
||||||
|
"Recursive": "true",
|
||||||
|
"searchTerm": title,
|
||||||
|
"Limit": 10,
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
res_items = res.json().get("Items")
|
res_items = res.json().get("Items")
|
||||||
if res_items:
|
if res_items:
|
||||||
@@ -388,10 +418,15 @@ class Jellyfin:
|
|||||||
return None, {}
|
return None, {}
|
||||||
if not season:
|
if not season:
|
||||||
season = ""
|
season = ""
|
||||||
|
url = f"{self._host}Shows/{item_id}/Episodes"
|
||||||
|
params = {
|
||||||
|
"season": season,
|
||||||
|
"userId": self.user,
|
||||||
|
"isMissing": "false",
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
req_url = "%sShows/%s/Episodes?season=%s&&userId=%s&isMissing=false&api_key=%s" % (
|
res_json = RequestUtils().get_res(url, params)
|
||||||
self._host, item_id, season, self.user, self._apikey)
|
|
||||||
res_json = RequestUtils().get_res(req_url)
|
|
||||||
if res_json:
|
if res_json:
|
||||||
tv_info = res_json.json()
|
tv_info = res_json.json()
|
||||||
res_items = tv_info.get("Items")
|
res_items = tv_info.get("Items")
|
||||||
@@ -418,15 +453,16 @@ class Jellyfin:
|
|||||||
def get_remote_image_by_id(self, item_id: str, image_type: str) -> Optional[str]:
|
def get_remote_image_by_id(self, item_id: str, image_type: str) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
根据ItemId从Jellyfin查询TMDB图片地址
|
根据ItemId从Jellyfin查询TMDB图片地址
|
||||||
:param item_id: 在Emby中的ID
|
:param item_id: 在Jellyfin中的ID
|
||||||
:param image_type: 图片的类弄地,poster或者backdrop等
|
:param image_type: 图片的类弄地,poster或者backdrop等
|
||||||
:return: 图片对应在TMDB中的URL
|
:return: 图片对应在TMDB中的URL
|
||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sItems/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey)
|
url = f"{self._host}Items/{item_id}/RemoteImages"
|
||||||
|
params = {"api_key": self._apikey}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils(timeout=10).get_res(req_url)
|
res = RequestUtils(timeout=10).get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
images = res.json().get("Images")
|
images = res.json().get("Images")
|
||||||
for image in images:
|
for image in images:
|
||||||
@@ -460,9 +496,9 @@ class Jellyfin:
|
|||||||
_host = self._host
|
_host = self._host
|
||||||
if host_type:
|
if host_type:
|
||||||
_host = self._playhost
|
_host = self._playhost
|
||||||
req_url = "%sItems/%s/Images/%s" % (_host, item_id, image_type)
|
url = f"{_host}Items/{item_id}/Images/{image_type}"
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url)
|
||||||
if res and res.status_code != 404:
|
if res and res.status_code != 404:
|
||||||
logger.info(f"影片图片链接:{res.url}")
|
logger.info(f"影片图片链接:{res.url}")
|
||||||
return res.url
|
return res.url
|
||||||
@@ -481,9 +517,12 @@ class Jellyfin:
|
|||||||
:param key: 需要得到父item中的键值对
|
:param key: 需要得到父item中的键值对
|
||||||
:return key对应类型的值
|
:return key对应类型的值
|
||||||
"""
|
"""
|
||||||
req_url = "%sItems/%s/Ancestors?api_key=%s" % (self._host, item_id, self._apikey)
|
url = f"{self._host}Items/{item_id}/Ancestors"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return res.json()[index].get(key)
|
return res.json()[index].get(key)
|
||||||
else:
|
else:
|
||||||
@@ -499,9 +538,12 @@ class Jellyfin:
|
|||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return False
|
return False
|
||||||
req_url = "%sLibrary/Refresh?api_key=%s" % (self._host, self._apikey)
|
url = f"{self._host}Library/Refresh"
|
||||||
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().post_res(req_url)
|
res = RequestUtils().post_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
@@ -640,10 +682,12 @@ class Jellyfin:
|
|||||||
return None
|
return None
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return None
|
return None
|
||||||
req_url = "%sUsers/%s/Items/%s?api_key=%s" % (
|
url = f"{self._host}Users/{self.user}/Items/{itemid}"
|
||||||
self._host, self.user, itemid, self._apikey)
|
params = {
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res and res.status_code == 200:
|
if res and res.status_code == 200:
|
||||||
item = res.json()
|
item = res.json()
|
||||||
tmdbid = item.get("ProviderIds", {}).get("Tmdb")
|
tmdbid = item.get("ProviderIds", {}).get("Tmdb")
|
||||||
@@ -672,9 +716,13 @@ class Jellyfin:
|
|||||||
yield None
|
yield None
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
yield None
|
yield None
|
||||||
req_url = "%sUsers/%s/Items?parentId=%s&api_key=%s" % (self._host, self.user, parent, self._apikey)
|
url = f"{self._host}Users/{self.user}/Items"
|
||||||
|
params = {
|
||||||
|
"parentId": parent,
|
||||||
|
"api_key": self._apikey
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res and res.status_code == 200:
|
if res and res.status_code == 200:
|
||||||
results = res.json().get("Items") or []
|
results = res.json().get("Items") or []
|
||||||
for result in results:
|
for result in results:
|
||||||
@@ -736,7 +784,7 @@ class Jellyfin:
|
|||||||
def __get_local_image_by_id(self, item_id: str) -> str:
|
def __get_local_image_by_id(self, item_id: str) -> str:
|
||||||
"""
|
"""
|
||||||
根据ItemId从媒体服务器查询有声书图片地址
|
根据ItemId从媒体服务器查询有声书图片地址
|
||||||
:param: item_id: 在Emby中的ID
|
:param: item_id: 在Jellyfin中的ID
|
||||||
:param: remote 是否远程使用,TG微信等客户端调用应为True
|
:param: remote 是否远程使用,TG微信等客户端调用应为True
|
||||||
:param: inner 是否NT内部调用,为True是会使用NT中转
|
:param: inner 是否NT内部调用,为True是会使用NT中转
|
||||||
"""
|
"""
|
||||||
@@ -747,7 +795,7 @@ class Jellyfin:
|
|||||||
def __get_backdrop_url(self, item_id: str, image_tag: str) -> str:
|
def __get_backdrop_url(self, item_id: str, image_tag: str) -> str:
|
||||||
"""
|
"""
|
||||||
获取Backdrop图片地址
|
获取Backdrop图片地址
|
||||||
:param: item_id: 在Emby中的ID
|
:param: item_id: 在Jellyfin中的ID
|
||||||
:param: image_tag: 图片的tag
|
:param: image_tag: 图片的tag
|
||||||
:param: remote 是否远程使用,TG微信等客户端调用应为True
|
:param: remote 是否远程使用,TG微信等客户端调用应为True
|
||||||
:param: inner 是否NT内部调用,为True是会使用NT中转
|
:param: inner 是否NT内部调用,为True是会使用NT中转
|
||||||
@@ -769,10 +817,16 @@ class Jellyfin:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = (f"{self._host}Users/{user}/Items/Resume?"
|
|
||||||
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
|
url = f"{self._host}Users/{user}/Items/Resume"
|
||||||
|
params = {
|
||||||
|
"Limit": 100,
|
||||||
|
"MediaTypes": "Video",
|
||||||
|
"Fields": "ProductionYear,Path",
|
||||||
|
"api_key": self._apikey,
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json().get("Items") or []
|
result = res.json().get("Items") or []
|
||||||
ret_resume = []
|
ret_resume = []
|
||||||
@@ -830,10 +884,15 @@ class Jellyfin:
|
|||||||
user = self.get_user(username)
|
user = self.get_user(username)
|
||||||
else:
|
else:
|
||||||
user = self.user
|
user = self.user
|
||||||
req_url = (f"{self._host}Users/{user}/Items/Latest?"
|
url = f"{self._host}Users/{user}/Items/Latest"
|
||||||
f"Limit=100&MediaTypes=Video&api_key={self._apikey}&Fields=ProductionYear,Path")
|
params = {
|
||||||
|
"Limit": 100,
|
||||||
|
"MediaTypes": "Video",
|
||||||
|
"Fields": "ProductionYear,Path",
|
||||||
|
"api_key": self._apikey,
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
res = RequestUtils().get_res(req_url)
|
res = RequestUtils().get_res(url, params)
|
||||||
if res:
|
if res:
|
||||||
result = res.json() or []
|
result = res.json() or []
|
||||||
ret_latest = []
|
ret_latest = []
|
||||||
@@ -868,7 +927,7 @@ class Jellyfin:
|
|||||||
|
|
||||||
def get_user_library_folders(self):
|
def get_user_library_folders(self):
|
||||||
"""
|
"""
|
||||||
获取Emby媒体库文件夹列表(排除黑名单)
|
获取Jellyfin媒体库文件夹列表(排除黑名单)
|
||||||
"""
|
"""
|
||||||
if not self._host or not self._apikey:
|
if not self._host or not self._apikey:
|
||||||
return []
|
return []
|
||||||
|
|||||||
Reference in New Issue
Block a user