⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gettorrent.py

📁 bittorrent source by python. please enjoy
💻 PY
字号:
# The contents of this file are subject to the BitTorrent Open Source License# Version 1.1 (the License).  You may not copy or use this file, in either# source code or executable form, except in compliance with the License.  You# may obtain a copy of the License at http://www.bittorrent.com/license/.## Software distributed under the License is distributed on an AS IS basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License# for the specific language governing rights and limitations under the# License.# GetTorrent -- abstraction which can get a .torrent file from multiple# sources: local file, url, etc.# written by Matt Chisholmimport osimport refrom BitTorrent import zurllibfrom BitTorrent.translation import _from bencode import bdecode, bencodefrom BitTorrent.platform import get_cache_dirfrom BitTorrent.ConvertedMetainfo import ConvertedMetainfourlpat = re.compile('^\w+://')urlpat_torrent = re.compile('^torrent://')urlpat_bittorrent = re.compile('^bittorrent://')class GetTorrentException(Exception):    passclass UnknownArgument(GetTorrentException):    passclass URLException(GetTorrentException):    passclass FileException(GetTorrentException):    passclass MetainfoException(GetTorrentException):    passdef get_quietly(arg):    """Wrapper for GetTorrent.get() which works around an IE bug.  If    there's an error opening a file from the IE cache, act like we    simply didn't get a file (because we didn't).  This happens when    IE passes us a path to a file in its cache that has already been    deleted because it came from a website which set Pragma:No-Cache    on it.    """    try:        data = get(arg)    except FileException, e:        cache = get_cache_dir()         if (cache is not None) and (cache in unicode(e.args[0])):            data = None        else:            raise    return datadef _get(arg):    """Obtains the contents of the .torrent metainfo file either from       the local filesystem or from a remote server. 'arg' is either       a filename or an URL.       Returns data, the raw contents of the .torrent file. Any       exception raised while obtaining the .torrent file or parsing       its contents is caught and wrapped in one of the following       errors: GetTorrent.URLException, GetTorrent.FileException,       GetTorrent.MetainfoException, or GetTorrent.UnknownArgument.       (All have the base class GetTorrent.GetTorrentException)       """    data = None    arg_stripped = arg.strip()    if os.access(arg, os.F_OK):        data = get_file(arg)    elif urlpat.match(arg_stripped):        data = get_url(arg_stripped)    else:        raise UnknownArgument(_('Could not read "%s", it is neither a file nor a URL.') % arg)    return datadef get(arg):    """Obtains the contents of the .torrent metainfo file either from       the local filesystem or from a remote server. 'arg' is either       a filename or an URL.       Returns a ConvertedMetainfo object which is the parsed metainfo       from the contents of the .torrent file.  Any exception raised       while obtaining the .torrent file or parsing its contents is       caught and wrapped in one of the following errors:       GetTorrent.URLException, GetTorrent.FileException,        GetTorrent.MetainfoException, or GetTorrent.UnknownArgument.       (All have the base class GetTorrent.GetTorrentException)       """    data = _get(arg)    metainfo = None    try:        b = bdecode(data)        metainfo = ConvertedMetainfo(b)    except Exception, e:        raise MetainfoException(            (_('"%s" is not a valid torrent file (%s).') % (arg, unicode(e)))            )    return metainfodef get_url(url):    """Downloads the .torrent metainfo file specified by the passed       URL and returns data, the raw contents of the metainfo file.       Any exception raised while trying to obtain the metainfo file       is caught and GetTorrent.URLException is raised instead.       """    data = None    err_str = ((_('Could not download or open "%s"')% url) + '\n' +               _("Try using a web browser to download the torrent file."))    u = None    # pending protocol changes, convert:    #   torrent://http://path.to/file    # and:    #   bittorrent://http://path.to/file    # to:    #   http://path.to/file    url = urlpat_torrent.sub('', url)    url = urlpat_bittorrent.sub('', url)        try:        u = zurllib.urlopen(url)        data = u.read()        u.close()    except Exception, e:        if u is not None:            u.close()        raise URLException(err_str + "\n(%s)" % e)    else:        if u is not None:            u.close()    return data    def get_file(filename):    """Reads the .torrent metainfo file specified by the passed       filename and returns data, the raw contents of the metainfo file.       Any exception raised while trying to obtain the metainfo file is       caught and GetTorrent.FileException is raised instead.       """    data = None    f = None    try:        f = file(filename, 'rb')        data = f.read()        f.close()    except Exception, e:        if f is not None:            f.close()        raise FileException((_("Could not read %s") % filename) + (': %s' % unicode(e.args[0])))    return data

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -