premiere-deluge-plugin/premiere/core.py

72 lines
2.4 KiB
Python

from deluge.plugins.pluginbase import CorePluginBase
import deluge.component as component
from deluge.core.rpcserver import export
from twisted.internet.task import LoopingCall, deferLater
from twisted.internet import reactor
class Core(CorePluginBase):
def enable(self):
self.loop = None
self.premiere_torrents = {}
deferLater(reactor, 5, self.enable_loop)
def enable_loop(self):
self.loop = LoopingCall(self.premiere_loop)
self.loop.start(10)
def disable(self):
if self.loop and self.loop.running:
self.loop.stop()
def update(self):
pass
@export
def add_premiere_torrent(self, torr):
self.premiere_torrents[torr] = True
tor = component.get("TorrentManager").torrents[torr]
tor_handle = tor.handle
for i in range(1, tor_handle.get_torrent_info().num_pieces()+1):
tor_handle.set_piece_premiere(i, True)
tor.force_recheck()
@export
def del_premiere_torrent(self, torr):
if self.is_premiere_torrent(torr):
del self.premiere_torrents[torr]
tor = component.get("TorrentManager").torrents.get(torr)
if not tor:
return
tor_handle = tor.handle
for i in range(tor_handle.get_torrent_info().num_pieces()+1):
tor_handle.set_piece_premiere(i, False)
tor.force_recheck()
@export
def is_premiere_torrent(self, torr):
return torr in self.premiere_torrents
@export
def get_premiere_torrents(self):
return self.premiere_torrents
def premiere_loop(self):
torrents = self.get_premiere_torrents()
for t in torrents.keys():
tor = component.get("TorrentManager").torrents.get(t)
if not tor:
self.del_premiere_torrent(t)
continue
if tor.status.state == tor.status.seeding:
tor = tor.handle
if not tor.get_peer_info():
continue
if not all(len(p.pieces) > 0 and p.pieces[0] for p in tor.get_peer_info()):
tor.force_reannounce()
tor.set_piece_premiere(0, False)
for i in range(0, tor.get_torrent_info().num_pieces()+1):
if all(len(p.pieces) > i and p.pieces[i] for p in tor.get_peer_info()) and tor.is_piece_premiere(i+1):
tor.set_piece_premiere(i+1, False)