#!/usr/bin/python3 from sys import path path.append("..") from travnik import Torrent import inotify.adapters from threading import Thread from random import randrange from os import stat from time import sleep import libtorrent def random_file(torrent, save_path, endung=".flac"): def get_index_from_endung(chosen): for i in range(torrent.torrent_file().files().num_files()): if (torrent.torrent_file().files().file_path(i).endswith(endung)): if chosen == 0: return i break chosen -= 1 prios = [] for i in torrent.get_file_priorities(): prios.append(0) endungs = 0 for i in range(torrent.torrent_file().files().num_files()): if (torrent.torrent_file().files().file_path(i).endswith(endung)): endungs += 1 if endungs == 0: return False chosen = randrange(endungs) tries_left = endungs while True: if tries_left == 0: return False tries_left -= 1 try: stat(save_path + "/" + torrent.torrent_file().files().file_path(get_index_from_endung(chosen))) except FileNotFoundError: chosen = (chosen + 1) % endungs; break else: continue prios[get_index_from_endung(chosen)] = 4 torrent.prioritize_files(prios) print(f"random file {torrent.torrent_file().files().file_path(get_index_from_endung(chosen))} chosen to download") def watcher(session, torrents, d="/tmp/", s=".", active_torrents=10): i = inotify.adapters.Inotify() i.add_watch(d) for event in i.event_gen(yield_nones=False): (_, type_names, path, filename) = event if "IN_CLOSE_WRITE" in type_names and filename.endswith(".torrent"): t = Torrent() t.file(path + filename) for pth, size in t.paths(): if pth[-1].endswith(b'.flac'): info = libtorrent.torrent_info(path + filename) torr = session.add_torrent({"ti": info, "save_path": s}) random_file(torr, save_path=s); torrents.append(torr) if len(torrents) > active_torrents: session.remove_torrent(torrents[0]) del torrents[0] break def alerts(session): while True: session.wait_for_alert(86400*1000*21) for a in session.pop_alerts(): if a.category() & libtorrent.alert.category_t.error_notification: print(f"error notification alert from libtorrent: {a}") if type(a) == libtorrent.file_completed_alert: print(f"file completed alert: {a}") if type(a) in [libtorrent.external_ip_alert, libtorrent.listen_succeeded_alert, libtorrent.dht_get_peers_alert, libtorrent.dht_outgoing_get_peers_alert, libtorrent.dht_reply_alert, libtorrent.torrent_added_alert, libtorrent.state_changed_alert, libtorrent.torrent_resumed_alert, libtorrent.stats_alert, libtorrent.torrent_checked_alert, libtorrent.peer_connect_alert, libtorrent.alert, libtorrent.peer_disconnected_alert, libtorrent.incoming_connection_alert, libtorrent.block_downloading_alert, libtorrent.dht_bootstrap_alert, libtorrent.dht_announce_alert, libtorrent.block_finished_alert, libtorrent.piece_finished_alert, libtorrent.peer_unsnubbed_alert, libtorrent.peer_snubbed_alert, libtorrent.portmap_error_alert]: continue print(f"{type(a)} | {a}") def progress(session, torrents): while True: for torr in torrents: s = torr.status() print(torr.torrent_file().name() + '\t%.2f%% complete (down: %.1f kB/s up: %.1f kB/s peers: %d) %s' % (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, s.num_peers, s.state)) sleep(1) if __name__ == "__main__": session = libtorrent.session({"alert_mask": libtorrent.alert.category_t.all_categories}); torrents = [] w = Thread(target=watcher, args=(session, torrents)) a = Thread(target=alerts, args=(session,)) p = Thread(target=progress, args=(session, torrents)) w.start() a.start() p.start() w.join() a.join() p.join()