Пример #1
0
    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)
Пример #2
0
 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)
Пример #3
0
 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'))
Пример #6
0
 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')
     )
Пример #8
0
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')
Пример #9
0
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')
Пример #10
0
def loads(bytes_object: bytes) -> Types:
    try:
        return better_bencode.loads(bytes_object)
    except Exception as exc:
        raise BencodeDecodingError(exc)
Пример #11
0
def decode(data: typing.ByteString) -> Message:
    try:
        return better_bencode.loads(data)
    except Exception as exc:
        raise DecodeError(exc)
Пример #12
0
def decode(bytes_object: bytes) -> Any:
    try:
        return better_bencode.loads(bytes_object)
    except Exception as e:
        raise BencoderError(e)
Пример #13
0
 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)
Пример #14
0
 def torrent_object(self):
     return better_bencode.loads(self.raw_torrent)