|  | @@ -0,0 +1,51 @@
 | 
		
	
		
			
			|  | 1 | +#! /usr/bin/env python
 | 
		
	
		
			
			|  | 2 | +
 | 
		
	
		
			
			|  | 3 | +import requests
 | 
		
	
		
			
			|  | 4 | +import time
 | 
		
	
		
			
			|  | 5 | +import hashlib
 | 
		
	
		
			
			|  | 6 | +import bencode
 | 
		
	
		
			
			|  | 7 | +
 | 
		
	
		
			
			|  | 8 | +class TorrentTracker:
 | 
		
	
		
			
			|  | 9 | +    torrent = None
 | 
		
	
		
			
			|  | 10 | +    session = None
 | 
		
	
		
			
			|  | 11 | +    peer_id = ""
 | 
		
	
		
			
			|  | 12 | +    port = 0
 | 
		
	
		
			
			|  | 13 | +    user_agent = ""
 | 
		
	
		
			
			|  | 14 | +    interval = 300
 | 
		
	
		
			
			|  | 15 | +    def __init__(self, torrent, port=6882, user_agent="rtorrent/0.8.42/0.12.42"):
 | 
		
	
		
			
			|  | 16 | +        self.torrent = torrent
 | 
		
	
		
			
			|  | 17 | +        self.session = requests.session()
 | 
		
	
		
			
			|  | 18 | +        self.peer_id = hashlib.sha1(str(time.time())).digest()
 | 
		
	
		
			
			|  | 19 | +        self.port = port
 | 
		
	
		
			
			|  | 20 | +        self.user_agent = user_agent
 | 
		
	
		
			
			|  | 21 | +
 | 
		
	
		
			
			|  | 22 | +    def getInterval(self):
 | 
		
	
		
			
			|  | 23 | +        return self.interval
 | 
		
	
		
			
			|  | 24 | +
 | 
		
	
		
			
			|  | 25 | +    def request(self, uploaded, downloaded, left, event=""):
 | 
		
	
		
			
			|  | 26 | +        params = {"info_hash": self.torrent.getHash().digest(),
 | 
		
	
		
			
			|  | 27 | +                "peer_id": self.peer_id,
 | 
		
	
		
			
			|  | 28 | +                "port": self.port,
 | 
		
	
		
			
			|  | 29 | +                "uploaded": uploaded,
 | 
		
	
		
			
			|  | 30 | +                "downloaded": downloaded,
 | 
		
	
		
			
			|  | 31 | +                "left": left,
 | 
		
	
		
			
			|  | 32 | +                "event": event}
 | 
		
	
		
			
			|  | 33 | +        headers = {"User-Agent": self.user_agent}
 | 
		
	
		
			
			|  | 34 | +        r = self.session.get(self.torrent.getTracker(), headers=headers, params=params)
 | 
		
	
		
			
			|  | 35 | +        data = bencode.bdecode(r.content)
 | 
		
	
		
			
			|  | 36 | +        if 'interval' in data:
 | 
		
	
		
			
			|  | 37 | +            self.interval = int(data['interval'])
 | 
		
	
		
			
			|  | 38 | +        return data;
 | 
		
	
		
			
			|  | 39 | +
 | 
		
	
		
			
			|  | 40 | +    def start(self):
 | 
		
	
		
			
			|  | 41 | +        return self.request(0, 0, 0, "started")
 | 
		
	
		
			
			|  | 42 | +
 | 
		
	
		
			
			|  | 43 | +    def stop(self):
 | 
		
	
		
			
			|  | 44 | +        return self.request(0, 0, 0, "stopped")
 | 
		
	
		
			
			|  | 45 | +
 | 
		
	
		
			
			|  | 46 | +    def complete(self):
 | 
		
	
		
			
			|  | 47 | +        return self.request(0, 0, 0, "completed")
 | 
		
	
		
			
			|  | 48 | +
 | 
		
	
		
			
			|  | 49 | +    def interval(self, uploaded, downloaded, left):
 | 
		
	
		
			
			|  | 50 | +        return self.request(uploaded, downloaded, left)
 | 
		
	
		
			
			|  | 51 | +
 |