Compare commits

...

2 Commits

Author SHA1 Message Date
42c3f6b37d Merge remote-tracking branch 'refs/remotes/origin/main' 2023-05-16 22:33:53 +02:00
1838ac4850 fix: and clean 2023-05-16 22:33:36 +02:00
6 changed files with 215 additions and 120 deletions

55
database.py Normal file
View File

@ -0,0 +1,55 @@
from tinydb import TinyDB, Query
from tinydb.operations import set, delete
class Database():
def __init__(self):
self.db = TinyDB("database.json", indent=4)
self.query = Query()
self.cookies_table = self.db.table("cookies")
self.viewing_table = self.db.table("viewing")
self.sites_table = self.db.table("sites")
def get_viewing_data(self, url:str ):
return (self.viewing_table.get(self.query.url == url))
def get_sites(self):
return (self.sites_table.all())
def get_site_by_id(self, id: int):
return (self.sites_table.get(self.query.id == id))
def get_sites_table_len(self):
return (len(self.sites_table.all()))
def get_cookies_table_len(self):
return (len(self.cookies_table.all()))
def add_cookies(self, arg: dict):
self.cookies_table.insert(arg)
def get_cookies(self):
return (self.cookies_table.get(self.query.id == "0"))
def get_last_site_id(self):
cookies = self.get_cookies()
last_site_id = cookies.get("last_site")
return (last_site_id)
def get_last_site(self):
last_site_id = self.get_last_site_id()
last_site = self.get_site_by_id(last_site_id)
return (last_site)
def get_last_path(self):
cookies = self.get_cookies()
last_path = cookies.get("last_path")
return (last_path)
def set_last_site(self, value):
self.cookies_table.update(set("last_site", value), self.query.id == "0")
def set_last_path(self, value):
self.cookies_table.update(set("last_path", value), self.query.id == "0")
def add_site(self, site):
self.sites_table.insert(site)

160
main.py
View File

@ -1,112 +1,34 @@
from tinydb import TinyDB, Query from urllib.parse import unquote, quote
from bs4 import BeautifulSoup from scrapper import get_uri, get_files
import requests import player
from simple_term_menu import TerminalMenu from database import Database
import os from utils import get_url
import sys import menu
import subprocess
from operator import itemgetter
from urllib.parse import unquote
from tinydb.operations import set, delete
def get_files(url: str) -> []: def files_navigator(site: dict):
if (url in ["/../", "../"]): if site.get("id") == database.get_last_site_id():
return ([]) path = database.get_last_path()
response = requests.get(url)
if (response.status_code != 200):
print("connection:", response.reason)
sys.exit(1)
soup = BeautifulSoup(response.text, 'html.parser')
files = []
for element in soup.findAll("a"):
file = {}
file.update({"name": unquote(element['href'])})
file.update({"link": element["href"]})
files.append(file)
return (files)
def get_uri(url: str) -> []:
if (url in ["/../", "../"]):
return ([])
try:
response = requests.get(url)
if (response.status_code != 200):
print("connection:", response.reason)
sys.exit(1)
soup = BeautifulSoup(response.text, 'html.parser')
return(soup.find("h1").text[9:])
except:
return ("")
def get(files: [], key: str):
names = []
for file in files:
names.append(file.get(key))
return (names)
def open_vlc(url: str) -> None:
with open(os.devnull, 'wb') as devnull:
subprocess.check_call(['vlc', url], stdout=devnull, stderr=subprocess.STDOUT)
def files_preview(filename: str) -> str:
if (not filename.endswith("/")):
return (None)
files = get_files(url + filename)
return ("\n".join(get(files, "name")))
def files_navigator():
global url
path = cookies_table.get(query.id == "0").get("last_path")
if (path):
url = url + path
else: else:
url = url + "/" path = '/'
while True: while True:
cookies_table.update(set("last_path", get_uri(url)), query.id == "0") database.set_last_path(path)
try: file = menu.files(get_url(site) + path)
files = get_files(url) if (file == None):
except: return
print("Connection: ERROR") elif (file == "../" and path == "/"):
return (1)
terminal_menu = TerminalMenu(get(files, "name"), preview_command=files_preview, preview_size=0.3, show_search_hint=True, title=get_uri(url))
file_choose = terminal_menu.show()
if (file_choose == None):
sys.exit(0)
elif (file_choose == 0 and get_uri(url) == "/"):
return return
file = get(files, "link")[file_choose]
if (not file.endswith("/")): if (not file.endswith("/")):
open_vlc(url + file) player.play(get_url(site) + path + file, database)
else: else:
url = url + file path = path + file
def add_site(): def add_site():
print("add a site:") site = menu.add_site()
site = {} database.add_site(site)
site.update({"url": input("url without protocol (ip:port):")})
site.update({"user": input("user(leave blank):")})
site.update({"password": input("password(leave blank):")})
site.update({"id": len(sites_table.all())})
name = input(f"name[{str(len(sites_table.all()))}] :")
if (name == ""):
name = str(len(sites_table.all()))
site.update({"name": name})
sites_table.insert(site)
def set_url(site):
global url
cookies_table.update(set("last_site", site.get("id")), query.id == "0")
if (site.get("user") and site.get("password")):
url = f"http://{site.get('user')}:{site.get('password')}@{site.get('url')}/"
else:
url = f"http://{site.get('url')}/";
def config_preview(site_name:str): def config_preview(site_name:str):
id = int(site_name.split(": ")[0]) id = int(site_name.split(": ")[0])
site = sites_table.get(query.id == id) site = database.get_site_by_id(id)
str = f""" str = f"""
url: {site.get('url')} url: {site.get('url')}
user: {site.get('user')} user: {site.get('user')}
@ -125,13 +47,13 @@ def sites_deleter():
site_name = lst[choose] site_name = lst[choose]
id = int(site_name.split(": ")[0]) id = int(site_name.split(": ")[0])
sites_table.remove(query.id == id) sites_table.remove(query.id == id)
if (cookies_table.get(query.id == "0").get("last_site") == id): if (database.get_last_site() == id):
cookies_table.update(set("last_site", ""), query.id == choose.get("id")) database.set_last_path("")
cookies_table.update(set("last_path", ""), query.id == choose.get("id")) database.set_last_site("")
def sites_editor(): def sites_editor(site_id: int):
lst = [] lst = []
for i in sites_table.all(): for i in database.get_sites():
lst.append(f"{str(i.get('id'))}: {i.get('name')}") lst.append(f"{str(i.get('id'))}: {i.get('name')}")
terminal_menu = TerminalMenu(lst, show_search_hint=True, preview_title="delete", preview_command=config_preview) terminal_menu = TerminalMenu(lst, show_search_hint=True, preview_title="delete", preview_command=config_preview)
choose = terminal_menu.show() choose = terminal_menu.show()
@ -139,7 +61,7 @@ def sites_editor():
return (1) return (1)
site_name = lst[choose] site_name = lst[choose]
id = int(site_name.split(": ")[0]) id = int(site_name.split(": ")[0])
site = sites_table.get(query.id == id) site = database.get_site_by_id(id)
lst = [f"name: {site.get('name')}", f"url: {site.get('url')}", f"user: {site.get('user')}", f"password: {site.get('password')}"] lst = [f"name: {site.get('name')}", f"url: {site.get('url')}", f"user: {site.get('user')}", f"password: {site.get('password')}"]
terminal_menu = TerminalMenu(lst) terminal_menu = TerminalMenu(lst)
choose = terminal_menu.show() choose = terminal_menu.show()
@ -157,35 +79,33 @@ def sites_editor():
sites_table.update(set("password", input("password: ")), query.id == id) sites_table.update(set("password", input("password: ")), query.id == id)
def sites_navigator(): def sites_navigator():
if (len(sites_table.all()) == 0): nb_site = database.get_sites_table_len()
if (nb_site == 0):
add_site() add_site()
last_site_id = cookies_table.get(query.id == "0").get("last_site") nb_site = 1
last_site = sites_table.get(query.id == last_site_id) last_site = database.get_last_site()
if (last_site != None): if (last_site != None):
set_url(last_site) files_navigator(last_site)
files_navigator()
while True: while True:
terminal_menu = TerminalMenu(get(sites_table.all(), "name") + ["", "add", "edit", "delete"], skip_empty_entries=True, show_search_hint=True) nb_site = database.get_sites_table_len()
terminal_menu = TerminalMenu(get(database.get_sites(), "name") + ["", "add", "edit", "delete"], skip_empty_entries=True, show_search_hint=True)
choose = terminal_menu.show() choose = terminal_menu.show()
if (choose == None): if (choose == None):
return (1) return (1)
if (choose == len(sites_table.all()) + 1): if (choose == nb_site + 1):
add_site(); add_site();
elif (choose == len(sites_table.all()) + 2): elif (choose == nb_site + 2):
sites_editor() sites_editor()
elif (choose == len(sites_table.all()) + 3): elif (choose == nb_site + 3):
sites_deleter() sites_deleter()
sites_navigator() sites_navigator()
return return
else: else:
set_url(sites_table.all()[choose]) set_url(database.get_sites()[choose])
files_navigator() files_navigator()
db = TinyDB("./database.json", indent=4) database = Database()
query = Query()
sites_table = db.table("sites") if (database.get_cookies_table_len() == 0):
cookies_table = db.table("cookies") database.add_cookies({"last_path": "", "last_site": "", "id": "0"})
if (len(cookies_table.all()) == 0):
cookies_table.insert({"last_path": "", "last_site": "", "id": "0"})
sites_navigator(); sites_navigator();

66
menu.py Normal file
View File

@ -0,0 +1,66 @@
from simple_term_menu import TerminalMenu
from database import Database
from scrapper import get_files, get_uri
url = ""
def add_site(database: Database) -> dict:
print("add a site:")
site = {}
site.update({"url": input("url without protocol (ip:port):")})
site.update({"user": input("user(leave blank):")})
site.update({"password": input("password(leave blank):")})
site.update({"id": str(database.get_sites_table_len())})
name = input(f"name[{str(len(sites_table.all()))}] :")
if (name == ""):
name = str(database.get_sites_table_len())
site.update({"name": name})
return (site)
def files_preview(filename: str) -> str:
if (not filename.endswith("/")):
return (None)
files = get_files(url + filename)
return ("\n".join(files))
def files(base_url:str):
global url
url = base_url
files = get_files(base_url)
terminal_menu = TerminalMenu(files,
preview_command=files_preview,
preview_size=0.3,
show_search_hint=True,
title=f"Index of {get_uri(url)}")
choose = terminal_menu.show()
return (files[choose])
def config_preview(site_name:str):
id = int(site_name.split(": ")[0])
site = database.get_site_by_id(id)
str = f"""
url: {site.get('url')}
user: {site.get('user')}
password: {site.get('password')}
"""
return (str)
def site_deleter(sites: list):
terminal_menu = TerminalMenu(sites,
show_search_hint=True,
preview_title="delete",
preview_command=config_preview)
choose = terminal_menu.show()
return (choose)
def site_editor(lst: list):
terminal_menu = TerminalMenu(lst + ["", "quit"],
skip_empty_entries=True,
show_search_hint=True,
preview_title="Edit",
preview_command=config_preview)
choose = terminal_menu.show()
if (choose == len(lst) + 1):
return (None)
return (choose)

19
player.py Normal file
View File

@ -0,0 +1,19 @@
from simple_term_menu import TerminalMenu
import vlc
from database import Database
def play(url: str, database: Database):
start_pos = 0
viewing_data = database.get_viewing_data(url)
if (viewing_data != None):
menu = TerminalMenu([f"go back to {str(viewing_data.get('last_pos'))}", "restart from 0:00"])
response = menu.show()
if (response == None):
return (1);
elif (response == 0):
start_pos = viewing_data.get("last_pos")
vlc_instance = vlc.Instance()
player = vlc_instance.media_player_new()
media = vlc_instance.media_new(url)
player.set_media(media)
player.play()

29
scrapper.py Normal file
View File

@ -0,0 +1,29 @@
from bs4 import BeautifulSoup
from urllib.parse import quote, unquote
import requests
def get_files(url: str) -> []:
if (url in ["/../", "../"]):
return ([])
response = requests.get(url)
if (response.status_code != 200):
print("connection:", response.reason)
sys.exit(1)
soup = BeautifulSoup(response.text, 'html.parser')
files = []
for element in soup.findAll("a"):
files.append(unquote(element["href"]))
return (files)
def get_uri(url: str) -> []:
if (url in ["/../", "../"]):
return ([])
try:
response = requests.get(url)
if (response.status_code != 200):
print("connection:", response.reason)
sys.exit(1)
soup = BeautifulSoup(response.text, 'html.parser')
return(soup.find("h1").text[9:])
except:
return ("")

6
utils.py Normal file
View File

@ -0,0 +1,6 @@
def get_url(site: dict):
if (site.get("user") == "" and site.get("password") == ""):
return (f"http://{site.get('url')}")
else:
return (f"http://{site.get('user')}:{site.get('password')}@{site.get('url')}")