diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fdb8d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +index.html +vvvvidb.sqlite3 \ No newline at end of file diff --git a/db_to_html.py b/db_to_html.py new file mode 100644 index 0000000..fcf5410 --- /dev/null +++ b/db_to_html.py @@ -0,0 +1,48 @@ +import os +import sqlite3 + +vvvvidb = "vvvvidb.sqlite3" + +if not os.path.isfile(vvvvidb): + print("{} file not found. Scrape the DB first using vvvvget.py".format(vvvvidb)) + exit(1) + +con = sqlite3.connect(vvvvidb) +cur = con.cursor() +out = open('index.html', 'w') + +out.write(''' + + + + + Anime | lsd.cat + + + + +Source Database

'''.format(vvvvidb)) + +# select all the series +# cur.execute("SELECT * FROM series;") + +# selecy only series with at least one episodes +cur.execute("SELECT s.* FROM series as s INNER JOIN episodes as e ON e.serie_id = s.id AND e.season_id = s.season_id GROUP BY s.id, s.season_id;") +series = cur.fetchall() + +for s in series: + serie = (str(s[0]), str(s[2])) + out.write("\t

{}: {} - Id Serie: {} - Tipo: {}

\n\t\n') + +out.write('\n\n') +out.close() + +con.commit() +con.close() diff --git a/vvvvget.py b/vvvvget.py index 1009563..b9d9883 100644 --- a/vvvvget.py +++ b/vvvvget.py @@ -1,61 +1,65 @@ +import os import json import requests +import sqlite3 def ds(h): - g = "MNOPIJKL89+/4567UVWXQRSTEFGHABCDcdefYZabstuvopqr0123wxyzklmnghij" + g = "MNOPIJKL89+/4567UVWXQRSTEFGHABCDcdefYZabstuvopqr0123wxyzklmnghij" - def f(m): - l = [] - o = 0 - b = False - m_len = len(m) - while ((not b) and o < m_len): - n = m[o] << 2 - o += 1 - k = -1 - j = -1 - if o < m_len: - n += m[o] >> 4 - o += 1 - if o < m_len: - k = (m[o - 1] << 4) & 255 - k += m[o] >> 2 - o += 1 - if o < m_len: - j = (m[o - 1] << 6) & 255 - j += m[o] - o += 1 - else: - b = True - else: - b = True - else: - b = True - l.append(n) - if k != -1: - l.append(k) - if j != -1: - l.append(j) - return l + def f(m): + l = [] + o = 0 + b = False + m_len = len(m) + while ((not b) and o < m_len): + n = m[o] << 2 + o += 1 + k = -1 + j = -1 + if o < m_len: + n += m[o] >> 4 + o += 1 + if o < m_len: + k = (m[o - 1] << 4) & 255 + k += m[o] >> 2 + o += 1 + if o < m_len: + j = (m[o - 1] << 6) & 255 + j += m[o] + o += 1 + else: + b = True + else: + b = True + else: + b = True + l.append(n) + if k != -1: + l.append(k) + if j != -1: + l.append(j) + return l - c = [] - for e in h: - c.append(g.index(e)) + c = [] + for e in h: + c.append(g.index(e)) - c_len = len(c) - for e in range(c_len * 2 - 1, -1, -1): - a = c[e % c_len] ^ c[(e + 1) % c_len] - c[e % c_len] = a + c_len = len(c) + for e in range(c_len * 2 - 1, -1, -1): + a = c[e % c_len] ^ c[(e + 1) % c_len] + c[e % c_len] = a - c = f(c) - d = '' - for e in c: - d += chr(e) + c = f(c) + d = '' + for e in c: + d += chr(e) - return d + return d def get_settings(): settings = requests.get('https://www.vvvvid.it/vvvvid/settings') + if settings.status_code != 200: + return None return settings.json()['data']['defaultStreamingServer'] def login(): @@ -85,32 +89,58 @@ def get_episodes(season_id, show_id, conn_id): return False vvvvid_stream_url = get_settings() +if vvvvid_stream_url is None: + print("VVVVID is not available at the moment") + exit(1) -with open('index.html', 'a') as out: - out.write(''' - - - - - Anime | lsd.cat - - - -''') +vvvvidb = "vvvvidb.sqlite3" +last = 0 + +if not os.path.isfile(vvvvidb): + con = sqlite3.connect(vvvvidb) + cur = con.cursor() + cur.execute("CREATE TABLE series (id INTEGER, name TEXT NOT NULL, season_id INTEGER, type TEXT, PRIMARY KEY (id, season_id));") + cur.execute("CREATE TABLE episodes (serie_id INTEGER, season_id INTEGER, cdn_url TEXT NOT NULL, type TEXT NOT NULL);") + con.commit() + con.close() +#else: +# con = sqlite3.connect(vvvvidb) +# cur = con.cursor() +# cur.execute("SELECT id FROM series ORDER BY id DESC LIMIT 1;") +# rows = cur.fetchall() +# if len(rows) > 0: +# last = rows[0][0] + 1 +# con.commit() +# con.close() +# +#print("Resuming from...{}".format(last)) + +con = sqlite3.connect(vvvvidb) +cur = con.cursor() stream_url = get_settings() conn_id = login() -for i in range(0,1000): + +for i in range(last, min(last + 500, 1000)): + print("Fetching...{}".format(i)) info = get_info(i, conn_id) if info: seasons = get_seasons(i, conn_id) if seasons: for j in seasons: + serie = (info['show_id'], info['title'], j['season_id'], j['name']) + print("Found: {}".format(info['title'])) + + try: + cur.execute("INSERT INTO series (id, name, season_id, type) VALUES (?, ?, ?, ?);", serie) + con.commit() + except sqlite3.IntegrityError: + # serie/stagione gia' presente, salta il fetch degli episodi + continue + + eps = [] episodes = get_episodes(j['season_id'], i, conn_id) if episodes: - header = '\t

' + str(info['show_id']) + ': ' + info['title'] + ' Tipo: ' + j['name'] + ' Id: ' + str(j['season_id'])+'

\n\t\n') -with open('index.html', 'a') as out: - out.write('\n\n') + embed_info = ds(k['embed_info']) + eps.append((info['show_id'], j['season_id'], k['video_type'], embed_info)) + print("Found {} episodes".format(len(eps))) + try: + cur.executemany("INSERT INTO episodes (serie_id, season_id, type, cdn_url) VALUES (?, ?, ?, ?);", eps) + con.commit() + except sqlite3.IntegrityError: + # episodi gia' presenti + pass +con.close() \ No newline at end of file