Skip to content

Commit 6c92847

Browse files
Merge pull request #28 from Keeper-of-the-Keys/soundcloud-optimize
Soundcloud optimize
2 parents 74acdf0 + f8195ab commit 6c92847

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

src/gpodder/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
# This metadata block gets parsed by setup.py - use single quotes only
5151
__tagline__ = 'Media and podcast aggregator'
5252
__author__ = 'Thomas Perl <[email protected]>'
53-
__version__ = '4.8.0'
54-
__date__ = '2019-10-31'
55-
__relname__ = 'Yoreh'
53+
__version__ = '4.9.0'
54+
__date__ = '2019-12-10'
55+
__relname__ = 'Tal'
5656
__copyright__ = '© 2005-2019 Thomas Perl and the gPodder Team'
5757
__license__ = 'ISC / GPLv3 or later'
5858
__url__ = 'http://gpodder.org/'

src/gpodder/plugins/soundcloud.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,19 @@ def get_metadata(url):
9191
class SoundcloudUser(object):
9292
def __init__(self, username):
9393
self.username = username
94+
self.cache = {}
9495

9596
def get_user_info(self):
9697
global CONSUMER_KEY
9798
key = ':'.join((self.username, 'user_info'))
9899

99-
json_url = 'https://api.soundcloud.com/users/%s.json?consumer_key=%s' % (self.username, CONSUMER_KEY)
100-
logger.debug('get_user_info url: %s', json_url)
101-
user_info = json.loads(util.urlopen(json_url).read().decode('utf-8'))
100+
if key not in self.cache:
101+
json_url = 'https://api.soundcloud.com/users/%s.json?consumer_key=%s' % (self.username, CONSUMER_KEY)
102+
logger.debug('get_user_info url: %s', json_url)
103+
user_info = json.loads(util.urlopen(json_url).read().decode('utf-8'))
104+
self.cache[key] = user_info
102105

103-
return user_info
106+
return self.cache[key]
104107

105108
def get_coverart(self):
106109
user_info = self.get_user_info()
@@ -114,7 +117,7 @@ def get_username(self):
114117
user_info = self.get_user_info()
115118
return user_info.get('username', None)
116119

117-
def get_tracks(self, feed):
120+
def get_tracks(self, feed, channel):
118121
"""Get a generator of tracks from a SC user
119122
120123
The generator will give you a dictionary for every
@@ -133,6 +136,15 @@ def get_tracks(self, feed):
133136
json_tracks = json.loads(util.urlopen(json_url).read().decode('utf-8'))
134137
tracks = [track for track in json_tracks if track['streamable'] or track['downloadable']]
135138

139+
self.cache['episodes'] = { episode.guid:
140+
{ "filesize": episode.file_size,
141+
"filetype": episode.mime_type,
142+
} for episode in channel.episodes
143+
}
144+
145+
read_from_cache = 0
146+
logger.debug('%d Episodes in database for Soundcloud:%s', len(self.cache['episodes']), self.username)
147+
136148
for track in tracks:
137149
# Prefer stream URL (MP3), fallback to download URL
138150
base_url = track.get('stream_url') if track['streamable'] else track.get('download_url')
@@ -142,9 +154,14 @@ def get_tracks(self, feed):
142154
logger.debug('Skipping track with no base_url')
143155
continue
144156

145-
logger.debug('track in tracks url: %s', url)
157+
track_guid = track.get('permalink', track.get('id'))
146158

147-
filesize, filetype, filename = get_metadata(url)
159+
if track_guid not in self.cache['episodes']:
160+
filesize, filetype, filename = get_metadata(url)
161+
else:
162+
filesize = self.cache['episodes'][track_guid]['filesize']
163+
filetype = self.cache['episodes'][track_guid]['filetype']
164+
read_from_cache += 1
148165

149166
yield {
150167
'title': track.get('title', track.get('permalink')) or ('Unknown track'),
@@ -153,10 +170,13 @@ def get_tracks(self, feed):
153170
'url': url,
154171
'file_size': int(filesize),
155172
'mime_type': filetype,
156-
'guid': track.get('permalink', track.get('id')),
173+
'guid': track_guid,
157174
'published': soundcloud_parsedate(track.get('created_at', None)),
175+
'total_time': int(track.get('duration') / 1000),
158176
}
159177

178+
logger.debug('Read %d episodes from %d cached episodes', read_from_cache, len(self.cache['episodes']))
179+
160180

161181
class SoundcloudFeed(object):
162182
def __init__(self, username):
@@ -191,7 +211,7 @@ def get_new_episodes(self, channel):
191211
return self._get_new_episodes(channel, 'tracks')
192212

193213
def _get_new_episodes(self, channel, track_type):
194-
tracks = [t for t in self.sc_user.get_tracks(track_type)]
214+
tracks = [t for t in self.sc_user.get_tracks(track_type, channel)]
195215

196216
existing_guids = [episode.guid for episode in channel.episodes]
197217
seen_guids = [track['guid'] for track in tracks]

0 commit comments

Comments
 (0)