161 lines
5.4 KiB
Python
161 lines
5.4 KiB
Python
import os
|
|
import re
|
|
import time
|
|
import requests
|
|
import json
|
|
import datetime
|
|
from bs4 import BeautifulSoup
|
|
|
|
SKRIPTIN_KANSIO = os.path.dirname(os.path.abspath(__file__))
|
|
LOKI_TIEDOSTO = os.path.join(SKRIPTIN_KANSIO, "ladatut_torrentit.txt")
|
|
JSON_TIEDOSTO = os.path.join(SKRIPTIN_KANSIO, "hakulista.json")
|
|
|
|
def lataa_kaikki_data():
|
|
oletus_data = {
|
|
"asetukset": {
|
|
"jackett_url": "http://192.168.1.40:9117",
|
|
"jackett_api_key": "",
|
|
"qbit_url": "http://172.16.0.1:8080",
|
|
"qbit_user": "admin",
|
|
"qbit_pass": ""
|
|
},
|
|
"indeksorit": ["knaben", "torrentgalaxyclone", "therarbg", "uindex"],
|
|
"hakukohteet": []
|
|
}
|
|
|
|
if os.path.exists(JSON_TIEDOSTO):
|
|
try:
|
|
with open(JSON_TIEDOSTO, "r", encoding="utf-8") as f:
|
|
data = json.load(f)
|
|
if "asetukset" not in data:
|
|
data["asetukset"] = oletus_data["asetukset"]
|
|
return data
|
|
except Exception as e:
|
|
print(f"Virhe JSON-luvussa: {e}")
|
|
|
|
tallenna_kaikki_data(oletus_data)
|
|
return oletus_data
|
|
|
|
def tallenna_kaikki_data(data):
|
|
with open(JSON_TIEDOSTO, "w", encoding="utf-8") as f:
|
|
json.dump(data, f, indent=4, ensure_ascii=False)
|
|
|
|
def lataa_jo_ladatut():
|
|
if os.path.exists(LOKI_TIEDOSTO):
|
|
with open(LOKI_TIEDOSTO, "r", encoding="utf-8") as f:
|
|
return set(line.strip() for line in f if line.strip())
|
|
return set()
|
|
|
|
def tallenna_lokiin(linkki):
|
|
with open(LOKI_TIEDOSTO, "a", encoding="utf-8") as f:
|
|
f.write(linkki + "\n")
|
|
|
|
def hae_jackettista(jackett_url, api_key, indeksori, hakusana):
|
|
url = f"{jackett_url}/api/v2.0/indexers/{indeksori}/results/torznab/api"
|
|
params = {"apikey": api_key, "t": "search", "q": hakusana}
|
|
try:
|
|
res = requests.get(url, params=params, timeout=15)
|
|
res.raise_for_status()
|
|
soup = BeautifulSoup(res.text, 'xml')
|
|
|
|
loydetyt = []
|
|
for item in soup.find_all('item'):
|
|
title = item.find('title')
|
|
title_text = title.text if title else ""
|
|
|
|
enclosure = item.find('enclosure', url=True)
|
|
linkki = enclosure['url'] if enclosure and enclosure['url'].startswith('magnet:') else None
|
|
if not linkki:
|
|
link_tag = item.find('link')
|
|
if link_tag and link_tag.text.startswith('magnet:'):
|
|
linkki = link_tag.text
|
|
|
|
if linkki and title_text:
|
|
loydetyt.append((title_text, linkki))
|
|
return loydetyt
|
|
except Exception as e:
|
|
print(f" [Jackett Virhe sivustolla {indeksori}] {e}")
|
|
return []
|
|
|
|
def qbit_lisaa_torrent_api_keylla(qbit_url, api_key, magnet_linkki, kategoria):
|
|
pohja_url = qbit_url.rstrip('/')
|
|
add_url = f"{pohja_url}/api/v2/torrents/add"
|
|
|
|
headers = {
|
|
"X-API-Key": api_key,
|
|
"Authorization": f"Bearer {api_key}",
|
|
"Referer": f"{pohja_url}/"
|
|
}
|
|
|
|
data = {
|
|
"urls": magnet_linkki,
|
|
"category": kategoria
|
|
}
|
|
|
|
try:
|
|
res = requests.post(add_url, data=data, headers=headers, timeout=10)
|
|
return res.status_code
|
|
except Exception as e:
|
|
print(f" [qBittorrent] Yhteysvirhe: {e}")
|
|
return 500
|
|
|
|
def tarkista_ja_lataa():
|
|
print(f"--- ALOITETAAN ERITELTY JACKETT & QBITTORRENT API-HAKU ({time.strftime('%Y-%m-%d %H:%M:%S')}) ---")
|
|
data = lataa_kaikki_data()
|
|
ladatut = lataa_jo_ladatut()
|
|
tanaan = datetime.datetime.now().weekday()
|
|
|
|
jackett_url = data["asetukset"].get("jackett_url", "")
|
|
api_key = data["asetukset"].get("jackett_api_key", "")
|
|
qbit_url = data["asetukset"].get("qbit_url", "")
|
|
qbit_api_key = data["asetukset"].get("qbit_pass", "")
|
|
|
|
indeksori_lista = data["indeksorit"]
|
|
hakulista = data["hakukohteet"]
|
|
|
|
if not api_key or not qbit_url or not qbit_api_key:
|
|
print(" [Virhe] Asetuksia puuttuu!")
|
|
return
|
|
|
|
for kohde in hakulista:
|
|
sallitut_paivat = kohde.get("paivat", [0, 1, 2, 3, 4, 5, 6])
|
|
if tanaan not in sallitut_paivat:
|
|
continue
|
|
|
|
haku = kohde["jackett_haku"]
|
|
hakusanat = haku.lower().split()
|
|
kategoria = kohde["kohdekansio"].strip()
|
|
|
|
kaikki_tulokset = []
|
|
for idx in indeksori_lista:
|
|
tulokset = hae_jackettista(jackett_url, api_key, idx, haku)
|
|
kaikki_tulokset.extend(tulokset)
|
|
|
|
uudet_kohteet = []
|
|
for nimi, linkki in list(set(kaikki_tulokset)):
|
|
if linkki in ladatut: continue
|
|
|
|
nimi_lower = nimi.lower()
|
|
viimeisin_indeksi = -1
|
|
loytyy_kaikki = True
|
|
|
|
for sana in hakusanat:
|
|
indeksi = nimi_lower.find(sana, viimeisin_indeksi + 1)
|
|
if indeksi == -1:
|
|
loytyy_kaikki = False
|
|
break
|
|
viimeisin_indeksi = indeksi
|
|
|
|
if loytyy_kaikki:
|
|
uudet_kohteet.append((nimi, linkki))
|
|
|
|
for nimi, linkki in uudet_kohteet:
|
|
status = qbit_lisaa_torrent_api_keylla(qbit_url, qbit_api_key, linkki, kategoria)
|
|
if status == 200 or status == 409:
|
|
tallenna_lokiin(linkki)
|
|
print(f" -> KÄSITELTY: {nimi}")
|
|
|
|
print("--- HAKUKIERROS VALMIS ---\n")
|
|
|
|
if __name__ == "__main__":
|
|
tarkista_ja_lataa() |