summaryrefslogtreecommitdiffstats
path: root/BitTorrent/GetTorrent.py
diff options
context:
space:
mode:
Diffstat (limited to 'BitTorrent/GetTorrent.py')
-rw-r--r--BitTorrent/GetTorrent.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/BitTorrent/GetTorrent.py b/BitTorrent/GetTorrent.py
new file mode 100644
index 0000000..a69651c
--- /dev/null
+++ b/BitTorrent/GetTorrent.py
@@ -0,0 +1,94 @@
+# 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 Chisholm
+
+import os
+import re
+import zurllib
+from bencode import bdecode
+from BitTorrent.platform import get_cache_dir
+
+urlpat = re.compile('^\w+://')
+urlpat_torrent = re.compile('^torrent://')
+urlpat_bittorrent = re.compile('^bittorrent://')
+
+def get_quietly(arg):
+ (data, errors) = get(arg)
+ # 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)
+ if errors:
+ cache = get_cache_dir()
+ if (cache is not None) and (cache in arg):
+ errors = []
+ return data, errors
+
+def get(arg):
+ data = None
+ errors = []
+ if os.access(arg, os.F_OK):
+ data, errors = get_file(arg)
+ elif urlpat.match(arg):
+ data, errors = get_url(arg)
+ else:
+ errors.append(_("Could not read %s") % arg)
+ return data, errors
+
+
+def get_url(url):
+ data = None
+ errors = []
+ err_str = _("Could not download or open \n%s\n"
+ "Try using a web browser to download the torrent file.") % url
+ 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()
+ b = bdecode(data)
+ except Exception, e:
+ if u is not None:
+ u.close()
+ errors.append(err_str + "\n(%s)" % e)
+ data = None
+ else:
+ if u is not None:
+ u.close()
+
+ return data, errors
+
+
+def get_file(filename):
+ data = None
+ errors = []
+ f = None
+ try:
+ f = file(filename, 'rb')
+ data = f.read()
+ f.close()
+ except Exception, e:
+ if f is not None:
+ f.close()
+ errors.append((_("Could not read %s") % filename) + (': %s' % str(e)))
+
+ return data, errors