diff --git a/addon.xml b/addon.xml index f0f0db8..5c48235 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/lib/__init__.py b/lib/__init__.py index d4fbcf3..9e7a897 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -1,8 +1,7 @@ from lib.utils import * -from lib.db import database +from lib.db import database, create_tables from lib.cache import Cache -from lib.tver import * from lib.favourites import Favourites from lib.watcher import Watcher from lib.mylist import MyList diff --git a/lib/cache.py b/lib/cache.py index 88250f7..f9d72af 100644 --- a/lib/cache.py +++ b/lib/cache.py @@ -2,22 +2,14 @@ import json from time import time -from lib import database -class Cache: - def create(self): - with sql.connect(database()) as conn: - table = ''' - CREATE TABLE IF NOT EXISTS categories ( - id TEXT PRIMARY KEY NOT NULL, - expires INTEGER, - data JSON ); - ''' - conn.execute(table) +from lib.tver import fetch_episodes, URL_VIDEO_PICTURE, URL_VIDEO_WEBSITE +from lib import database, strip_or_none + +class Cache: def get(self, category): data = None - self.delete_expired() with sql.connect(database()) as conn: cur = conn.execute(f'SELECT data FROM categories WHERE id = ?', (category,),) @@ -40,7 +32,6 @@ def get_all(self): return data - def insert(self, category, data, expire_after=14400.0): expires_at = round(time() + expire_after) @@ -50,4 +41,33 @@ def insert(self, category, data, expire_after=14400.0): def delete_expired(self): with sql.connect(database()) as conn: - conn.execute(f'DELETE FROM categories WHERE expires <= ?', (round(time()),),) \ No newline at end of file + conn.execute(f'DELETE FROM categories WHERE expires <= ?', (round(time()),),) + + def get_or_download(self, category): + json_episodes = self.get(category) + if not json_episodes: + json_episodes = fetch_episodes(category) + self.insert(category, json_episodes) + return json_episodes + + def get_episodes(self, category): + json_episodes = self.get_or_download(category) + + episodes = [] + + for episode in json_episodes['result']['contents']: + video_type = episode['type'] + + if video_type == 'episode': + series_id = episode['content']['seriesID'] + video_id = episode['content']['id'] + series_title = strip_or_none(episode['content']['seriesTitle']) + label = ' '.join(filter(None, [series_title, strip_or_none(episode['content']['title'])])) + episodes.append({ 'name': label, + 'series': series_id, + 'thumb': URL_VIDEO_PICTURE.format(video_type, video_id), + 'video': URL_VIDEO_WEBSITE.format(video_type, video_id), + 'genre': category, + 'series_title': series_title }) + + return episodes diff --git a/lib/db.py b/lib/db.py index 692872e..64ad72a 100644 --- a/lib/db.py +++ b/lib/db.py @@ -2,6 +2,39 @@ from pathlib import Path from xbmcvfs import translatePath +import sqlite3 as sql + +def create_tables(): + with sql.connect(database()) as conn: + table = ''' + CREATE TABLE IF NOT EXISTS categories ( + id TEXT PRIMARY KEY NOT NULL, + expires INTEGER, + data JSON ); + ''' + conn.execute(table) + + table = ''' + CREATE TABLE IF NOT EXISTS favourites ( + id TEXT PRIMARY KEY NOT NULL, + category TEXT, + title TEXT + ); + ''' + conn.execute(table) + + table = ''' + CREATE TABLE IF NOT EXISTS mylist ( + id TEXT PRIMARY KEY NOT NULL, + expires INTEGER, + vid_type TEXT, + title TEXT, + series TEXT + ); + ''' + conn.execute(table) + + def get_filename(): addon = xbmcaddon.Addon() cache_path = Path(translatePath(addon.getAddonInfo('profile'))) diff --git a/lib/favourites.py b/lib/favourites.py index af05e1a..556b222 100644 --- a/lib/favourites.py +++ b/lib/favourites.py @@ -5,17 +5,6 @@ from lib import database, localize class Favourites: - def create(self): - with sql.connect(database()) as conn: - table = ''' - CREATE TABLE IF NOT EXISTS favourites ( - id TEXT PRIMARY KEY NOT NULL, - category TEXT, - title TEXT - ); - ''' - conn.execute(table) - def insert(self,category,series,title): with sql.connect(database()) as conn: conn.execute(f'INSERT OR REPLACE INTO favourites (id,category,title) VALUES (?,?,?)', (series, category, title,),) diff --git a/lib/mylist.py b/lib/mylist.py index eb4cbfe..6432358 100644 --- a/lib/mylist.py +++ b/lib/mylist.py @@ -1,4 +1,3 @@ -import sys import sqlite3 as sql from time import time @@ -11,20 +10,7 @@ class MyList: def __init__(self): self.favourites = Favourites() - - def create(self): - with sql.connect(database()) as conn: - table = ''' - CREATE TABLE IF NOT EXISTS mylist ( - id TEXT PRIMARY KEY NOT NULL, - expires INTEGER, - vid_type TEXT, - title TEXT, - series TEXT - ); - ''' - conn.execute(table) - + def build(self): mylist = [item[0] for item in self.select()] favourites = self.favourites.select() diff --git a/lib/tver.py b/lib/tver.py index f3279f4..35028cb 100644 --- a/lib/tver.py +++ b/lib/tver.py @@ -1,6 +1,6 @@ import requests -from lib import Cache -from lib import get_random_ua, strip_or_none, get_custom_img_path, localize + +from lib import get_random_ua, get_custom_img_path, localize URL_TOKEN_SERVICE = 'https://platform-api.tver.jp/v2/api/platform_users/browser/create' URL_TAG_SEARCH_WS = 'https://platform-api.tver.jp/service/api/v1/callTagSearch/{}' @@ -34,38 +34,9 @@ def fetch_api_token(): token = json_token['result']['platform_token'] return (uid,token) -def fetch_episodes(category): - cache = Cache() - - cached_episodes = cache.get(category) - if cached_episodes != None: - return cached_episodes - +def fetch_episodes(category): (uid, token) = fetch_api_token() resp = requests.get(URL_LIST_EPISODES.format(category, uid, token), headers={'x-tver-platform-type': 'web'}, timeout=10) data = resp.json() - cache.insert(category, data) - return data - -def get_episodes(category): - json_episodes = fetch_episodes(category) - - episodes = [] - - for episode in json_episodes['result']['contents']: - video_type = episode['type'] - - if video_type == 'episode': - series_id = episode['content']['seriesID'] - video_id = episode['content']['id'] - series_title = strip_or_none(episode['content']['seriesTitle']) - label = ' '.join(filter(None, [series_title, strip_or_none(episode['content']['title'])])) - episodes.append({ 'name': label, - 'series': series_id, - 'thumb': URL_VIDEO_PICTURE.format(video_type, video_id), - 'video': URL_VIDEO_WEBSITE.format(video_type, video_id), - 'genre': category, - 'series_title': series_title }) - - return episodes + return data \ No newline at end of file diff --git a/lib/watcher.py b/lib/watcher.py index e2984cc..c91e528 100644 --- a/lib/watcher.py +++ b/lib/watcher.py @@ -2,7 +2,8 @@ import sqlite3 as sql from urllib.parse import parse_qsl -from lib import Cache, lookup_db, find_episode, strip_or_none, URL_VIDEO_PICTURE +from lib.tver import URL_VIDEO_PICTURE +from lib import Cache, lookup_db, find_episode, strip_or_none _URL = sys.argv[0] _DB = lookup_db("MyVideos") diff --git a/plugin.py b/plugin.py index a928a0a..c2d61b7 100644 --- a/plugin.py +++ b/plugin.py @@ -4,10 +4,7 @@ import xbmcplugin from lib import tver - -from lib import Favourites -from lib import Watcher -from lib import MyList +from lib import Cache, Favourites, Watcher, MyList from lib import log, show_info, check_if_kodi_supports_manifest, extract_info, extract_manifest_url_from_info, get_url, refresh, get_adaptive_type_from_url, localize, clear_thumbnails @@ -30,7 +27,7 @@ def list_videos(category): videos = Watcher().get_watching_episodes() else: - videos = tver.get_episodes(category) + videos = Cache().get_episodes(category) context = (localize(30021),'mylist') for video in videos: diff --git a/service.py b/service.py index 06f70cb..9c7131d 100644 --- a/service.py +++ b/service.py @@ -1,16 +1,17 @@ -from lib import Cache, tver, Favourites, MyList +from lib.tver import get_categories +from lib import Cache, MyList, create_tables if __name__ == '__main__': #initialize DB - mylist = MyList() - Cache().create() - Favourites().create() - mylist.create() + create_tables() # cache warming - for (category, _, _) in tver.get_categories(): - tver.fetch_episodes(category) + cache = Cache() + cache.delete_expired() + for (category, _, _) in get_categories(): + cache.get_or_download(category) # build MyList + mylist = MyList() mylist.delete_expired() mylist.build()