def datagram_received(self, data, addr): try: msg = better_bencode.loads(data) except Exception as e: # (better_bencode.BencodeTypeError, better_bencode.BencodeValueError): logging.warning(f'{e}, {addr}, {data}') return if not isinstance(msg, dict): return try: self.handle_message(msg, addr) except ProtocolError: logging.warning(f'protocal error {addr} {msg}') self.send_message(data={ b"t": msg[b"t"], b"y": b"e", b"e": [203, b"Protocal Error"] }, addr=addr) except Exception as e: logging.warning(e, msg) self.send_message(data={ b"t": msg[b"t"], b"y": b"e", b"e": [202, b"Server Error"] }, addr=addr)
def add(self, raw_torrent): tinfo = better_bencode.loads(raw_torrent)[b"info"] if b"files" in tinfo: num_files = len(tinfo[b"files"]) else: num_files = 1 options = {b"file_priorities": [0] * num_files} self.client.call("core.add_torrent_file", None, base64.b64encode(raw_torrent), options)
def datagramReceived(self, data, addr): log.msg("Received %r from %s" % (data, addr)) cookie, res = data.split(' ', 1) msg = bencode.loads(res) df = self.cookies.pop(cookie) if df: df.callback(msg) else: log.err("Unknown cookie: %s" % cookie)
def __init__( self, torrent_entry_id: int, torrent_file: Union[bytes, memoryview, bytearray], ) -> None: # TODO: optimize self._inner = TorrentInfoUpdate( torrent_entry_id, better_bencode.dumps(better_bencode.loads(torrent_file)[b"info"]), )
def get(self, iid): """ Return a torrent adjusted correctly for webtorrents """ fs = download(iid, iid + '_archive.torrent').content t = better_bencode.loads(fs) # print(t) t[b'url-list'] = [b'https://api.archivelab.org/webtorrents/files/'] t[b'announce'] = b'wss://tracker.webtorrent.io' t[b'announce-list'] = [[b'wss://tracker.webtorrent.io'], [b'wss://tracker.btorrent.xyz'], [b'wss://tracker.fastcast.nz'], [b'wss://tracker.openwebtorrent.com']] return Response(better_bencode.dumps(t), mimetype=mimetype(iid + '_archive.torrent'))
def datagram_received(self, data, addr): try: msg = better_bencode.loads(data) except: return try: self.handle_message(msg, addr) except Exception as e: self.send_message(data={ b"t": msg[b"t"], b"y": b"e", b"e": [202, b"Server Error"] }, addr=addr) raise e
def get(self, iid): """ Return a torrent adjusted correctly for webtorrents """ fs = download(iid, iid + '_archive.torrent').content t = better_bencode.loads(fs) # print(t) t[b'url-list'] = [b'https://api.archivelab.org/v2/webtorrents/files/'] t[b'announce'] = b'wss://tracker.webtorrent.io' t[b'announce-list'] = [[b'wss://tracker.webtorrent.io'], [b'wss://tracker.btorrent.xyz'], [b'wss://tracker.fastcast.nz'], [b'wss://tracker.openwebtorrent.com']] return Response( better_bencode.dumps(t), mimetype=mimetype(iid + '_archive.torrent') )
async def torrent2magnet(chat, document): logger.info('torrent2magnet: session start [%d]', chat.sender['id']) try: torrent = await t2m_bot.get_file(document['file_id']) async with t2m_bot.download_file(torrent['file_path']) as resp: if resp.status == 200: try: metadata = better_bencode.loads(await resp.read()) if b'info' not in metadata: raise Exception('No `info` field in meta data') hashcontents = better_bencode.dumps(metadata[b'info']) digest = hashlib.sha1(hashcontents).digest() info_hash = binascii.hexlify(digest).decode('ascii') except Exception: logger.exception('torrent2magnet: Wrong meta data') await chat.send_text( 'Failed convert torrent file to magnet link ' '(wrong metadata). Sorry 😫') else: extra_params = {} if b'name' in metadata[b'info']: extra_params.update( {'dn': metadata[b'info'][b'name'].decode('ascii')}) if b'length' in metadata[b'info']: extra_params.update( {'xl': metadata[b'info'][b'length']}) if b'announce' in metadata: extra_params.update( {'tr': metadata[b'announce'].decode('ascii')}) ep = '' if extra_params: ep = '&' + urllib.parse.urlencode(extra_params) await chat.send_text('magnet:?xt=urn:btih:%s%s' % (info_hash, ep)) else: raise RuntimeError('HTTP error [status={}]'.format( resp.status)) except Exception: await chat.send_text('Failed convert torrent file to magnet. Sorry 😫') logger.exception('torrent2magnet: unhandled error')
async def torrent2magnet(chat, document): logger.info('torrent2magnet: session start [%d]', chat.sender['id']) try: torrent = await t2m_bot.get_file(document['file_id']) async with t2m_bot.download_file(torrent['file_path']) as resp: if resp.status == 200: try: metadata = better_bencode.loads(await resp.read()) if b'info' not in metadata: raise Exception('No `info` field in meta data') hashcontents = better_bencode.dumps(metadata[b'info']) digest = hashlib.sha1(hashcontents).digest() info_hash = binascii.hexlify(digest).decode('ascii') except Exception: logger.exception('torrent2magnet: Wrong meta data') await chat.send_text('Failed convert torrent file to magnet link ' '(wrong metadata). Sorry 😫') else: extra_params = {} if b'name' in metadata[b'info']: extra_params.update({'dn': metadata[b'info'][b'name'].decode('ascii')}) if b'length' in metadata[b'info']: extra_params.update({'xl': metadata[b'info'][b'length']}) if b'announce' in metadata: extra_params.update({'tr': metadata[b'announce'].decode('ascii')}) ep = '' if extra_params: ep = '&' + urllib.parse.urlencode(extra_params) await chat.send_text('magnet:?xt=urn:btih:%s%s' % (info_hash, ep)) else: raise RuntimeError('HTTP error [status={}]'.format(resp.status)) except Exception: await chat.send_text('Failed convert torrent file to magnet. Sorry 😫') logger.exception('torrent2magnet: unhandled error')
def loads(bytes_object: bytes) -> Types: try: return better_bencode.loads(bytes_object) except Exception as exc: raise BencodeDecodingError(exc)
def decode(data: typing.ByteString) -> Message: try: return better_bencode.loads(data) except Exception as exc: raise DecodeError(exc)
def decode(bytes_object: bytes) -> Any: try: return better_bencode.loads(bytes_object) except Exception as e: raise BencoderError(e)
def __init__(self, torrent_entry_id: int, info: Union[bytes, memoryview, bytearray]) -> None: # TODO: optimize self._inner = ParsedTorrentInfoUpdate( better_bencode.loads(info), torrent_entry_id=torrent_entry_id)
def torrent_object(self): return better_bencode.loads(self.raw_torrent)