Compare commits

..

2 Commits

Author SHA1 Message Date
StochasticMouse
e24f4911db added webserver capabilities to add/rm anime 2024-01-20 17:19:11 +01:00
StochasticMouse
bff23b1ffd divided into simpler functions 2024-01-20 15:12:58 +01:00
3 changed files with 288 additions and 177 deletions

View File

@ -1,26 +1,29 @@
def modulo_scarica():
from bs4 import BeautifulSoup as bs
import csv, jsbeautifier, cloudscraper, os, re, smtplib
from email.mime.text import MIMEText
from json import loads
from datetime import datetime
#from multiprocessing.dummy import Pool as ThreadPool
from yt_dlp import YoutubeDL
r = cloudscraper.create_scraper()
def get_animu():
with open("animelist.csv",mode='r') as animecsv:
csvfile=csv.reader(animecsv)
file=list(csvfile)
animecsv.close()
return file
def get_config():
with open("cfg.json",mode='r') as config:
configs=config.read()
configs=loads(configs)
config.close()
return configs
def get_soup(url): #dall'url outputta la soup della pagina
r = cloudscraper.create_scraper()
page=r.get(url)
data=page.text
return bs(data, features="html.parser")
def new_email(subject,body):
def new_email(subject,body,configs):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = configs['email']
@ -29,15 +32,18 @@ def modulo_scarica():
smtp_server.login(configs['email'], configs['email_password'])
smtp_server.sendmail(configs['email'], configs['email'], msg.as_string())
print('Email successfully sent!')
def tutti_gli_episodi(url): #trova tutti gli episodi dalla pagina descrittiva dell'anime
cosette=get_soup(url).find('div', {'class':'tab-content'}).find_all('a')
return [episodi['href'] for episodi in cosette]
def link_ep_da_url(url): #prende la pagina del "Guarda lo Streaming" e trova il link per guardarlo
#print('ledu')
#print('link_ep_da_url')
cosetta=get_soup(url).find('div', {'class':"btn btn-light w-100 mt-3 mb-3"}).parent
return cosetta['href']
def links_ep_da_scaricare(url): #prende il link output di link_ep_da_url e cerca al suo interno tutti i link di file di tutti i provider possibili ritornando un dict
#print('leds')
#print('links_ep_da_scaricare')
soup=get_soup(url)
cosetta=soup.find('div', {'class':'main-container'}).find('source')
links={}
@ -59,6 +65,7 @@ def modulo_scarica():
except Exception as e:
pass
return links
def link_down(named_urls): #prende il dict di links_ep_da_scaricare e per quanto può converte i siti in link scaricabili tramite yt-dlp
#print('link-down')
#print(named_urls)
@ -83,7 +90,8 @@ def modulo_scarica():
pass
#print(links)
return links
def scarica(lista): #la lista sarà nella forma filepath,url e prova in ordine di priorità da conf
def scarica(lista,configs): #la lista sarà nella forma filepath,url e prova in ordine di priorità da conf
orario=datetime.now().strftime("%d/%m/%Y %H:%M:%S")
priority=configs['DownPriority']
urls_file=link_down(links_ep_da_scaricare(link_ep_da_url(lista[1])))
@ -98,6 +106,10 @@ def modulo_scarica():
except Exception as e:
print(e)
print('['+orario+']'+'Errore '+provider+' per '+lista[0].split('/')[-1])
def modulo_scarica():
file = get_animu()
configs = get_config()
#lines 0 è url ep, lines 1 è cartella download, lines 2 è nome anime
lista_email=[]
for lines in file[1:]:
@ -133,15 +145,8 @@ def modulo_scarica():
filepath=os.path.join(configs['DownDir'],lines[1], nome_ep)
results.append((filepath,episodi))
for ep in results:
scarica(ep)
scarica(ep,configs)
lista_email.append((os.path.basename(ep[0]),0))
'''
print(results)
pool=ThreadPool(1)
pool.map(scarica,results)
pool.close()
pool.join()
'''
except Exception as e:
print(e)
lista_email.append((lines[1],1))
@ -161,21 +166,21 @@ def modulo_scarica():
for el in errori:
body+=f"{ el[0] }, oof ci sono stati errori con questo anime\n"
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o"
new_email(subject,body)
new_email(subject,body,configs)
elif novità:
subject='Saturn_cli: Novità'
body="Yo sono usciti nuovi episodi, valli a vedere soldato ;)\n"
for el in novità:
body+=f"{ el[0] } è stato aggiunto con successo!\n"
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o"
new_email(subject,body)
new_email(subject,body,configs)
elif errori:
subject='Saturn_cli: Errori'
body="Ohibò ci sono stati degli errori :(\n"
for el in errori:
body+=f"{ el[0] }, oof ci sono stati errori con questo anime\n"
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o"
new_email(subject,body)
new_email(subject,body,configs)
if __name__ == "__main__":
modulo_scarica()

28
templates/index.html Normal file
View File

@ -0,0 +1,28 @@
<table id="csv_table">
{% for row in csv %}
<tr>
{% for col in row %}
<td>{{ col }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<p></p>
<p></p>
<p></p>
<form action="new_animu" method = "POST">
<p>Vuoi aggiungerne uno nuovo?</p>
<table id="new_animu_table">
<tr>
<td>Url:</td><td><input type = "text" name = "field_url" /></td>
<td>Nome serie:</td><td><input type = "text" name = "field_folder" /></td>
<td>Stagione:</td><td><input type = "text" name = "field_season" /></td>
<td><input type = "submit" value = "submit" /></td>
</tr>
</table>
</form>
<form action="del_animu" method= "POST">
<p>Vuoi eliminare un anime?</p>
<input type = "text" name = "del_field" />
<input type = "submit" value = "submit" />
</form>

78
webserver.py Normal file
View File

@ -0,0 +1,78 @@
from flask import Flask, render_template, request, redirect
import csv
HOST_NAME = "localhost"
HOST_PORT = 5000
app = Flask(__name__)
@app.route("/")
def mainpage():
with open("animelist.csv") as file:
reader = csv.reader(file)
enum = list(enumerate(list(reader)))
lista = []
for el in enum:
lista.append([el[0]]+el[1])
return render_template('index.html',csv=lista)
@app.route("/new_animu", methods = ['POST', 'GET'])
def new_animu():
if request.method == 'GET':
return redirect('/')
if request.method == 'POST':
form_data = request.form
#print(form_data)
if add_animu(form_data):
return f'Anime aggiunto con successo'
return f'Errore aggiungendo anime, hai inserito correttamente i valori?'
@app.route("/del_animu", methods = ['POST', 'GET'])
def del_animu():
if request.method == 'GET':
return redirect('/')
if request.method == 'POST':
form_data = request.form
print(form_data)
if del_animu(form_data):
return f'Anime rimosso con successo'
return f'Errore rimuovendo anime, hai inserito correttamente i valori?'
def add_animu(form_data):
try:
if not (form_data['field_season'] and form_data['field_url'] and form_data['field_folder']):
return False
stagione = int(form_data['field_season'])
new_entry = [form_data['field_url'],
form_data['field_folder'] + '/Season ' + str(stagione),
'Episode S' + format(stagione,'02d'),
1,
1]
with open("animelist.csv",mode='a') as animecsv: #link,cartella>
csvfile=csv.writer(animecsv)
csvfile.writerow(new_entry)
return True
except Exception as e:
print(e)
return False
def del_animu(form_data):
try:
if not form_data['del_field']:
return False
data = []
with open("animelist.csv", 'r', newline='') as file:
csv_reader = csv.reader(file)
for index, row in enumerate(csv_reader):
if index != int(form_data['del_field']):
data.append(row)
# Write the remaining data back to the CSV file
with open("animelist.csv", 'w', newline='') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(data)
return True
except Exception as e:
print(e)
return False
if __name__ == "__main__":
app.run(HOST_NAME, HOST_PORT)