Skip to content

Commit

Permalink
0.3.5 #3 start refactoring 💥
Browse files Browse the repository at this point in the history
  • Loading branch information
kuriho committed Jun 6, 2023
1 parent 764b890 commit 77e1549
Show file tree
Hide file tree
Showing 16 changed files with 357 additions and 420 deletions.
Empty file removed __init__.py
Empty file.
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='UTF-8'?>
<addon id="plugin.video.tver" name="TVer" version="0.3.0" provider-name="kuriho">
<addon id="plugin.video.tver" name="TVer" version="0.3.5" provider-name="kuriho">

<requires>
<import addon="xbmc.python" version="3.0.1" />
Expand Down
87 changes: 0 additions & 87 deletions cache.py

This file was deleted.

29 changes: 0 additions & 29 deletions favourites.py

This file was deleted.

9 changes: 9 additions & 0 deletions lib/__init__.py
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

53 changes: 53 additions & 0 deletions lib/cache.py
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()),),)
18 changes: 18 additions & 0 deletions lib/db.py
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



60 changes: 60 additions & 0 deletions lib/favourites.py
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)
121 changes: 121 additions & 0 deletions lib/mylist.py
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()),),)
Loading

0 comments on commit 77e1549

Please sign in to comment.