add webhook schemas

This commit is contained in:
jxxghp
2023-07-27 08:21:41 +08:00
parent 7699d4fc1b
commit 4039accf6d
9 changed files with 122 additions and 98 deletions

View File

@ -6,7 +6,7 @@ from app.core.context import MediaInfo
from app.log import logger
from app.modules import _ModuleBase
from app.modules.emby.emby import Emby
from app.schemas import ExistMediaInfo, RefreshMediaItem
from app.schemas import ExistMediaInfo, RefreshMediaItem, WebhookEventInfo
from app.schemas.types import MediaType
@ -32,7 +32,7 @@ class EmbyModule(_ModuleBase):
# Emby认证
return self.emby.authenticate(name, password)
def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[dict]:
def webhook_parser(self, body: Any, form: Any, args: Any) -> WebhookEventInfo:
"""
解析Webhook报文体
:param body: 请求体

View File

@ -5,7 +5,7 @@ from typing import List, Optional, Union, Dict, Generator
from app.core.config import settings
from app.log import logger
from app.schemas import RefreshMediaItem
from app.schemas import RefreshMediaItem, WebhookEventInfo
from app.schemas.types import MediaType
from app.utils.http import RequestUtils
from app.utils.singleton import Singleton
@ -537,58 +537,58 @@ class Emby(metaclass=Singleton):
logger.error(f"连接Users/Items出错" + str(e))
yield {}
def get_webhook_message(self, message_str: str) -> dict:
def get_webhook_message(self, message_str: str) -> WebhookEventInfo:
"""
解析Emby Webhook报文
"""
message = json.loads(message_str)
eventItem = {'event': message.get('Event', ''), "channel": "emby"}
eventItem = WebhookEventInfo(event=message.get('Event', ''), channel="emby")
if message.get('Item'):
if message.get('Item', {}).get('Type') == 'Episode':
eventItem['item_type'] = "TV"
eventItem['item_name'] = "%s %s%s %s" % (
eventItem.item_type = "TV"
eventItem.item_name = "%s %s%s %s" % (
message.get('Item', {}).get('SeriesName'),
"S" + str(message.get('Item', {}).get('ParentIndexNumber')),
"E" + str(message.get('Item', {}).get('IndexNumber')),
message.get('Item', {}).get('Name'))
eventItem['item_id'] = message.get('Item', {}).get('SeriesId')
eventItem['season_id'] = message.get('Item', {}).get('ParentIndexNumber')
eventItem['episode_id'] = message.get('Item', {}).get('IndexNumber')
eventItem.item_id = message.get('Item', {}).get('SeriesId')
eventItem.season_id = message.get('Item', {}).get('ParentIndexNumber')
eventItem.episode_id = message.get('Item', {}).get('IndexNumber')
elif message.get('Item', {}).get('Type') == 'Audio':
eventItem['item_type'] = "AUD"
eventItem.item_type = "AUD"
album = message.get('Item', {}).get('Album')
file_name = message.get('Item', {}).get('FileName')
eventItem['item_name'] = album
eventItem['overview'] = file_name
eventItem['item_id'] = message.get('Item', {}).get('AlbumId')
eventItem.item_name = album
eventItem.overview = file_name
eventItem.item_id = message.get('Item', {}).get('AlbumId')
else:
eventItem['item_type'] = "MOV"
eventItem['item_name'] = "%s %s" % (
eventItem.item_type = "MOV"
eventItem.item_name = "%s %s" % (
message.get('Item', {}).get('Name'), "(" + str(message.get('Item', {}).get('ProductionYear')) + ")")
eventItem['item_path'] = message.get('Item', {}).get('Path')
eventItem['item_id'] = message.get('Item', {}).get('Id')
eventItem.item_path = message.get('Item', {}).get('Path')
eventItem.item_id = message.get('Item', {}).get('Id')
eventItem['tmdb_id'] = message.get('Item', {}).get('ProviderIds', {}).get('Tmdb')
eventItem.tmdb_id = message.get('Item', {}).get('ProviderIds', {}).get('Tmdb')
if message.get('Item', {}).get('Overview') and len(message.get('Item', {}).get('Overview')) > 100:
eventItem['overview'] = str(message.get('Item', {}).get('Overview'))[:100] + "..."
eventItem.overview = str(message.get('Item', {}).get('Overview'))[:100] + "..."
else:
eventItem['overview'] = message.get('Item', {}).get('Overview')
eventItem['percentage'] = message.get('TranscodingInfo', {}).get('CompletionPercentage')
if not eventItem['percentage']:
eventItem.overview = message.get('Item', {}).get('Overview')
eventItem.percentage = message.get('TranscodingInfo', {}).get('CompletionPercentage')
if not eventItem.percentage:
if message.get('PlaybackInfo', {}).get('PositionTicks'):
eventItem['percentage'] = message.get('PlaybackInfo', {}).get('PositionTicks') / \
message.get('Item', {}).get('RunTimeTicks') * 100
eventItem.percentage = message.get('PlaybackInfo', {}).get('PositionTicks') / \
message.get('Item', {}).get('RunTimeTicks') * 100
if message.get('Session'):
eventItem['ip'] = message.get('Session').get('RemoteEndPoint')
eventItem['device_name'] = message.get('Session').get('DeviceName')
eventItem['client'] = message.get('Session').get('Client')
eventItem.ip = message.get('Session').get('RemoteEndPoint')
eventItem.device_name = message.get('Session').get('DeviceName')
eventItem.client = message.get('Session').get('Client')
if message.get("User"):
eventItem['user_name'] = message.get("User").get('Name')
eventItem.user_name = message.get("User").get('Name')
# 获取消息图片
if eventItem.get("item_id"):
if eventItem.item_id:
# 根据返回的item_id去调用媒体服务器获取
eventItem['image_url'] = self.get_remote_image_by_id(item_id=eventItem.get('item_id'),
image_type="Backdrop")
eventItem.image_url = self.get_remote_image_by_id(item_id=eventItem.item_id,
image_type="Backdrop")
return eventItem

View File

@ -7,7 +7,7 @@ from app.core.context import MediaInfo
from app.log import logger
from app.modules import _ModuleBase
from app.modules.jellyfin.jellyfin import Jellyfin
from app.schemas import ExistMediaInfo
from app.schemas import ExistMediaInfo, WebhookEventInfo
from app.schemas.types import MediaType
@ -33,7 +33,7 @@ class JellyfinModule(_ModuleBase):
# Jellyfin认证
return self.jellyfin.authenticate(name, password)
def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[dict]:
def webhook_parser(self, body: Any, form: Any, args: Any) -> WebhookEventInfo:
"""
解析Webhook报文体
:param body: 请求体

View File

@ -4,7 +4,7 @@ from typing import List, Union, Optional, Dict, Generator
from app.core.config import settings
from app.log import logger
from app.schemas import MediaType
from app.schemas import MediaType, WebhookEventInfo
from app.utils.http import RequestUtils
from app.utils.singleton import Singleton
from app.utils.string import StringUtils
@ -365,21 +365,22 @@ class Jellyfin(metaclass=Singleton):
logger.error(f"连接Library/Refresh出错" + str(e))
return False
def get_webhook_message(self, message: dict) -> dict:
def get_webhook_message(self, message: dict) -> WebhookEventInfo:
"""
解析Jellyfin报文
"""
eventItem = {'event': message.get('NotificationType', ''),
'item_name': message.get('Name'),
'user_name': message.get('NotificationUsername'),
"channel": "jellyfin"
}
eventItem = WebhookEventInfo(
event=message.get('NotificationType', ''),
item_name=message.get('Name'),
user_name=message.get('NotificationUsername'),
channel="jellyfin"
)
# 获取消息图片
if eventItem.get("item_id"):
if eventItem.item_id:
# 根据返回的item_id去调用媒体服务器获取
eventItem['image_url'] = self.get_remote_image_by_id(item_id=eventItem.get('item_id'),
image_type="Backdrop")
eventItem.image_url = self.get_remote_image_by_id(item_id=eventItem.item_id,
image_type="Backdrop")
return eventItem

View File

@ -6,7 +6,7 @@ from app.core.context import MediaInfo
from app.log import logger
from app.modules import _ModuleBase
from app.modules.plex.plex import Plex
from app.schemas import ExistMediaInfo, RefreshMediaItem
from app.schemas import ExistMediaInfo, RefreshMediaItem, WebhookEventInfo
from app.schemas.types import MediaType
@ -23,7 +23,7 @@ class PlexModule(_ModuleBase):
def init_setting(self) -> Tuple[str, Union[str, bool]]:
return "MEDIASERVER", "plex"
def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[dict]:
def webhook_parser(self, body: Any, form: Any, args: Any) -> WebhookEventInfo:
"""
解析Webhook报文体
:param body: 请求体

View File

@ -8,7 +8,7 @@ from plexapi.server import PlexServer
from app.core.config import settings
from app.log import logger
from app.schemas import RefreshMediaItem, MediaType
from app.schemas import RefreshMediaItem, MediaType, WebhookEventInfo
from app.utils.singleton import Singleton
@ -317,7 +317,7 @@ class Plex(metaclass=Singleton):
logger.error(f"获取媒体库列表出错:{err}")
yield {}
def get_webhook_message(self, message_str: str) -> dict:
def get_webhook_message(self, message_str: str) -> WebhookEventInfo:
"""
解析Plex报文
eventItem 字段的含义
@ -328,44 +328,44 @@ class Plex(metaclass=Singleton):
overview 剧情描述
"""
message = json.loads(message_str)
eventItem = {'event': message.get('event', ''), "channel": "plex"}
eventItem = WebhookEventInfo(event=message.get('Event', ''), channel="plex")
if message.get('Metadata'):
if message.get('Metadata', {}).get('type') == 'episode':
eventItem['item_type'] = "TV"
eventItem['item_name'] = "%s %s%s %s" % (
eventItem.item_type = "TV"
eventItem.item_name = "%s %s%s %s" % (
message.get('Metadata', {}).get('grandparentTitle'),
"S" + str(message.get('Metadata', {}).get('parentIndex')),
"E" + str(message.get('Metadata', {}).get('index')),
message.get('Metadata', {}).get('title'))
eventItem['item_id'] = message.get('Metadata', {}).get('ratingKey')
eventItem['season_id'] = message.get('Metadata', {}).get('parentIndex')
eventItem['episode_id'] = message.get('Metadata', {}).get('index')
eventItem.item_id = message.get('Metadata', {}).get('ratingKey')
eventItem.season_id = message.get('Metadata', {}).get('parentIndex')
eventItem.episode_id = message.get('Metadata', {}).get('index')
if message.get('Metadata', {}).get('summary') and len(message.get('Metadata', {}).get('summary')) > 100:
eventItem['overview'] = str(message.get('Metadata', {}).get('summary'))[:100] + "..."
eventItem.overview = str(message.get('Metadata', {}).get('summary'))[:100] + "..."
else:
eventItem['overview'] = message.get('Metadata', {}).get('summary')
eventItem.overview = message.get('Metadata', {}).get('summary')
else:
eventItem['item_type'] = "MOV" if message.get('Metadata', {}).get('type') == 'movie' else "SHOW"
eventItem['item_name'] = "%s %s" % (
eventItem.item_type = "MOV" if message.get('Metadata', {}).get('type') == 'movie' else "SHOW"
eventItem.item_name = "%s %s" % (
message.get('Metadata', {}).get('title'), "(" + str(message.get('Metadata', {}).get('year')) + ")")
eventItem['item_id'] = message.get('Metadata', {}).get('ratingKey')
eventItem.item_id = message.get('Metadata', {}).get('ratingKey')
if len(message.get('Metadata', {}).get('summary')) > 100:
eventItem['overview'] = str(message.get('Metadata', {}).get('summary'))[:100] + "..."
eventItem.overview = str(message.get('Metadata', {}).get('summary'))[:100] + "..."
else:
eventItem['overview'] = message.get('Metadata', {}).get('summary')
eventItem.overview = message.get('Metadata', {}).get('summary')
if message.get('Player'):
eventItem['ip'] = message.get('Player').get('publicAddress')
eventItem['client'] = message.get('Player').get('title')
eventItem.ip = message.get('Player').get('publicAddress')
eventItem.client = message.get('Player').get('title')
# 这里给个空,防止拼消息的时候出现None
eventItem['device_name'] = ' '
eventItem.device_name = ' '
if message.get('Account'):
eventItem['user_name'] = message.get("Account").get('title')
eventItem.user_name = message.get("Account").get('title')
# 获取消息图片
if eventItem.get("item_id"):
if eventItem.item_id:
# 根据返回的item_id去调用媒体服务器获取
eventItem['image_url'] = self.get_remote_image_by_id(item_id=eventItem.get('item_id'),
image_type="Backdrop")
eventItem.image_url = self.get_remote_image_by_id(item_id=eventItem.item_id,
image_type="Backdrop")
return eventItem