-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
357 additions
and
420 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
from lib.utils import * | ||
from lib.db import database | ||
|
||
from lib.cache import Cache | ||
from lib.tver import * | ||
from lib.favourites import Favourites | ||
from lib.watcher import Watcher | ||
from lib.mylist import MyList | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import sqlite3 as sql | ||
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) | ||
|
||
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,),) | ||
results = cur.fetchall() | ||
|
||
if len(results) > 0: | ||
data = json.loads(results[0][0]) | ||
|
||
return data | ||
|
||
def get_all(self): | ||
data = [] | ||
|
||
with sql.connect(database()) as conn: | ||
cur = conn.execute(f'SELECT id, data FROM categories') | ||
results = cur.fetchall() | ||
|
||
for result in results: | ||
data.append({'id': str(result[0]), 'json': json.loads(result[1])}) | ||
|
||
return data | ||
|
||
|
||
def insert(self, category, data, expire_after=14400.0): | ||
expires_at = round(time() + expire_after) | ||
|
||
with sql.connect(database()) as conn: | ||
conn.execute(f'INSERT OR REPLACE INTO categories (id,expires,data) VALUES (?,?,?)', (category, expires_at, json.dumps(data),),) | ||
|
||
|
||
def delete_expired(self): | ||
with sql.connect(database()) as conn: | ||
conn.execute(f'DELETE FROM categories WHERE expires <= ?', (round(time()),),) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import xbmcaddon | ||
from pathlib import Path | ||
from xbmcvfs import translatePath | ||
|
||
def get_filename(): | ||
addon = xbmcaddon.Addon() | ||
cache_path = Path(translatePath(addon.getAddonInfo('profile'))) | ||
cache_path.mkdir(parents=True, exist_ok=True) | ||
fname = str(cache_path/'tver.db') | ||
return fname | ||
|
||
_DB = get_filename() | ||
|
||
def database(): | ||
return _DB | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
import sqlite3 as sql | ||
import xbmcgui | ||
|
||
from lib.tver import URL_VIDEO_PICTURE | ||
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,),) | ||
|
||
def select(self): | ||
favs = [] | ||
|
||
with sql.connect(database()) as conn: | ||
cur = conn.execute(f'SELECT id, category, title FROM favourites') | ||
favs = cur.fetchall() | ||
|
||
return favs | ||
|
||
def delete(self, series): | ||
with sql.connect(database()) as conn: | ||
conn.execute(f'DELETE FROM favourites WHERE id = ?', (series,),) | ||
|
||
def list(self): | ||
series = self.select() | ||
list = [] | ||
|
||
for serie in series: | ||
li = xbmcgui.ListItem(serie[2]) | ||
list.append(li) | ||
|
||
dialog = xbmcgui.Dialog() | ||
selected_index = dialog.select(localize(30002), list) | ||
if selected_index >= 0: | ||
li = list[selected_index] | ||
serie = series[selected_index] | ||
|
||
thumb = URL_VIDEO_PICTURE.format('series', serie[0]) | ||
vid_info = li.getVideoInfoTag() | ||
vid_info.setTitle(serie[2]) | ||
vid_info.setGenres([serie[1]]) | ||
vid_info.setMediaType('tvshow') | ||
|
||
li.setArt({'thumb': thumb, 'icon': thumb, 'fanart': thumb}) | ||
li.setProperty('IsPlayable', 'false') | ||
|
||
dialog = xbmcgui.Dialog() | ||
dialog.info(li) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
import sys | ||
import sqlite3 as sql | ||
|
||
from time import time | ||
|
||
from lib.tver import URL_VIDEO_PICTURE, URL_VIDEO_WEBSITE | ||
from lib import Cache, Watcher, Favourites, strip_or_none, get_url, database | ||
|
||
from urllib.parse import parse_qsl | ||
|
||
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() | ||
|
||
categories = list(set([fav[1] for fav in favourites])) | ||
series = [fav[0] for fav in favourites] | ||
|
||
for category in categories: | ||
cached_episodes = Cache().get(category) | ||
|
||
for episode in cached_episodes['result']['contents']: | ||
series_id = episode['content']['seriesID'] | ||
if series_id in series: | ||
video_id = episode['content']['id'] | ||
if video_id in mylist: | ||
continue | ||
self.insert(episode['type'],episode['content']) | ||
|
||
|
||
def add(self,category,series,title): | ||
self.favourites.insert(category,series,title) | ||
self.build() | ||
|
||
def remove(self,series): | ||
self.favourites.delete(series) | ||
self.delete(series) | ||
|
||
def get(self): | ||
self.delete_expired() | ||
mylist = self.select() | ||
|
||
watched = [str(dict(parse_qsl(entry))['video']).split('/')[-1] for entry in Watcher().select_watched_from_list([get_url(action='play', video=URL_VIDEO_WEBSITE.format(item[1], item[0])) for item in mylist])] | ||
|
||
episodes = [] | ||
|
||
for (video_id, video_type, title, series_id, series_title) in mylist: | ||
if video_id in watched: | ||
continue | ||
label = ' '.join(filter(None, [strip_or_none(series_title), strip_or_none(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': None, | ||
'series_title': series_title }) | ||
|
||
return episodes | ||
|
||
def get_random_pic(self): | ||
pic = None | ||
|
||
with sql.connect(database()) as conn: | ||
stmt = f'SELECT id, vid_type FROM mylist ORDER BY RANDOM() LIMIT 1' | ||
cur = conn.execute(stmt) | ||
results = cur.fetchall() | ||
|
||
if results: | ||
pic = URL_VIDEO_PICTURE.format(results[0][1], results[0][0]) | ||
|
||
return pic | ||
|
||
def select(self): | ||
results = [] | ||
|
||
with sql.connect(database()) as conn: | ||
stmt = ''' | ||
SELECT my.id, | ||
my.vid_type, | ||
my.title, | ||
fav.id as series, | ||
fav.title as series_title | ||
FROM mylist as my | ||
INNER JOIN favourites as fav on fav.id = my.series | ||
''' | ||
cur = conn.execute(stmt) | ||
results = cur.fetchall() | ||
|
||
return results | ||
|
||
def insert(self, type, content): | ||
with sql.connect(database()) as conn: | ||
conn.execute(''' | ||
INSERT OR REPLACE INTO mylist (id,expires,vid_type,title,series) | ||
VALUES (?,?,?,?,?) | ||
''', | ||
(content['id'], content['endAt'], type, content['title'], content['seriesID'], ),) | ||
|
||
def delete(self, series): | ||
with sql.connect(database()) as conn: | ||
conn.execute(f'DELETE FROM mylist WHERE series = ?', (series,),) | ||
|
||
def delete_expired(self): | ||
with sql.connect(database()) as conn: | ||
conn.execute(f'DELETE FROM mylist WHERE expires <= ?', (round(time()),),) |
Oops, something went wrong.