divided into simpler functions
This commit is contained in:
parent
4a58c6f249
commit
bff23b1ffd
359
saturn_cli.py
359
saturn_cli.py
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user