Skip to content

Commit

Permalink
build TürkAnimu Downloader v5.3.1
Browse files Browse the repository at this point in the history
  • Loading branch information
KebabLord committed Feb 1, 2021
1 parent b25eb0f commit 2302369
Show file tree
Hide file tree
Showing 5 changed files with 219 additions and 168 deletions.
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
PyInquirer
questionary
selenium
youtube-dl
bs4
easygui
rich
112 changes: 56 additions & 56 deletions turkanime.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,66 @@
from os import name,path,mkdir
""" TürkAnimu Downloader v5.3 """
from os import path,mkdir
from sys import exit as kapat
from atexit import register
from configparser import ConfigParser
from PyInquirer import prompt
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from turkanime_api import AnimeSorgula,Anime,dosya,get_config
from selenium.common.exceptions import WebDriverException
from rich.progress import Progress, BarColumn, SpinnerColumn
from rich import print as rprint
from questionary import select,autocomplete,prompt

print('TürkAnimu İndirici - github/Kebablord')
from turkanime_api import AnimeSorgula,Anime,dosya,get_config
from turkanime_api import elementi_bekle,webdriver_hazirla,prompt_tema

def at_exit(): # Program kapatıldığında
print(" "*50+"\rProgram kapatılıyor..",end="\r")
driver.quit()
register(at_exit)
with Progress(SpinnerColumn(), '[progress.description]{task.description}', BarColumn(bar_width=40)) as progress:
task = progress.add_task("[cyan]Sürücü başlatılıyor..", start=False)
driver = webdriver_hazirla()
register(lambda: (print("Program kapatılıyor..",end="\r") or driver.quit()))

options = Options()
options.add_argument('--headless')
print(" "*50+"\rSürücü başlatılıyor...",end="\r")
profile = webdriver.FirefoxProfile()
profile.set_preference('permissions.default.image', 2)
profile.set_preference("network.proxy.type", 0)
progress.update(task, description="[cyan]TürkAnime'ye bağlanılıyor..")
try:
driver.get("https://turkanime.net/kullanici/anonim")
elementi_bekle(".navbar-nav",driver)
except (ConnectionError,WebDriverException):
progress.update(task,visible=False)
rprint("[red][strong]TürkAnime'ye ulaşılamıyor.[/strong][red]")
kapat(1)
sorgu = AnimeSorgula(driver)
progress.update(task,visible=False)

if name == 'nt': # WINDOWS
driver = webdriver.Firefox(profile, options=options,service_log_path='NUL', executable_path=dosya('geckodriver.exe'))
else: # LINUX
driver = webdriver.Firefox(profile, options=options, service_log_path='/dev/null')

sorgu = AnimeSorgula(driver)
while True:
islem = prompt([{
'type': 'list',
'name': 'islem',
'message': 'İşlemi seç',
'choices': [
'Anime izle',
'Anime indir',
'Ayarlar',
'Kapat']
}])['islem']
islem = select(
"İşlemi seç",
choices=['Anime izle',
'Anime indir',
'Ayarlar',
'Kapat'],
style=prompt_tema,
instruction=" "
).ask()

if "Anime" in islem:
try:
secilen_seri = autocomplete(
'Animeyi yazın',
choices=sorgu.get_seriler(),
style=prompt_tema
).ask()

# Anime'yi ara ve bölüm seç
secilen_bolumler = prompt([{
'type': 'input',
'name': 'anahtar_kelime',
'message': 'Animeyi ara',
},{
'type': 'list',
'name': 'anime_ismi',
'message': 'Animeyi seç',
'choices': sorgu.listele,
},{
'type': "checkbox" if "indir" in islem else "list",
secilen_bolumler = prompt({
'type': "checkbox" if "indir" in islem else "select",
'message': 'Bölüm seç',
'name': 'anime_bolum',
'choices': sorgu.listele
}])["anime_bolum"]
except IndexError:
print("Sonuç bulunamadı.")
'choices': sorgu.get_bolumler(secilen_seri)},
style=prompt_tema,
kbi_msg=""
)['anime_bolum']

except KeyError:
continue

anime = Anime(driver,sorgu.seri,secilen_bolumler)
anime = Anime(driver, sorgu.anime_ismi ,secilen_bolumler)

if islem=="Anime izle":
anime.oynat()
Expand All @@ -70,17 +70,17 @@ def at_exit(): # Program kapatıldığında
elif "Ayarlar" in islem:
parser = ConfigParser()
while True:
parser.read(get_config())
parser.read(path.join(".",get_config() ))
isAutosave = parser.getboolean("TurkAnime","izlerken kaydet")
dlFolder = parser.get("TurkAnime","indirilenler")
opsiyon = prompt([{
'type': 'list',
'name': 'ayar',
'message': 'İşlemi seç',
'choices': ['İndirilenler klasörünü seç',
f'İzlerken kaydet: {isAutosave}',
'Geri dön']
}])['ayar']
opsiyon = select(
'İşlemi seç',
['İndirilenler klasörünü seç',
f'İzlerken kaydet: {isAutosave}',
'Geri dön'],
style=prompt_tema,
instruction=" ",
).ask()
if opsiyon == 'İndirilenler klasörünü seç':
from easygui import diropenbox
parser.set('TurkAnime','indirilenler',diropenbox())
Expand Down
43 changes: 42 additions & 1 deletion turkanime_api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
from sys import exit as kapat
import subprocess as sp
from os import name
from prompt_toolkit import styles
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from .anime import AnimeSorgula,Anime
from .players import elementi_bekle
from .compile import dosya,get_config

def gereksinim_kontrol():
Expand All @@ -15,5 +20,41 @@ def gereksinim_kontrol():
else:
stdout += f"+ {gereksinim} bulundu.\n"
if eksik:
print(stdout+"\nBelirtilen program yada programlar, program dizininde yada sistem PATH'ında bulunamadı. Lütfen klavuzdaki kurulum talimatlarını uygulayın.")
print(stdout+"\nBelirtilen program yada programlar",
"program dizininde yada sistem PATH'ında bulunamadı.",
"Lütfen klavuzdaki kurulum talimatlarını uygulayın.")
kapat(1)

def webdriver_hazirla():
""" Selenium webdriver'ı hazırla """
options = Options()
options.add_argument('--headless')
profile = webdriver.FirefoxProfile()
profile.set_preference("dom.webdriver.enabled", False)
profile.set_preference('useAutomationExtension', False)
profile.set_preference('permissions.default.image', 2)
profile.set_preference("network.proxy.type", 0)
profile.update_preferences()
desired = webdriver.DesiredCapabilities.FIREFOX
if name == 'nt':
return webdriver.Firefox(
profile, options=options,service_log_path='NUL',
executable_path=dosya('geckodriver.exe'), desired_capabilities=desired
)
return webdriver.Firefox(
profile, options=options,
service_log_path='/dev/null',desired_capabilities=desired
)

prompt_tema = styles.Style([
('qmark', 'fg:#5F819D bold'),
('question', 'fg:#289c64 bold'),
('answer', 'fg:#48b5b5 bg:#hidden bold'),
('pointer', 'fg:#48b5b5 bold'),
('highlighted', 'fg:#07d1e8'),
('selected', 'fg:#48b5b5 bg:black bold'),
('separator', 'fg:#6C6C6C'),
('instruction', 'fg:#77a371'),
('text', ''),
('disabled', 'fg:#858585 italic')
])
98 changes: 50 additions & 48 deletions turkanime_api/anime.py
Original file line number Diff line number Diff line change
@@ -1,61 +1,56 @@
from os import system,path,mkdir
from configparser import ConfigParser
from bs4 import BeautifulSoup as bs4
from rich.progress import Progress, BarColumn, SpinnerColumn

from .players import url_getir
from .compile import dosya,get_config

class AnimeSorgula():
def __init__(self,driver=None):
self.driver=driver
self.seri=None

def anime_ara(self, aranan_anime):
""" Animeyi arayıp sonuçları {title,slug,code} formatında döndürür. """
print(" "*50+"\rTürkanimeye bağlanılıyor..",end="\r")
self.driver.get(f"https://www.turkanime.net/arama?arama={aranan_anime}")
liste = []
if "/anime/" in self.driver.current_url:
liste.append({
"title" : self.driver.title,
"slug" : self.driver.current_url.split("anime/")[1],
"code" : self.driver.find_element_by_css_selector(".imaj img").get_attribute("data-src").split("serilerb/")[1][:-4]
})
return liste

for card in self.driver.find_elements_by_css_selector(".panel.panel-visible"):
liste.append({
"title" : card.find_element_by_class_name("panel-ust-ic").text,
"slug" : card.find_element_by_tag_name("a").get_attribute("href").split("anime/")[1],
"code" : card.find_element_by_tag_name("img").get_attribute("data-src").split("seriler/")[1][:-4]
})
return liste

def get_bolumler(self, anime_code):
""" Animenin bölümlerini (bölüm,title) formatında döndürür. """
print(" "*50+"\rBölümler yükleniyor..",end="\r")
raw = self.driver.execute_script(f"return $.get('https://www.turkanime.net/ajax/bolumler&animeId={anime_code}')")
soup = bs4(raw,"html.parser")
soup.findAll("a",{"title":"İzlediklerime Ekle"})

bolumler = []
for bolum in soup.findAll("span",{"class":"bolumAdi"}):
bolumler.append(
(bolum.text, bolum.findParent().get("href").split("video/")[1])
self.anime_ismi=None
self.tamliste=None

def get_seriler(self):
""" Sitedeki tüm animeleri [{name:*,value:*}..] formatında döndürür. """
with Progress(SpinnerColumn(), '[progress.description]{task.description}', BarColumn(bar_width=40)) as progress:
task = progress.add_task("[cyan]Anime listesi getiriliyor..", start=False)
if self.tamliste:
progress.update(task,visible=False)
return self.tamliste.keys()

soup = bs4(
self.driver.execute_script("return $.get('https://www.turkanime.net/ajax/tamliste')"),
"html.parser"
)
return bolumler

def listele(self,answers):
""" PyInquirer İçin Seçenek Listele """
# Bölümler
if 'anime_ismi' in answers:
results = self.get_bolumler(answers["anime_ismi"][1])
self.seri=answers["anime_ismi"][0]
return [{"name":title,"value":slug} for title,slug in results]

# Anime arama sonuçları
results = self.anime_ara(answers["anahtar_kelime"])
return [{"name":i["title"],"value":(i["slug"],i["code"])} for i in results]
raw_series, self.tamliste = soup.findAll('span',{"class":'animeAdi'}) , {}
for seri in raw_series:
self.tamliste[seri.text] = seri.findParent().get('href').split('anime/')[1]
progress.update(task,visible=False)
return [seri.text for seri in raw_series]

def get_bolumler(self, isim):
""" Animenin bölümlerini {bölüm,title} formatında döndürür. """
with Progress(SpinnerColumn(), '[progress.description]{task.description}', BarColumn(bar_width=40)) as progress:
task = progress.add_task("[cyan]Bölümler getiriliyor..", start=False)
anime_slug=self.tamliste[isim]
raw = self.driver.execute_script(f"return $.get('/anime/{anime_slug}')")
soup = bs4(raw,"html.parser")
self.anime_ismi = soup.title.text
anime_code = soup.find('meta',{'name':'twitter:image'}).get('content').split('lerb/')[1][:-4]

raw = self.driver.execute_script(f"return $.get('https://www.turkanime.net/ajax/bolumler&animeId={anime_code}')")
soup = bs4(raw,"html.parser")

bolumler = []
for bolum in soup.findAll("span",{"class":"bolumAdi"}):
bolumler.append({
'name':bolum.text,
'value':bolum.findParent().get("href").split("video/")[1]
})
progress.update(task,visible=False)
return bolumler


class Anime():
Expand Down Expand Up @@ -84,9 +79,16 @@ def indir(self):
return True

def oynat(self):
self.driver.get(f"https://turkanime.net/video/{self.bolumler}")
with Progress(SpinnerColumn(), '[progress.description]{task.description}', BarColumn(bar_width=40)) as progress:
task = progress.add_task("[cyan]Sayfa yükleniyor..", start=False)
self.driver.get(f"https://turkanime.net/video/{self.bolumler}")
progress.update(task,visible=False)
url = url_getir(self.driver)

if not url:
print("Çalışan bir video bulunamadı.")
return False

parser = ConfigParser()
parser.read(get_config())

Expand Down
Loading

0 comments on commit 2302369

Please sign in to comment.