Fixed torrent, added test and doc
This commit is contained in:
parent
6076574150
commit
94eabab02d
5 changed files with 89 additions and 62 deletions
|
@ -17,3 +17,4 @@ Contents:
|
||||||
ext/api.ext.dc
|
ext/api.ext.dc
|
||||||
ext/api.ext.podcast
|
ext/api.ext.podcast
|
||||||
ext/api.ext.podcast_entry
|
ext/api.ext.podcast_entry
|
||||||
|
ext/api.ext.torrent
|
||||||
|
|
7
doc/ext/api.ext.torrent.rst
Normal file
7
doc/ext/api.ext.torrent.rst
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
.. raw:: html
|
||||||
|
|
||||||
|
<div class="apititle"><b>Contents</b></div>
|
||||||
|
<div class="apitoc"></div>
|
||||||
|
|
||||||
|
.. automodule:: feedgen.ext.torrent
|
||||||
|
:members:
|
|
@ -26,8 +26,9 @@ if __name__ == '__main__':
|
||||||
if len(sys.argv) != 2 or not (
|
if len(sys.argv) != 2 or not (
|
||||||
sys.argv[1].endswith('rss') \
|
sys.argv[1].endswith('rss') \
|
||||||
or sys.argv[1].endswith('atom') \
|
or sys.argv[1].endswith('atom') \
|
||||||
|
or sys.argv[1].endswith('torrent') \
|
||||||
or sys.argv[1].endswith('podcast') ):
|
or sys.argv[1].endswith('podcast') ):
|
||||||
print_enc ('Usage: %s ( <file>.atom | atom | <file>.rss | rss | podcast )' % \
|
print_enc ('Usage: %s ( <file>.atom | atom | <file>.rss | rss | podcast | torrent )' % \
|
||||||
'python -m feedgen')
|
'python -m feedgen')
|
||||||
print_enc ('')
|
print_enc ('')
|
||||||
print_enc (' atom -- Generate ATOM test output and print it to stdout.')
|
print_enc (' atom -- Generate ATOM test output and print it to stdout.')
|
||||||
|
@ -39,6 +40,7 @@ if __name__ == '__main__':
|
||||||
print_enc (' dc.rss -- Generate DC extension test output (rss format) and print it to stdout.')
|
print_enc (' dc.rss -- Generate DC extension test output (rss format) and print it to stdout.')
|
||||||
print_enc (' syndication.atom -- Generate DC extension test output (atom format) and print it to stdout.')
|
print_enc (' syndication.atom -- Generate DC extension test output (atom format) and print it to stdout.')
|
||||||
print_enc (' syndication.rss -- Generate DC extension test output (rss format) and print it to stdout.')
|
print_enc (' syndication.rss -- Generate DC extension test output (rss format) and print it to stdout.')
|
||||||
|
print_enc (' torrent -- Generate Torrent test output and print it to stdout.')
|
||||||
print_enc ('')
|
print_enc ('')
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
|
@ -90,6 +92,17 @@ if __name__ == '__main__':
|
||||||
'Verba tu fingas et ea dicas, quae non sentias?')
|
'Verba tu fingas et ea dicas, quae non sentias?')
|
||||||
fe.podcast.itunes_author('Lars Kiesow')
|
fe.podcast.itunes_author('Lars Kiesow')
|
||||||
print_enc (fg.rss_str(pretty=True))
|
print_enc (fg.rss_str(pretty=True))
|
||||||
|
|
||||||
|
elif arg == 'torrent':
|
||||||
|
fg.load_extension('torrent')
|
||||||
|
fe.link( href='http://somewhere.behind.the.sea/torrent/debian-8.4.0-i386-netint.iso.torrent', rel='alternate', type='application/x-bittorrent, length=1000' )
|
||||||
|
fe.torrent.filename('debian-8.4.0-i386-netint.iso.torrent')
|
||||||
|
fe.torrent.infohash('7661229811ef32014879ceedcdf4a48f256c88ba')
|
||||||
|
fe.torrent.contentlength('331350016')
|
||||||
|
fe.torrent.seeds('789')
|
||||||
|
fe.torrent.peers('456')
|
||||||
|
fe.torrent.verified('123')
|
||||||
|
print_enc (fg.rss_str(pretty=True))
|
||||||
|
|
||||||
elif arg.startswith('dc.'):
|
elif arg.startswith('dc.'):
|
||||||
fg.load_extension('dc')
|
fg.load_extension('dc')
|
||||||
|
|
|
@ -18,8 +18,6 @@ TORRENT_NS = 'http://xmlns.ezrss.it/0.1/dtd/'
|
||||||
class TorrentExtension(BaseExtension):
|
class TorrentExtension(BaseExtension):
|
||||||
'''FeedGenerator extension for torrent feeds.
|
'''FeedGenerator extension for torrent feeds.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def extend_ns(self):
|
def extend_ns(self):
|
||||||
return {'torrent' : TORRENT_NS}
|
return {'torrent' : TORRENT_NS}
|
||||||
|
|
||||||
|
@ -27,50 +25,48 @@ class TorrentExtension(BaseExtension):
|
||||||
class TorrentEntryExtension(BaseEntryExtension):
|
class TorrentEntryExtension(BaseEntryExtension):
|
||||||
'''FeedEntry extention for torrent feeds
|
'''FeedEntry extention for torrent feeds
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.__torrent_filename = None
|
self.__torrent_filename = None
|
||||||
self.__torrent_url = None
|
self.__torrent_infohash = None
|
||||||
self.__torrent_hash = None
|
self.__torrent_contentlength = None
|
||||||
self.__torrent_length = None
|
self.__torrent_seeds = None
|
||||||
self.__torrent_contentlength = None
|
self.__torrent_peers = None
|
||||||
|
self.__torrent=verified = None
|
||||||
|
|
||||||
|
|
||||||
def extend_rss(self, entry):
|
def extend_rss(self, entry):
|
||||||
'''Add additional fields to an RSS item.
|
'''Add additional fields to an RSS item.
|
||||||
|
|
||||||
:param feed: The RSS item XML element to use.
|
:param feed: The RSS item XML element to use.
|
||||||
'''
|
'''
|
||||||
enclosure = etree.SubElement(entry, '{%s}enclosure' % TORRENT_NS)
|
|
||||||
guid = etree.SubElement(entry, '{%s}guid' % TORRENT_NS)
|
|
||||||
torrent = etree.SubElement(entry, '{%s}torrent' % TORRENT_NS)
|
|
||||||
|
|
||||||
enclosure.attrib['type'] = 'application/x-bittorrent'
|
|
||||||
|
|
||||||
if self.__torrent_url:
|
|
||||||
enclosure.attrib['url'] = self.__torrent_url
|
|
||||||
guid.text = self.__torrent_url
|
|
||||||
|
|
||||||
if self.__torrent_filename:
|
if self.__torrent_filename:
|
||||||
torrent_filename = etree.SubElement(torrent, '{%s}filename' % TORRENT_NS)
|
filename = etree.SubElement(entry, '{%s}filename' % TORRENT_NS)
|
||||||
torrent_filename.text = self.__torrent_filename
|
filename.text = self.__torrent_filename
|
||||||
|
|
||||||
if self.__torrent_length:
|
|
||||||
enclosure.attrib['length'] = self.__torrent_length
|
|
||||||
|
|
||||||
if self.__torrent_contentlength:
|
if self.__torrent_contentlength:
|
||||||
torrent_length = etree.SubElement(torrent, '{%s}contentlength' % TORRENT_NS)
|
contentlength = etree.SubElement(entry, '{%s}contentlength' % TORRENT_NS)
|
||||||
torrent_length.text = self.__torrent_contentlength
|
contentlength.text = self.__torrent_contentlength
|
||||||
|
|
||||||
if self.__torrent_hash:
|
if self.__torrent_infohash:
|
||||||
torrent_hash = etree.SubElement(torrent, '{%s}infohash' % TORRENT_NS)
|
infohash = etree.SubElement(entry, '{%s}infohash' % TORRENT_NS)
|
||||||
torrent_hash.text = self.__torrent_hash
|
infohash.text = self.__torrent_infohash
|
||||||
torrent_magnet = etree.SubElement(torrent, '{%s}magneturi' % TORRENT_NS)
|
magnet = etree.SubElement(entry, '{%s}magneturi' % TORRENT_NS)
|
||||||
torrent_magnet.text = 'magnet:?xt=urn:btih:' + self.__torrent_hash
|
magnet.text = 'magnet:?xt=urn:btih:' + self.__torrent_infohash
|
||||||
|
|
||||||
|
if self.__torrent_seeds:
|
||||||
|
seeds = etree.SubElement(entry, '{%s}seed' % TORRENT_NS)
|
||||||
|
seeds.text = self.__torrent_seeds
|
||||||
|
|
||||||
|
if self.__torrent_peers:
|
||||||
|
peers = etree.SubElement(entry, '{%s}peers' % TORRENT_NS)
|
||||||
|
peers.text = self.__torrent_peers
|
||||||
|
|
||||||
|
if self.__torrent_seeds:
|
||||||
|
verified = etree.SubElement(entry, '{%s}verified' % TORRENT_NS)
|
||||||
|
verified.text = self.__torrent_verified
|
||||||
|
|
||||||
|
|
||||||
def torrent_filename(self, torrent_filename=None):
|
def filename(self, torrent_filename=None):
|
||||||
'''Get or set the name of the torrent file.
|
'''Get or set the name of the torrent file.
|
||||||
|
|
||||||
:param torrent_filename: The name of the torrent file.
|
:param torrent_filename: The name of the torrent file.
|
||||||
|
@ -80,37 +76,17 @@ class TorrentEntryExtension(BaseEntryExtension):
|
||||||
self.__torrent_filename = torrent_filename
|
self.__torrent_filename = torrent_filename
|
||||||
return self.__torrent_filename
|
return self.__torrent_filename
|
||||||
|
|
||||||
def torrent_url (self, torrent_url=None):
|
def infohash (self, torrent_infohash=None):
|
||||||
'''Get or set the URL of the torrent.
|
|
||||||
|
|
||||||
:param torrent_url: The torrent URL.
|
|
||||||
:returns: The torrent URL.
|
|
||||||
'''
|
|
||||||
if not torrent_url is None:
|
|
||||||
self.__torrent_url = torrent_url
|
|
||||||
return self.__torrent_url
|
|
||||||
|
|
||||||
def torrent_hash (self, torrent_hash=None):
|
|
||||||
'''Get or set the hash of the target file.
|
'''Get or set the hash of the target file.
|
||||||
|
|
||||||
:param torrent_url: The target file hash.
|
:param torrent_infohash: The target file hash.
|
||||||
:returns: The target hash file.
|
:returns: The target hash file.
|
||||||
'''
|
'''
|
||||||
if not torrent_hash is None:
|
if not torrent_infohash is None:
|
||||||
self.__torrent_hash = torrent_hash
|
self.__torrent_infohash = torrent_infohash
|
||||||
return self.__torrent_hash
|
return self.__torrent_infohash
|
||||||
|
|
||||||
def torrent_length (self, torrent_length=None):
|
def contentlength (self, torrent_contentlength=None):
|
||||||
'''Get or set the size of the torrent file.
|
|
||||||
|
|
||||||
:param torrent_length: The torrent size.
|
|
||||||
:returns: The torrent size.
|
|
||||||
'''
|
|
||||||
if not torrent_length is None:
|
|
||||||
self.__torrent_length = torrent_length
|
|
||||||
return self.__torrent_length
|
|
||||||
|
|
||||||
def torrent_contentlength (self, torrent_contentlength=None):
|
|
||||||
'''Get or set the size of the target file.
|
'''Get or set the size of the target file.
|
||||||
|
|
||||||
:param torrent_contentlength: The target file size.
|
:param torrent_contentlength: The target file size.
|
||||||
|
@ -119,3 +95,33 @@ class TorrentEntryExtension(BaseEntryExtension):
|
||||||
if not torrent_contentlength is None:
|
if not torrent_contentlength is None:
|
||||||
self.__torrent_contentlength = torrent_contentlength
|
self.__torrent_contentlength = torrent_contentlength
|
||||||
return self.__torrent_contentlength
|
return self.__torrent_contentlength
|
||||||
|
|
||||||
|
def seeds (self, torrent_seeds=None):
|
||||||
|
'''Get or set the number of seeds.
|
||||||
|
|
||||||
|
:param torrent_seeds: The seeds number.
|
||||||
|
:returns: The seeds number.
|
||||||
|
'''
|
||||||
|
if not torrent_seeds is None:
|
||||||
|
self.__torrent_seeds = torrent_seeds
|
||||||
|
return self.__torrent_seeds
|
||||||
|
|
||||||
|
def peers (self, torrent_peers=None):
|
||||||
|
'''Get or set the number od peers
|
||||||
|
|
||||||
|
:param torrent_infohash: The peers number.
|
||||||
|
:returns: The peers number.
|
||||||
|
'''
|
||||||
|
if not torrent_peers is None:
|
||||||
|
self.__torrent_peers = torrent_peers
|
||||||
|
return self.__torrent_peers
|
||||||
|
|
||||||
|
def verified (self, torrent_verified=None):
|
||||||
|
'''Get or set the number of verified peers.
|
||||||
|
|
||||||
|
:param torrent_infohash: The verified peers number.
|
||||||
|
:returns: The verified peers number.
|
||||||
|
'''
|
||||||
|
if not torrent_verified is None:
|
||||||
|
self.__torrent_verified = torrent_verified
|
||||||
|
return self.__torrent_verified
|
||||||
|
|
4
setup.py
4
setup.py
|
@ -8,11 +8,11 @@ setup(
|
||||||
name = 'feedgen',
|
name = 'feedgen',
|
||||||
packages = ['feedgen', 'feedgen/ext'],
|
packages = ['feedgen', 'feedgen/ext'],
|
||||||
version = feedgen.version.version_full_str,
|
version = feedgen.version.version_full_str,
|
||||||
description = 'Feed Generator (ATOM, RSS, Podcasts)',
|
description = 'Feed Generator (ATOM, RSS, Podcasts, torrent)',
|
||||||
author = 'Lars Kiesow',
|
author = 'Lars Kiesow',
|
||||||
author_email = 'lkiesow@uos.de',
|
author_email = 'lkiesow@uos.de',
|
||||||
url = 'http://lkiesow.github.io/python-feedgen',
|
url = 'http://lkiesow.github.io/python-feedgen',
|
||||||
keywords = ['feed','ATOM','RSS','podcast'],
|
keywords = ['feed','ATOM','RSS','podcast','torrent'],
|
||||||
license = 'FreeBSD and LGPLv3+',
|
license = 'FreeBSD and LGPLv3+',
|
||||||
install_requires = ['lxml', 'dateutils'],
|
install_requires = ['lxml', 'dateutils'],
|
||||||
classifiers = [
|
classifiers = [
|
||||||
|
|
Loading…
Reference in a new issue