266 lines
11 KiB
Python
266 lines
11 KiB
Python
"""
|
|
These are video related models.
|
|
"""
|
|
from dataclasses import dataclass, field
|
|
from typing import Optional, List
|
|
|
|
import isodate
|
|
from isodate import ISO8601Error
|
|
|
|
from pyyoutube.error import ErrorCode, ErrorMessage, PyYouTubeException
|
|
from .base import BaseModel
|
|
from .common import (
|
|
BaseApiResponse,
|
|
BaseTopicDetails,
|
|
BaseResource,
|
|
Localized,
|
|
Player,
|
|
Thumbnails,
|
|
)
|
|
from .mixins import DatetimeTimeMixin
|
|
|
|
|
|
@dataclass
|
|
class RegionRestriction(BaseModel):
|
|
"""
|
|
A class representing the video content details region restriction info
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#contentDetails.regionRestriction
|
|
"""
|
|
|
|
allowed: List[str] = field(default=None)
|
|
blocked: List[str] = field(default=None, repr=False)
|
|
|
|
|
|
# TODO get detail rating description
|
|
class ContentRating(BaseModel):
|
|
"""
|
|
A class representing the video content rating info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#contentDetails.contentRating
|
|
"""
|
|
|
|
acbRating: Optional[str] = field(default=None, repr=False)
|
|
agcomRating: Optional[str] = field(default=None, repr=False)
|
|
anatelRating: Optional[str] = field(default=None, repr=False)
|
|
bbfcRating: Optional[str] = field(default=None, repr=False)
|
|
bfvcRating: Optional[str] = field(default=None, repr=False)
|
|
bmukkRating: Optional[str] = field(default=None, repr=False)
|
|
catvRating: Optional[str] = field(default=None, repr=False)
|
|
catvfrRating: Optional[str] = field(default=None, repr=False)
|
|
cbfcRating: Optional[str] = field(default=None, repr=False)
|
|
cccRating: Optional[str] = field(default=None, repr=False)
|
|
cceRating: Optional[str] = field(default=None, repr=False)
|
|
chfilmRating: Optional[str] = field(default=None, repr=False)
|
|
chvrsRating: Optional[str] = field(default=None, repr=False)
|
|
cicfRating: Optional[str] = field(default=None, repr=False)
|
|
cnaRating: Optional[str] = field(default=None, repr=False)
|
|
cncRating: Optional[str] = field(default=None, repr=False)
|
|
csaRating: Optional[str] = field(default=None, repr=False)
|
|
cscfRating: Optional[str] = field(default=None, repr=False)
|
|
czfilmRating: Optional[str] = field(default=None, repr=False)
|
|
djctqRating: Optional[str] = field(default=None, repr=False)
|
|
djctqRatingReasons: List[str] = field(default=None, repr=False)
|
|
ecbmctRating: Optional[str] = field(default=None, repr=False)
|
|
eefilmRating: Optional[str] = field(default=None, repr=False)
|
|
egfilmRating: Optional[str] = field(default=None, repr=False)
|
|
eirinRating: Optional[str] = field(default=None, repr=False)
|
|
fcbmRating: Optional[str] = field(default=None, repr=False)
|
|
fcoRating: Optional[str] = field(default=None, repr=False)
|
|
fpbRating: Optional[str] = field(default=None, repr=False)
|
|
fpbRatingReasons: List[str] = field(default=None, repr=False)
|
|
fskRating: Optional[str] = field(default=None, repr=False)
|
|
grfilmRating: Optional[str] = field(default=None, repr=False)
|
|
icaaRating: Optional[str] = field(default=None, repr=False)
|
|
ifcoRating: Optional[str] = field(default=None, repr=False)
|
|
ilfilmRating: Optional[str] = field(default=None, repr=False)
|
|
incaaRating: Optional[str] = field(default=None, repr=False)
|
|
kfcbRating: Optional[str] = field(default=None, repr=False)
|
|
kijkwijzerRating: Optional[str] = field(default=None, repr=False)
|
|
kmrbRating: Optional[str] = field(default=None, repr=False)
|
|
lsfRating: Optional[str] = field(default=None, repr=False)
|
|
mccaaRating: Optional[str] = field(default=None, repr=False)
|
|
mccypRating: Optional[str] = field(default=None, repr=False)
|
|
mcstRating: Optional[str] = field(default=None, repr=False)
|
|
mdaRating: Optional[str] = field(default=None, repr=False)
|
|
medietilsynetRating: Optional[str] = field(default=None, repr=False)
|
|
mekuRating: Optional[str] = field(default=None, repr=False)
|
|
mibacRating: Optional[str] = field(default=None, repr=False)
|
|
mocRating: Optional[str] = field(default=None, repr=False)
|
|
moctwRating: Optional[str] = field(default=None, repr=False)
|
|
mpaaRating: Optional[str] = field(default=None, repr=False)
|
|
mpaatRating: Optional[str] = field(default=None, repr=False)
|
|
mtrcbRating: Optional[str] = field(default=None, repr=False)
|
|
nbcRating: Optional[str] = field(default=None, repr=False)
|
|
nfrcRating: Optional[str] = field(default=None, repr=False)
|
|
nfvcbRating: Optional[str] = field(default=None, repr=False)
|
|
nkclvRating: Optional[str] = field(default=None, repr=False)
|
|
oflcRating: Optional[str] = field(default=None, repr=False)
|
|
pefilmRating: Optional[str] = field(default=None, repr=False)
|
|
resorteviolenciaRating: Optional[str] = field(default=None, repr=False)
|
|
rtcRating: Optional[str] = field(default=None, repr=False)
|
|
rteRating: Optional[str] = field(default=None, repr=False)
|
|
russiaRating: Optional[str] = field(default=None, repr=False)
|
|
skfilmRating: Optional[str] = field(default=None, repr=False)
|
|
smaisRating: Optional[str] = field(default=None, repr=False)
|
|
smsaRating: Optional[str] = field(default=None, repr=False)
|
|
tvpgRating: Optional[str] = field(default=None, repr=False)
|
|
ytRating: Optional[str] = field(default=None)
|
|
|
|
|
|
@dataclass
|
|
class VideoContentDetails(BaseModel):
|
|
"""
|
|
A class representing the video content details info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#contentDetails
|
|
"""
|
|
|
|
duration: Optional[str] = field(default=None)
|
|
dimension: Optional[str] = field(default=None)
|
|
definition: Optional[str] = field(default=None, repr=False)
|
|
caption: Optional[str] = field(default=None, repr=False)
|
|
licensedContent: Optional[bool] = field(default=None, repr=False)
|
|
regionRestriction: Optional[RegionRestriction] = field(default=None, repr=False)
|
|
contentRating: Optional[ContentRating] = field(default=None, repr=False)
|
|
projection: Optional[str] = field(default=None, repr=False)
|
|
hasCustomThumbnail: Optional[bool] = field(default=None, repr=False)
|
|
|
|
def get_video_seconds_duration(self):
|
|
if not self.duration:
|
|
return None
|
|
try:
|
|
seconds = isodate.parse_duration(self.duration).total_seconds()
|
|
except ISO8601Error as e:
|
|
raise PyYouTubeException(
|
|
ErrorMessage(status_code=ErrorCode.INVALID_PARAMS, message=e.args[0])
|
|
)
|
|
else:
|
|
return int(seconds)
|
|
|
|
|
|
@dataclass
|
|
class VideoTopicDetails(BaseTopicDetails):
|
|
"""
|
|
A class representing video's topic detail info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#topicDetails
|
|
"""
|
|
|
|
# Important:
|
|
# This property has been deprecated as of November 10, 2016.
|
|
# Any topics associated with a video are now returned by the topicDetails.relevantTopicIds[] property value.
|
|
topicIds: Optional[List[str]] = field(default=None, repr=False)
|
|
relevantTopicIds: Optional[List[str]] = field(default=None, repr=False)
|
|
topicCategories: Optional[List[str]] = field(default=None)
|
|
|
|
def __post_init__(self):
|
|
"""
|
|
If topicIds is not return and relevantTopicIds has return. let relevantTopicIds for topicIds.
|
|
This is for the get_full_topics method.
|
|
:return:
|
|
"""
|
|
if self.topicIds is None and self.relevantTopicIds is not None:
|
|
self.topicIds = self.relevantTopicIds
|
|
|
|
|
|
@dataclass
|
|
class VideoSnippet(BaseModel, DatetimeTimeMixin):
|
|
"""
|
|
A class representing the video snippet info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#snippet
|
|
"""
|
|
|
|
publishedAt: Optional[str] = field(default=None, repr=False)
|
|
channelId: Optional[str] = field(default=None, repr=False)
|
|
title: Optional[str] = field(default=None)
|
|
description: Optional[str] = field(default=None)
|
|
thumbnails: Optional[Thumbnails] = field(default=None, repr=False)
|
|
channelTitle: Optional[str] = field(default=None, repr=False)
|
|
tags: Optional[List[str]] = field(default=None, repr=False)
|
|
categoryId: Optional[str] = field(default=None, repr=False)
|
|
liveBroadcastContent: Optional[str] = field(default=None, repr=False)
|
|
defaultLanguage: Optional[str] = field(default=None, repr=False)
|
|
localized: Optional[Localized] = field(default=None, repr=False)
|
|
defaultAudioLanguage: Optional[str] = field(default=None, repr=False)
|
|
|
|
|
|
@dataclass
|
|
class VideoStatistics(BaseModel):
|
|
"""
|
|
A class representing the video statistics info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#statistics
|
|
"""
|
|
|
|
viewCount: Optional[int] = field(default=None)
|
|
likeCount: Optional[int] = field(default=None)
|
|
dislikeCount: Optional[int] = field(default=None, repr=False)
|
|
commentCount: Optional[int] = field(default=None, repr=False)
|
|
|
|
|
|
@dataclass
|
|
class VideoStatus(BaseModel, DatetimeTimeMixin):
|
|
"""
|
|
A class representing the video status info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#status
|
|
"""
|
|
|
|
uploadStatus: Optional[str] = field(default=None)
|
|
failureReason: Optional[str] = field(default=None, repr=False)
|
|
rejectionReason: Optional[str] = field(default=None, repr=False)
|
|
privacyStatus: Optional[str] = field(default=None)
|
|
publishAt: Optional[str] = field(default=None, repr=False)
|
|
license: Optional[str] = field(default=None, repr=False)
|
|
embeddable: Optional[bool] = field(default=None, repr=False)
|
|
publicStatsViewable: Optional[bool] = field(default=None, repr=False)
|
|
madeForKids: Optional[bool] = field(default=None, repr=False)
|
|
selfDeclaredMadeForKids: Optional[bool] = field(default=None, repr=False)
|
|
|
|
|
|
@dataclass
|
|
class VideoLiveStreamingDetails(BaseModel, DatetimeTimeMixin):
|
|
"""
|
|
A class representing the video live streaming details.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos#liveStreamingDetails
|
|
"""
|
|
|
|
actualStartTime: Optional[str] = field(default=None, repr=False)
|
|
actualEndTime: Optional[str] = field(default=None, repr=False)
|
|
scheduledStartTime: Optional[str] = field(default=None, repr=False)
|
|
scheduledEndTime: Optional[str] = field(default=None, repr=False)
|
|
concurrentViewers: Optional[int] = field(default=None)
|
|
activeLiveChatId: Optional[str] = field(default=None, repr=False)
|
|
|
|
|
|
@dataclass
|
|
class Video(BaseResource):
|
|
"""
|
|
A class representing the video info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos
|
|
"""
|
|
|
|
snippet: Optional[VideoSnippet] = field(default=None, repr=False)
|
|
contentDetails: Optional[VideoContentDetails] = field(default=None, repr=False)
|
|
status: Optional[VideoStatus] = field(default=None, repr=False)
|
|
statistics: Optional[VideoStatistics] = field(default=None, repr=False)
|
|
topicDetails: Optional[VideoTopicDetails] = field(default=None, repr=False)
|
|
player: Optional[Player] = field(default=None, repr=False)
|
|
liveStreamingDetails: Optional[VideoLiveStreamingDetails] = field(
|
|
default=None, repr=False
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class VideoListResponse(BaseApiResponse):
|
|
"""
|
|
A class representing the video's retrieve response info.
|
|
|
|
Refer: https://developers.google.com/youtube/v3/docs/videos/list#response_1
|
|
"""
|
|
|
|
items: Optional[List[Video]] = field(default=None, repr=False)
|