Browse Source

[Mixcloud] Harmonize ID generation from lists with full ID generation (#27787)

Mixcloud IDs are generated as `username_slug` when the full ID dict has been
downloaded.  When downloading a list (e.g. uploads, favorites, ...), the temporary
ID is just the `slug`.  This made e.g. archive file usage require the download
of stream metadata before the download can be rejected as already downloaded.

This commit attempts to get the uploader username during the GraphQL query, so the
temporary IDs are generated similarly.
Aarni Koskela 4 years ago
parent
commit
7c2d18a13f
1 changed files with 9 additions and 2 deletions
  1. 9 2
      youtube_dl/extractor/mixcloud.py

+ 9 - 2
youtube_dl/extractor/mixcloud.py

@@ -251,8 +251,13 @@ class MixcloudPlaylistBaseIE(MixcloudBaseIE):
                 cloudcast_url = cloudcast.get('url')
                 cloudcast_url = cloudcast.get('url')
                 if not cloudcast_url:
                 if not cloudcast_url:
                     continue
                     continue
+                video_id = cloudcast.get('slug')
+                if video_id:
+                    owner_username = try_get(cloudcast, lambda x: x['owner']['username'], compat_str)
+                    if owner_username:
+                        video_id = '%s_%s' % (owner_username, video_id)
                 entries.append(self.url_result(
                 entries.append(self.url_result(
-                    cloudcast_url, MixcloudIE.ie_key(), cloudcast.get('slug')))
+                    cloudcast_url, MixcloudIE.ie_key(), video_id))
 
 
             page_info = items['pageInfo']
             page_info = items['pageInfo']
             has_next_page = page_info['hasNextPage']
             has_next_page = page_info['hasNextPage']
@@ -321,7 +326,8 @@ class MixcloudUserIE(MixcloudPlaylistBaseIE):
     _DESCRIPTION_KEY = 'biog'
     _DESCRIPTION_KEY = 'biog'
     _ROOT_TYPE = 'user'
     _ROOT_TYPE = 'user'
     _NODE_TEMPLATE = '''slug
     _NODE_TEMPLATE = '''slug
-          url'''
+          url
+          owner { username }'''
 
 
     def _get_playlist_title(self, title, slug):
     def _get_playlist_title(self, title, slug):
         return '%s (%s)' % (title, slug)
         return '%s (%s)' % (title, slug)
@@ -345,6 +351,7 @@ class MixcloudPlaylistIE(MixcloudPlaylistBaseIE):
     _NODE_TEMPLATE = '''cloudcast {
     _NODE_TEMPLATE = '''cloudcast {
             slug
             slug
             url
             url
+            owner { username }
           }'''
           }'''
 
 
     def _get_cloudcast(self, node):
     def _get_cloudcast(self, node):