git
This commit is contained in:
89
Seedbox/20 VypisObsahuTorrentFile.py
Normal file
89
Seedbox/20 VypisObsahuTorrentFile.py
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import pymysql
|
||||||
|
import bencodepy
|
||||||
|
|
||||||
|
# ===============================
|
||||||
|
# DB CONFIG
|
||||||
|
# ===============================
|
||||||
|
|
||||||
|
DB_CONFIG = dict(
|
||||||
|
host="192.168.1.50",
|
||||||
|
user="root",
|
||||||
|
password="Vlado9674+",
|
||||||
|
database="torrents",
|
||||||
|
charset="utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
LIMIT = 5 # kolik torrentů zobrazit
|
||||||
|
|
||||||
|
|
||||||
|
# ===============================
|
||||||
|
# TORRENT PARSER
|
||||||
|
# ===============================
|
||||||
|
|
||||||
|
def parse_torrent(blob):
|
||||||
|
data = bencodepy.decode(blob)
|
||||||
|
|
||||||
|
info = data[b'info']
|
||||||
|
|
||||||
|
files = []
|
||||||
|
|
||||||
|
# multi-file torrent
|
||||||
|
if b'files' in info:
|
||||||
|
for f in info[b'files']:
|
||||||
|
path = "/".join(p.decode(errors="ignore") for p in f[b'path'])
|
||||||
|
size = f[b'length']
|
||||||
|
files.append((path, size))
|
||||||
|
|
||||||
|
# single-file torrent
|
||||||
|
else:
|
||||||
|
name = info[b'name'].decode(errors="ignore")
|
||||||
|
size = info[b'length']
|
||||||
|
files.append((name, size))
|
||||||
|
|
||||||
|
return files
|
||||||
|
|
||||||
|
|
||||||
|
# ===============================
|
||||||
|
# MAIN
|
||||||
|
# ===============================
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
conn = pymysql.connect(**DB_CONFIG)
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
cur.execute(f"""
|
||||||
|
SELECT id, title_visible, qb_savepath, torrent_content
|
||||||
|
FROM torrents
|
||||||
|
WHERE torrent_content IS NOT NULL
|
||||||
|
LIMIT {LIMIT}
|
||||||
|
""")
|
||||||
|
rows = cur.fetchall()
|
||||||
|
|
||||||
|
for tid, title, savepath, blob in rows:
|
||||||
|
|
||||||
|
print("\n" + "="*80)
|
||||||
|
print(f"Torrent ID : {tid}")
|
||||||
|
print(f"Title : {title}")
|
||||||
|
print(f"Savepath : {savepath}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
files = parse_torrent(blob)
|
||||||
|
|
||||||
|
print(f"Files inside torrent: {len(files)}")
|
||||||
|
|
||||||
|
for path, size in files:
|
||||||
|
print(f" {size:>12} B {path}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("ERROR parsing torrent:", e)
|
||||||
|
|
||||||
|
cur.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
214
Seedbox/30 KontrolaCoJsmeStahliZUltraCC.py
Normal file
214
Seedbox/30 KontrolaCoJsmeStahliZUltraCC.py
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pymysql
|
||||||
|
import bencodepy
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
# =====================================
|
||||||
|
# CONFIG
|
||||||
|
# =====================================
|
||||||
|
|
||||||
|
ULTRACC_ROOT = r"\\tower\torrents\ultracc"
|
||||||
|
DRY_MODE = False
|
||||||
|
|
||||||
|
DB_CONFIG = dict(
|
||||||
|
host="192.168.1.50",
|
||||||
|
user="root",
|
||||||
|
password="Vlado9674+",
|
||||||
|
database="torrents",
|
||||||
|
charset="utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
# =====================================
|
||||||
|
# TORRENT PARSER
|
||||||
|
# =====================================
|
||||||
|
|
||||||
|
def parse_torrent(blob):
|
||||||
|
|
||||||
|
data = bencodepy.decode(blob)
|
||||||
|
info = data[b'info']
|
||||||
|
|
||||||
|
files = []
|
||||||
|
|
||||||
|
# multi file
|
||||||
|
if b'files' in info:
|
||||||
|
for f in info[b'files']:
|
||||||
|
rel_path = "/".join(p.decode(errors="ignore") for p in f[b'path'])
|
||||||
|
size = f[b'length']
|
||||||
|
files.append((rel_path, size))
|
||||||
|
multi = True
|
||||||
|
else:
|
||||||
|
name = info[b'name'].decode(errors="ignore")
|
||||||
|
size = info[b'length']
|
||||||
|
files.append((name, size))
|
||||||
|
multi = False
|
||||||
|
|
||||||
|
return files, multi
|
||||||
|
|
||||||
|
# =====================================
|
||||||
|
# BUILD FILESYSTEM INDEX
|
||||||
|
# =====================================
|
||||||
|
|
||||||
|
import pickle
|
||||||
|
import os
|
||||||
|
|
||||||
|
INDEX_FILE = r"U:\PycharmProjects\Torrents\fs_index_ultracc.pkl"
|
||||||
|
FORCE_REBUILD = False
|
||||||
|
|
||||||
|
|
||||||
|
def build_fs_index():
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# LOAD EXISTING INDEX
|
||||||
|
# ============================
|
||||||
|
|
||||||
|
if os.path.exists(INDEX_FILE) and not FORCE_REBUILD:
|
||||||
|
print("Načítám uložený filesystem index...")
|
||||||
|
|
||||||
|
with open(INDEX_FILE, "rb") as f:
|
||||||
|
index = pickle.load(f)
|
||||||
|
|
||||||
|
print(f"Načten index ({len(index)} klíčů)")
|
||||||
|
return index
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# BUILD NEW INDEX
|
||||||
|
# ============================
|
||||||
|
|
||||||
|
print("Indexuji filesystem...")
|
||||||
|
|
||||||
|
index = {}
|
||||||
|
pocet = 0
|
||||||
|
|
||||||
|
for root, _, files in os.walk(ULTRACC_ROOT):
|
||||||
|
for f in files:
|
||||||
|
full = os.path.join(root, f)
|
||||||
|
|
||||||
|
try:
|
||||||
|
size = os.path.getsize(full)
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
key = (f.lower(), size)
|
||||||
|
|
||||||
|
pocet += 1
|
||||||
|
if pocet % 100 == 0:
|
||||||
|
print(pocet)
|
||||||
|
|
||||||
|
index.setdefault(key, []).append(full)
|
||||||
|
|
||||||
|
print(f"Index obsahuje {len(index)} unikátních souborů")
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# SAVE INDEX
|
||||||
|
# ============================
|
||||||
|
|
||||||
|
print("Ukládám index na disk...")
|
||||||
|
|
||||||
|
with open(INDEX_FILE, "wb") as f:
|
||||||
|
pickle.dump(index, f, protocol=pickle.HIGHEST_PROTOCOL)
|
||||||
|
|
||||||
|
print("Index uložen")
|
||||||
|
|
||||||
|
return index
|
||||||
|
|
||||||
|
|
||||||
|
# =====================================
|
||||||
|
# VALIDACE ROOTU
|
||||||
|
# =====================================
|
||||||
|
|
||||||
|
def validate_root(root, torrent_files):
|
||||||
|
|
||||||
|
for rel_path, size in torrent_files:
|
||||||
|
|
||||||
|
check = os.path.join(root, rel_path.replace("/", os.sep))
|
||||||
|
|
||||||
|
if not os.path.exists(check):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
# =====================================
|
||||||
|
# MAIN
|
||||||
|
# =====================================
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
fs_index = build_fs_index()
|
||||||
|
|
||||||
|
conn = pymysql.connect(**DB_CONFIG)
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
cur.execute("""
|
||||||
|
SELECT id, torrent_content
|
||||||
|
FROM torrents
|
||||||
|
WHERE torrent_content IS NOT NULL and physical_exists=FALSE
|
||||||
|
""")
|
||||||
|
|
||||||
|
rows = cur.fetchall()
|
||||||
|
|
||||||
|
print(f"Torrentů ke kontrole: {len(rows)}")
|
||||||
|
|
||||||
|
success = 0
|
||||||
|
|
||||||
|
for tid, blob in tqdm(rows):
|
||||||
|
|
||||||
|
try:
|
||||||
|
torrent_files, multi = parse_torrent(blob)
|
||||||
|
|
||||||
|
# vezmeme největší soubor pro lookup
|
||||||
|
rel_path, size = max(torrent_files, key=lambda x: x[1])
|
||||||
|
fname = os.path.basename(rel_path).lower()
|
||||||
|
|
||||||
|
key = (fname, size)
|
||||||
|
|
||||||
|
if key not in fs_index:
|
||||||
|
continue
|
||||||
|
|
||||||
|
found = False
|
||||||
|
|
||||||
|
for full_path in fs_index[key]:
|
||||||
|
|
||||||
|
if multi:
|
||||||
|
# ROOT = odečtení relativní cesty
|
||||||
|
root = full_path[:-len(rel_path)]
|
||||||
|
root = root.rstrip("\\/")
|
||||||
|
else:
|
||||||
|
# single file
|
||||||
|
root = os.path.dirname(full_path)
|
||||||
|
|
||||||
|
if validate_root(root, torrent_files):
|
||||||
|
|
||||||
|
found = True
|
||||||
|
success += 1
|
||||||
|
|
||||||
|
print(f"[FOUND] Torrent {tid} → {root}")
|
||||||
|
|
||||||
|
if not DRY_MODE:
|
||||||
|
cur.execute("""
|
||||||
|
UPDATE torrents
|
||||||
|
SET physical_exists = 1
|
||||||
|
WHERE id = %s
|
||||||
|
""", (tid,))
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
if not found:
|
||||||
|
pass
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"ERROR torrent {tid}: {e}")
|
||||||
|
|
||||||
|
if not DRY_MODE:
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
print(f"Celkem nalezeno: {success}")
|
||||||
|
|
||||||
|
cur.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user