@@ -91,16 +91,19 @@ def get_metadata(url):
9191class 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
161181class 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