mirror of
https://github.com/jxxghp/MoviePilot-Plugins.git
synced 2026-03-27 10:05:57 +00:00
140 lines
4.6 KiB
Python
140 lines
4.6 KiB
Python
from enum import Enum
|
|
from typing import Optional, List, Tuple, Union
|
|
|
|
from pydantic import BaseModel, Field, ConfigDict
|
|
|
|
from .imdbapi import ImdbApiTitle, ImdbApiEpisode, ImdbApiCredit, ImdbapiImage
|
|
from .imdbtypes import ImdbTitle, ImdbName, ImdbImage, ImdbVideo, AkasNode, TitleEdge
|
|
|
|
|
|
class ErrorType(Enum):
|
|
PERSISTED_QUERY_NOT_FOUND = 'PERSISTED_QUERY_NOT_FOUND'
|
|
|
|
|
|
class StaffPickEntry(BaseModel):
|
|
name: str
|
|
ttconst: str = Field(..., alias='id')
|
|
rmconst: str
|
|
detail: Optional[str] = ""
|
|
description: Optional[str] = ""
|
|
relatedconst: List[str] = Field(default_factory=list, alias='relatedConst')
|
|
viconst: Optional[str] = None
|
|
|
|
|
|
class VerticalList(BaseModel):
|
|
titles: List[ImdbTitle] = Field(default_factory=list)
|
|
names: List[ImdbName] = Field(default_factory=list)
|
|
videos: List[ImdbVideo] = Field(default_factory=list)
|
|
images: List[ImdbImage] = Field(default_factory=list)
|
|
|
|
|
|
class StaffPickApiResponse(BaseModel):
|
|
updated_at: Optional[str]
|
|
entries: List[StaffPickEntry] = Field(default_factory=list)
|
|
imdb_items: VerticalList
|
|
|
|
|
|
class ImdbMediaInfo(ImdbApiTitle):
|
|
akas: List[AkasNode] = Field(default_factory=list)
|
|
episodes: List[ImdbApiEpisode] = Field(default_factory=list)
|
|
credits: List[ImdbApiCredit] = Field(default_factory=list)
|
|
images: List[ImdbapiImage] = Field(default_factory=list)
|
|
|
|
@classmethod
|
|
def from_title(
|
|
cls,
|
|
title: ImdbApiTitle,
|
|
akas: Optional[List[AkasNode]] = None,
|
|
episodes: Optional[List[ImdbApiEpisode]] = None,
|
|
api_credits: Optional[List[ImdbApiCredit]] = None,
|
|
images: Optional[List[ImdbapiImage]] = None
|
|
) -> "ImdbMediaInfo":
|
|
fields = {
|
|
**title.model_dump(exclude_none=True, by_alias=True),
|
|
}
|
|
if akas is not None:
|
|
fields['akas'] = akas
|
|
if episodes is not None:
|
|
fields['episodes'] = episodes
|
|
if api_credits is not None:
|
|
fields['credits'] = api_credits
|
|
if images is not None:
|
|
fields['images'] = images
|
|
return cls(**fields)
|
|
|
|
def backdrop_path(self) -> str | None:
|
|
if self.images:
|
|
for image in self.images:
|
|
if image.url and image.type == 'still_frame':
|
|
# replace('@._V1', '@._V1_QL75_UX327_')
|
|
return image.url
|
|
return None
|
|
|
|
class ImdbApiHash(BaseModel):
|
|
advanced_title_search: str = Field(alias="AdvancedTitleSearch")
|
|
|
|
|
|
class PageInfo(BaseModel):
|
|
has_previous_page: Optional[bool] = Field(None, alias="hasPreviousPage")
|
|
has_next_page: Optional[bool] = Field(None, alias="hasNextPage")
|
|
start_cursor: Optional[str] = Field(None, alias="startCursor")
|
|
end_cursor: Optional[str] = Field(None, alias="endCursor")
|
|
|
|
|
|
class FilterInfo(BaseModel):
|
|
filter_id: Optional[str] = Field(default=None, alias='filterId')
|
|
text: Optional[str] = Field(default=None, alias='text')
|
|
total: Optional[int] = Field(default=None, alias='total')
|
|
|
|
|
|
class SearchState(BaseModel):
|
|
total: int = 0
|
|
page_info: PageInfo = Field(default_factory=PageInfo, alias="pageInfo")
|
|
genres: List[FilterInfo] = Field(default_factory=list)
|
|
keywords: List[FilterInfo] = Field(default_factory=list)
|
|
title_types: List[FilterInfo] = Field(default_factory=list, alias='titleTypes')
|
|
|
|
|
|
class AdvancedTitleSearch(SearchState):
|
|
edges: List[TitleEdge] = Field(default_factory=list)
|
|
|
|
|
|
class AdvancedTitleSearchResponse(BaseModel):
|
|
advanced_title_search: AdvancedTitleSearch = Field(default_factory=AdvancedTitleSearch, alias="advancedTitleSearch")
|
|
|
|
|
|
class SearchParams(BaseModel):
|
|
title_types: Optional[Tuple[str, ...]] = None
|
|
genres: Optional[Tuple[str, ...]] = None
|
|
sort_by: str = 'POPULARITY'
|
|
sort_order: str = 'ASC'
|
|
rating_min: Optional[float] = None
|
|
rating_max: Optional[float] = None
|
|
countries: Optional[Tuple[str, ...]] = None
|
|
languages: Optional[Tuple[str, ...]] = None
|
|
release_date_end: Optional[str] = None
|
|
release_date_start: Optional[str] = None
|
|
award_constraint: Optional[Tuple[str, ...]] = None
|
|
ranked: Optional[Tuple[str, ...]] = None
|
|
interests: Optional[Tuple[str, ...]] = None
|
|
company: Optional[str] = None
|
|
|
|
model_config = ConfigDict(
|
|
frozen=True
|
|
)
|
|
|
|
|
|
class ErrorExtension(BaseModel):
|
|
code: Union[ErrorType, str]
|
|
error_type: str = Field('CLIENT', alias='errorType')
|
|
is_retryable: bool = Field(False, alias='isRetryable')
|
|
|
|
|
|
class ErrorValue(BaseModel):
|
|
message: Optional[str] = Field(default=None, alias='message')
|
|
extensions: Optional[ErrorExtension]
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
errors: Optional[List[ErrorValue]] = Field(default_factory=list)
|