Skip to content

Commit

Permalink
Merge 34686bc into f126d6e
Browse files Browse the repository at this point in the history
  • Loading branch information
thcipriani committed Jan 8, 2018
2 parents f126d6e + 34686bc commit a592766
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
1 change: 1 addition & 0 deletions docs/conf.py
Expand Up @@ -12,6 +12,7 @@ def get_version(filename):
metadata = dict(findall(r"__([a-z]+)__ = '([^']+)'", f.read()))
return metadata['version']


project = 'Mopidy-Podcast'
copyright = '2014-2016 Thomas Kemmer'
version = get_version(b'../mopidy_podcast/__init__.py')
Expand Down
19 changes: 14 additions & 5 deletions mopidy_podcast/feeds.py
Expand Up @@ -30,6 +30,15 @@ def parse(source):
raise TypeError('Not a recognized podcast feed: %s', url)


def get_url(source, default=None):
"""
Get URL from xml.etree.ElementTree.Element.
URL is often capitalized in OPML feeds.
"""
return source.get('url', source.get('URL', default))


class PodcastFeed(object):

def __init__(self, url):
Expand Down Expand Up @@ -76,7 +85,7 @@ def __init__(self, url, root):
def getstreamuri(self, guid):
for item in self.__items:
if self.__guid(item) == guid:
return item.find('enclosure').get('url')
return get_url(item.find('enclosure'))
return None

def items(self, newest_first=False):
Expand Down Expand Up @@ -154,7 +163,7 @@ def __genre(cls, etree):

@classmethod
def __guid(cls, etree):
return etree.findtext('guid') or etree.find('enclosure').get('url')
return etree.findtext('guid') or get_url(etree.find('enclosure'))

@classmethod
def __image(cls, etree):
Expand Down Expand Up @@ -195,16 +204,16 @@ class OpmlFeed(PodcastFeed): # not really a "feed"
TYPES = {
'include': lambda e: models.Ref.directory(
name=e.get('text'),
uri=PodcastFeed.getfeeduri(e.get('url'))
uri=PodcastFeed.getfeeduri(get_url(e))
),
'link': lambda e: models.Ref(
type=(
models.Ref.DIRECTORY
if e.get('url').endswith('.opml')
if get_url(e).endswith('.opml')
else models.Ref.ALBUM
),
name=e.get('text'),
uri=PodcastFeed.getfeeduri(e.get('url'))
uri=PodcastFeed.getfeeduri(get_url(e))
),
'rss': lambda e: models.Ref.album(
name=e.get('title', e.get('text')),
Expand Down
21 changes: 21 additions & 0 deletions tests/test_feeds.py
Expand Up @@ -6,6 +6,11 @@

from mopidy_podcast import feeds

try:
import xml.etree.cElementTree as ElementTree
except ImportError:
import xml.etree.ElementTree as ElementTree


@pytest.mark.parametrize('filename,expected', [
('directory.xml', feeds.OpmlFeed),
Expand All @@ -17,3 +22,19 @@ def test_parse(abspath, filename, expected):
feed = feeds.parse(path)
assert isinstance(feed, expected)
assert feed.uri == uritools.uricompose('podcast+file', '', path)


def test_parse_uppercase_url():
xml = r'''<?xml version="1.0" encoding="utf-8" ?>
<opml version="1.1">
<head title="Podcasts">
<expansionState></expansionState>
</head>
<body>
<outline URL="http://example.com/" text="example" type="link" />
</body>
</opml>
'''
root = ElementTree.fromstring(xml)
feed = feeds.OpmlFeed('foo', root)
assert feed.items().next().uri == 'podcast+http://example.com/'

0 comments on commit a592766

Please sign in to comment.