315 lines
8.0 KiB
Python
315 lines
8.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
|
|
Copyright (C) 2014-2016 bromix (plugin.video.youtube)
|
|
Copyright (C) 2016-2018 plugin.video.youtube
|
|
|
|
SPDX-License-Identifier: GPL-2.0-only
|
|
See LICENSES/GPL-2.0-only for more information.
|
|
"""
|
|
|
|
import re
|
|
import datetime
|
|
|
|
from .base_item import BaseItem
|
|
|
|
try:
|
|
from six.moves import html_parser
|
|
|
|
unescape = html_parser.HTMLParser().unescape
|
|
except AttributeError:
|
|
import html
|
|
|
|
unescape = html.unescape
|
|
|
|
__RE_IMDB__ = re.compile(r'(http(s)?://)?www.imdb.(com|de)/title/(?P<imdbid>[t0-9]+)(/)?')
|
|
|
|
|
|
class VideoItem(BaseItem):
|
|
def __init__(self, name, uri, image=u'', fanart=u''):
|
|
BaseItem.__init__(self, name, uri, image, fanart)
|
|
self._genre = None
|
|
self._aired = None
|
|
self._aired_utc = None
|
|
self._scheduled_start_utc = None
|
|
self._duration = None
|
|
self._director = None
|
|
self._premiered = None
|
|
self._episode = None
|
|
self._season = None
|
|
self._year = None
|
|
self._plot = None
|
|
self._title = self.get_name()
|
|
self._imdb_id = None
|
|
self._cast = None
|
|
self._rating = None
|
|
self._track_number = None
|
|
self._studio = None
|
|
self._artist = None
|
|
self._play_count = None
|
|
self._uses_dash = None
|
|
self._mediatype = None
|
|
self._last_played = None
|
|
self._start_percent = None
|
|
self._start_time = None
|
|
self._live = False
|
|
self.subtitles = None
|
|
self._headers = None
|
|
self.license_key = None
|
|
self._video_id = None
|
|
self._channel_id = None
|
|
self._subscription_id = None
|
|
self._playlist_id = None
|
|
self._playlist_item_id = None
|
|
|
|
def set_play_count(self, play_count):
|
|
self._play_count = int(play_count)
|
|
|
|
def get_play_count(self):
|
|
return self._play_count
|
|
|
|
def add_artist(self, artist):
|
|
if self._artist is None:
|
|
self._artist = []
|
|
# noinspection PyUnresolvedReferences
|
|
self._artist.append(artist)
|
|
|
|
def get_artist(self):
|
|
return self._artist
|
|
|
|
def set_studio(self, studio):
|
|
self._studio = studio
|
|
|
|
def get_studio(self):
|
|
return self._studio
|
|
|
|
def set_title(self, title):
|
|
try:
|
|
title = unescape(title)
|
|
except:
|
|
pass
|
|
self._title = title
|
|
self._name = self._title
|
|
|
|
def get_title(self):
|
|
return self._title
|
|
|
|
def set_track_number(self, track_number):
|
|
self._track_number = int(track_number)
|
|
|
|
def get_track_number(self):
|
|
return self._track_number
|
|
|
|
def set_year(self, year):
|
|
self._year = int(year)
|
|
|
|
def set_year_from_datetime(self, date_time):
|
|
self.set_year(date_time.year)
|
|
|
|
def get_year(self):
|
|
return self._year
|
|
|
|
def set_premiered(self, year, month, day):
|
|
date = datetime.date(year, month, day)
|
|
self._premiered = date.isoformat()
|
|
|
|
def set_premiered_from_datetime(self, date_time):
|
|
self.set_premiered(year=date_time.year, month=date_time.month, day=date_time.day)
|
|
|
|
def get_premiered(self):
|
|
return self._premiered
|
|
|
|
def set_plot(self, plot):
|
|
try:
|
|
plot = unescape(plot)
|
|
except:
|
|
pass
|
|
self._plot = plot
|
|
|
|
def get_plot(self):
|
|
return self._plot
|
|
|
|
def set_rating(self, rating):
|
|
self._rating = float(rating)
|
|
|
|
def get_rating(self):
|
|
return self._rating
|
|
|
|
def set_director(self, director_name):
|
|
self._director = director_name
|
|
|
|
def get_director(self):
|
|
return self._director
|
|
|
|
def add_cast(self, cast):
|
|
if self._cast is None:
|
|
self._cast = []
|
|
# noinspection PyUnresolvedReferences
|
|
self._cast.append(cast)
|
|
|
|
def get_cast(self):
|
|
return self._cast
|
|
|
|
def set_imdb_id(self, url_or_id):
|
|
re_match = __RE_IMDB__.match(url_or_id)
|
|
if re_match:
|
|
self._imdb_id = re_match.group('imdbid')
|
|
else:
|
|
self._imdb_id = url_or_id
|
|
|
|
def get_imdb_id(self):
|
|
return self._imdb_id
|
|
|
|
def set_episode(self, episode):
|
|
self._episode = int(episode)
|
|
|
|
def get_episode(self):
|
|
return self._episode
|
|
|
|
def set_season(self, season):
|
|
self._season = int(season)
|
|
|
|
def get_season(self):
|
|
return self._season
|
|
|
|
def set_duration(self, hours, minutes, seconds=0):
|
|
_seconds = seconds
|
|
_seconds += minutes * 60
|
|
_seconds += hours * 60 * 60
|
|
self.set_duration_from_seconds(_seconds)
|
|
|
|
def set_duration_from_minutes(self, minutes):
|
|
self.set_duration_from_seconds(int(minutes) * 60)
|
|
|
|
def set_duration_from_seconds(self, seconds):
|
|
self._duration = int(seconds)
|
|
|
|
def get_duration(self):
|
|
return self._duration
|
|
|
|
def set_aired(self, year, month, day):
|
|
date = datetime.date(year, month, day)
|
|
self._aired = date.isoformat()
|
|
|
|
def set_aired_utc(self, dt):
|
|
self._aired_utc = dt
|
|
|
|
def get_aired_utc(self):
|
|
return self._aired_utc
|
|
|
|
def set_aired_from_datetime(self, date_time):
|
|
self.set_aired(year=date_time.year, month=date_time.month, day=date_time.day)
|
|
|
|
def set_scheduled_start_utc(self, dt):
|
|
self._scheduled_start_utc = dt
|
|
|
|
def get_scheduled_start_utc(self):
|
|
return self._scheduled_start_utc
|
|
|
|
@property
|
|
def live(self):
|
|
return self._live
|
|
|
|
@live.setter
|
|
def live(self, value):
|
|
self._live = value
|
|
|
|
def get_aired(self):
|
|
return self._aired
|
|
|
|
def set_genre(self, genre):
|
|
self._genre = genre
|
|
|
|
def get_genre(self):
|
|
return self._genre
|
|
|
|
def set_date(self, year, month, day, hour=0, minute=0, second=0):
|
|
date = datetime.datetime(year, month, day, hour, minute, second)
|
|
self._date = date.isoformat(sep=' ')
|
|
|
|
def set_date_from_datetime(self, date_time):
|
|
self.set_date(year=date_time.year, month=date_time.month, day=date_time.day, hour=date_time.hour,
|
|
minute=date_time.minute, second=date_time.second)
|
|
|
|
def get_date(self):
|
|
return self._date
|
|
|
|
def set_use_dash(self, value=True):
|
|
self._uses_dash = value
|
|
|
|
def use_dash(self):
|
|
return self._uses_dash is True and ('manifest/dash' in self.get_uri() or self.get_uri().endswith('.mpd'))
|
|
|
|
def set_mediatype(self, mediatype):
|
|
self._mediatype = mediatype
|
|
|
|
def get_mediatype(self):
|
|
if self._mediatype not in ['video', 'movie', 'tvshow', 'season', 'episode', 'musicvideo']:
|
|
self._mediatype = 'video'
|
|
return self._mediatype
|
|
|
|
def set_subtitles(self, value):
|
|
self.subtitles = value if value and isinstance(value, list) else None
|
|
|
|
def set_headers(self, value):
|
|
self._headers = value
|
|
|
|
def get_headers(self):
|
|
return self._headers
|
|
|
|
def set_license_key(self, url):
|
|
self.license_key = url
|
|
|
|
def get_license_key(self):
|
|
return self.license_key
|
|
|
|
def set_last_played(self, last_played):
|
|
self._last_played = last_played
|
|
|
|
def get_last_played(self):
|
|
return self._last_played
|
|
|
|
def set_start_percent(self, start_percent):
|
|
self._start_percent = start_percent
|
|
|
|
def get_start_percent(self):
|
|
return self._start_percent
|
|
|
|
def set_start_time(self, start_time):
|
|
self._start_time = start_time
|
|
|
|
def get_start_time(self):
|
|
return self._start_time
|
|
|
|
@property
|
|
def video_id(self):
|
|
return self._video_id
|
|
|
|
@video_id.setter
|
|
def video_id(self, value):
|
|
self._video_id = value
|
|
|
|
def get_channel_id(self):
|
|
return self._channel_id
|
|
|
|
def set_channel_id(self, value):
|
|
self._channel_id = value
|
|
|
|
def get_subscription_id(self):
|
|
return self._subscription_id
|
|
|
|
def set_subscription_id(self, value):
|
|
self._subscription_id = value
|
|
|
|
def get_playlist_id(self):
|
|
return self._playlist_id
|
|
|
|
def set_playlist_id(self, value):
|
|
self._playlist_id = value
|
|
|
|
def get_playlist_item_id(self):
|
|
return self._playlist_item_id
|
|
|
|
def set_playlist_item_id(self, value):
|
|
self._playlist_item_id = value
|