divided into simpler functions

This commit is contained in:
StochasticMouse 2024-01-20 15:12:58 +01:00
parent 4a58c6f249
commit bff23b1ffd

View File

@ -1,181 +1,186 @@
def modulo_scarica(): from bs4 import BeautifulSoup as bs
from bs4 import BeautifulSoup as bs import csv, jsbeautifier, cloudscraper, os, re, smtplib
import csv, jsbeautifier, cloudscraper, os, re, smtplib from email.mime.text import MIMEText
from email.mime.text import MIMEText from json import loads
from json import loads from datetime import datetime
from datetime import datetime from yt_dlp import YoutubeDL
#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: with open("animelist.csv",mode='r') as animecsv:
csvfile=csv.reader(animecsv) csvfile=csv.reader(animecsv)
file=list(csvfile) file=list(csvfile)
animecsv.close() return file
with open("cfg.json",mode='r') as config:
configs=config.read() def get_config():
configs=loads(configs) with open("cfg.json",mode='r') as config:
config.close() configs=config.read()
def get_soup(url): #dall'url outputta la soup della pagina configs=loads(configs)
page=r.get(url) return configs
data=page.text
return bs(data, features="html.parser") def get_soup(url): #dall'url outputta la soup della pagina
def new_email(subject,body): r = cloudscraper.create_scraper()
msg = MIMEText(body) page=r.get(url)
msg['Subject'] = subject data=page.text
msg['From'] = configs['email'] return bs(data, features="html.parser")
msg['To'] = configs['email']
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp_server: def new_email(subject,body,configs):
smtp_server.login(configs['email'], configs['email_password']) msg = MIMEText(body)
smtp_server.sendmail(configs['email'], configs['email'], msg.as_string()) msg['Subject'] = subject
print('Email successfully sent!') msg['From'] = configs['email']
def tutti_gli_episodi(url): #trova tutti gli episodi dalla pagina descrittiva dell'anime msg['To'] = configs['email']
cosette=get_soup(url).find('div', {'class':'tab-content'}).find_all('a') with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp_server:
return [episodi['href'] for episodi in cosette] smtp_server.login(configs['email'], configs['email_password'])
def link_ep_da_url(url): #prende la pagina del "Guarda lo Streaming" e trova il link per guardarlo smtp_server.sendmail(configs['email'], configs['email'], msg.as_string())
#print('ledu') print('Email successfully sent!')
cosetta=get_soup(url).find('div', {'class':"btn btn-light w-100 mt-3 mb-3"}).parent
return cosetta['href'] def tutti_gli_episodi(url): #trova tutti gli episodi dalla pagina descrittiva dell'anime
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 cosette=get_soup(url).find('div', {'class':'tab-content'}).find_all('a')
#print('leds') return [episodi['href'] for episodi in cosette]
soup=get_soup(url)
cosetta=soup.find('div', {'class':'main-container'}).find('source') def link_ep_da_url(url): #prende la pagina del "Guarda lo Streaming" e trova il link per guardarlo
links={} #print('link_ep_da_url')
if cosetta: cosetta=get_soup(url).find('div', {'class':"btn btn-light w-100 mt-3 mb-3"}).parent
links.update({'legacy':cosetta['src']}) #legacy video format return cosetta['href']
else:
try: 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
links.update({'saturn':soup.findAll('script',{'type':'text/javascript'})[2].text.split('\n')[2].strip().split('"')[1]}) #new video format #print('links_ep_da_scaricare')
except Exception as e: soup=get_soup(url)
pass cosetta=soup.find('div', {'class':'main-container'}).find('source')
try: links={}
prelink=[link['href'] for link in soup.find('div',{'class':'dropdown-menu'}).find_all('a')] if cosetta:
except Exception as e: links.update({'legacy':cosetta['src']}) #legacy video format
prelink=[] else:
for link in prelink: try:
try: links.update({'saturn':soup.findAll('script',{'type':'text/javascript'})[2].text.split('\n')[2].strip().split('"')[1]}) #new video format
button=get_soup(link).find('i', {'class':'bi bi-download'}).parent except Exception as e:
links.update({button.text.split(' ')[-1].lower():button.parent['href']}) pass
except Exception as e: try:
pass prelink=[link['href'] for link in soup.find('div',{'class':'dropdown-menu'}).find_all('a')]
return links except Exception as e:
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 prelink=[]
#print('link-down') for link in prelink:
#print(named_urls) try:
links={} button=get_soup(link).find('i', {'class':'bi bi-download'}).parent
if named_urls.get('saturn'): links.update({button.text.split(' ')[-1].lower():button.parent['href']})
links.update({'saturn':named_urls['saturn']}) except Exception as e:
if named_urls.get('legacy'): pass
links.update({'legacy':named_urls['legacy']}) return links
if named_urls.get('streamtape'):
soup=get_soup(named_urls['streamtape']) 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
try: #print('link-down')
link = soup.find_all(string=re.compile("""document.getElementById"""))[-2].split('\n')[-1].split("'") #fa magie per estrarre il link del download #print(named_urls)
links.update({'streamtape':'https:'+link[3]+link[5][3:]+'&dl=1'}) links={}
except Exception as e: if named_urls.get('saturn'):
pass links.update({'saturn':named_urls['saturn']})
if named_urls.get('streamhide'): if named_urls.get('legacy'):
soup=get_soup(named_urls['streamhide']) links.update({'legacy':named_urls['legacy']})
try: if named_urls.get('streamtape'):
script=soup.find('script',attrs={"type": "text/javascript"},string=re.compile('m3u8')).text soup=get_soup(named_urls['streamtape'])
links.update({'streamhide':[el for el in script.split('"') if 'm3u8' in el][0]}) try:
except Exception as e: link = soup.find_all(string=re.compile("""document.getElementById"""))[-2].split('\n')[-1].split("'") #fa magie per estrarre il link del download
pass links.update({'streamtape':'https:'+link[3]+link[5][3:]+'&dl=1'})
#print(links) except Exception as e:
return links pass
def scarica(lista): #la lista sarà nella forma filepath,url e prova in ordine di priorità da conf if named_urls.get('streamhide'):
orario=datetime.now().strftime("%d/%m/%Y %H:%M:%S") soup=get_soup(named_urls['streamhide'])
priority=configs['DownPriority'] try:
urls_file=link_down(links_ep_da_scaricare(link_ep_da_url(lista[1]))) script=soup.find('script',attrs={"type": "text/javascript"},string=re.compile('m3u8')).text
for provider in priority: links.update({'streamhide':[el for el in script.split('"') if 'm3u8' in el][0]})
try: except Exception as e:
print('['+orario+']'+'Avvio download '+provider+' per '+lista[0].split('/')[-1]) pass
#open(lista[0], 'wb').write(r.get(urls_file['provider']).content) #print(links)
with YoutubeDL({'outtmpl':{'default':lista[0]},'quiet':True,'no_warnings':True,'ignoreerrors':False,'retries':10}) as ydl: return links
ydl.download(urls_file[provider])
print('['+orario+']'+'Successo per '+lista[0].split('/')[-1]) def scarica(lista,configs): #la lista sarà nella forma filepath,url e prova in ordine di priorità da conf
return orario=datetime.now().strftime("%d/%m/%Y %H:%M:%S")
except Exception as e: priority=configs['DownPriority']
print(e) urls_file=link_down(links_ep_da_scaricare(link_ep_da_url(lista[1])))
print('['+orario+']'+'Errore '+provider+' per '+lista[0].split('/')[-1]) for provider in priority:
#lines 0 è url ep, lines 1 è cartella download, lines 2 è nome anime try:
lista_email=[] print('['+orario+']'+'Avvio download '+provider+' per '+lista[0].split('/')[-1])
for lines in file[1:]: #open(lista[0], 'wb').write(r.get(urls_file['provider']).content)
ora=datetime.now() with YoutubeDL({'outtmpl':{'default':lista[0]},'quiet':True,'no_warnings':True,'ignoreerrors':False,'retries':10}) as ydl:
orario=ora.strftime("%d/%m/%Y %H:%M:%S") ydl.download(urls_file[provider])
if int(lines[3]): print('['+orario+']'+'Successo per '+lista[0].split('/')[-1])
try: return
lista_ep=tutti_gli_episodi(lines[0]) #ho trovato la lista dei num episodi except Exception as e:
#print(lista_ep) print(e)
if not os.path.exists(os.path.join(configs['DownDir'],lines[1])): #se la cartella down non c'è falla print('['+orario+']'+'Errore '+provider+' per '+lista[0].split('/')[-1])
os.makedirs(os.path.join(configs['DownDir'],lines[1]))
ep_gia_scar=os.listdir(os.path.join(configs['DownDir'],lines[1])) def modulo_scarica():
if len(ep_gia_scar)==len(lista_ep): file = get_animu()
print('['+orario+']'+"Nessun aggiornamento per "+lines[1]) configs = get_config()
else: #lines 0 è url ep, lines 1 è cartella download, lines 2 è nome anime
results=[] #lista in cui ci saranno i link da scaricare lista_email=[]
for episodi in lista_ep: for lines in file[1:]:
numero=episodi.split('-')[-1] #estrae il numero dell'episodio dall'url ora=datetime.now()
#print(numero) orario=ora.strftime("%d/%m/%Y %H:%M:%S")
#print(lines) if int(lines[3]):
if len(lines)>4 and lines[4]: #se ho la new naming convention try:
numerello = format(int(float(numero)),'03d') lista_ep=tutti_gli_episodi(lines[0]) #ho trovato la lista dei num episodi
if float(numero)%1: #print(lista_ep)
virgola = '.'+format(float(numero),'.1f').split('.')[-1] if not os.path.exists(os.path.join(configs['DownDir'],lines[1])): #se la cartella down non c'è falla
else: os.makedirs(os.path.join(configs['DownDir'],lines[1]))
virgola = '' ep_gia_scar=os.listdir(os.path.join(configs['DownDir'],lines[1]))
nome_ep=lines[2] + 'E' + numerello + virgola + '.mp4' if len(ep_gia_scar)==len(lista_ep):
else: print('['+orario+']'+"Nessun aggiornamento per "+lines[1])
nome_ep=lines[2]+' Ep '+ numero + '.mp4' #definisco nome dell'episodio else:
if nome_ep in ep_gia_scar: results=[] #lista in cui ci saranno i link da scaricare
print('['+orario+']'+lines[1]+'/'+nome_ep+' è già presente nella cartella') for episodi in lista_ep:
else: #scarico l'ep mancante numero=episodi.split('-')[-1] #estrae il numero dell'episodio dall'url
filepath=os.path.join(configs['DownDir'],lines[1], nome_ep) #print(numero)
results.append((filepath,episodi)) #print(lines)
for ep in results: if len(lines)>4 and lines[4]: #se ho la new naming convention
scarica(ep) numerello = format(int(float(numero)),'03d')
lista_email.append((os.path.basename(ep[0]),0)) if float(numero)%1:
''' virgola = '.'+format(float(numero),'.1f').split('.')[-1]
print(results) else:
pool=ThreadPool(1) virgola = ''
pool.map(scarica,results) nome_ep=lines[2] + 'E' + numerello + virgola + '.mp4'
pool.close() else:
pool.join() nome_ep=lines[2]+' Ep '+ numero + '.mp4' #definisco nome dell'episodio
''' if nome_ep in ep_gia_scar:
except Exception as e: print('['+orario+']'+lines[1]+'/'+nome_ep+' è già presente nella cartella')
print(e) else: #scarico l'ep mancante
lista_email.append((lines[1],1)) filepath=os.path.join(configs['DownDir'],lines[1], nome_ep)
print('['+orario+']'+lines[1]+'/'+lines[2]+': Errore Critico ottenendo la lista episodi') results.append((filepath,episodi))
else: for ep in results:
print('['+orario+']'+"Skip "+lines[2]) scarica(ep,configs)
if configs['email']: #se nei config email è vuota non inviamo nulla lista_email.append((os.path.basename(ep[0]),0))
novità=[el for el in lista_email if el[1]==0] except Exception as e:
errori=[el for el in lista_email if el[1]==1] print(e)
#so che potrei scrivere con meno controlli le righe sotto ma per facilità di lettura faccio controlli inutili lista_email.append((lines[1],1))
if novità and errori: print('['+orario+']'+lines[1]+'/'+lines[2]+': Errore Critico ottenendo la lista episodi')
subject='Saturn_cli: Errori e Novità' else:
body="Yo sono usciti nuovi episodi, valli a vedere soldato ;)\n" print('['+orario+']'+"Skip "+lines[2])
for el in novità: if configs['email']: #se nei config email è vuota non inviamo nulla
body+=f"{ el[0] } è stato aggiunto con successo!\n" novità=[el for el in lista_email if el[1]==0]
body+="\nOhibò ci sono stati degli errori :(\n" errori=[el for el in lista_email if el[1]==1]
for el in errori: #so che potrei scrivere con meno controlli le righe sotto ma per facilità di lettura faccio controlli inutili
body+=f"{ el[0] }, oof ci sono stati errori con questo anime\n" if novità and errori:
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o" subject='Saturn_cli: Errori e Novità'
new_email(subject,body) body="Yo sono usciti nuovi episodi, valli a vedere soldato ;)\n"
elif novità: for el in novità:
subject='Saturn_cli: Novità' body+=f"{ el[0] } è stato aggiunto con successo!\n"
body="Yo sono usciti nuovi episodi, valli a vedere soldato ;)\n" body+="\nOhibò ci sono stati degli errori :(\n"
for el in novità: for el in errori:
body+=f"{ el[0] } è stato aggiunto con successo!\n" body+=f"{ el[0] }, oof ci sono stati errori con questo anime\n"
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o" body+="\nFine resoconto, sono sbalordito delle mie capacità o_o"
new_email(subject,body) new_email(subject,body,configs)
elif errori: elif novità:
subject='Saturn_cli: Errori' subject='Saturn_cli: Novità'
body="Ohibò ci sono stati degli errori :(\n" body="Yo sono usciti nuovi episodi, valli a vedere soldato ;)\n"
for el in errori: for el in novità:
body+=f"{ el[0] }, oof ci sono stati errori con questo anime\n" body+=f"{ el[0] } è stato aggiunto con successo!\n"
body+="\nFine resoconto, sono sbalordito delle mie capacità o_o" 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,configs)
if __name__ == "__main__": if __name__ == "__main__":
modulo_scarica() modulo_scarica()