mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[everyonesmixtape] Add support (Fixes #2161)
This commit is contained in:
		| @@ -148,7 +148,7 @@ def generator(test_case): | |||||||
|                     for key, value in info_dict.items() |                     for key, value in info_dict.items() | ||||||
|                     if value and key in ('title', 'description', 'uploader', 'upload_date', 'uploader_id', 'location')) |                     if value and key in ('title', 'description', 'uploader', 'upload_date', 'uploader_id', 'location')) | ||||||
|                 if not all(key in tc.get('info_dict', {}).keys() for key in test_info_dict.keys()): |                 if not all(key in tc.get('info_dict', {}).keys() for key in test_info_dict.keys()): | ||||||
|                     sys.stderr.write(u'\n"info_dict": ' + json.dumps(test_info_dict, ensure_ascii=False, indent=2) + u'\n') |                     sys.stderr.write(u'\n"info_dict": ' + json.dumps(test_info_dict, ensure_ascii=False, indent=4) + u'\n') | ||||||
|  |  | ||||||
|                 # Check for the presence of mandatory fields |                 # Check for the presence of mandatory fields | ||||||
|                 for key in ('id', 'url', 'title', 'ext'): |                 for key in ('id', 'url', 'title', 'ext'): | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ from youtube_dl.extractor import ( | |||||||
|     IviCompilationIE, |     IviCompilationIE, | ||||||
|     ImdbListIE, |     ImdbListIE, | ||||||
|     KhanAcademyIE, |     KhanAcademyIE, | ||||||
|  |     EveryonesMixtapeIE, | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -210,6 +211,15 @@ class TestPlaylists(unittest.TestCase): | |||||||
|         self.assertEqual(result['description'], 'How have humans protected their secret messages through history? What has changed today?') |         self.assertEqual(result['description'], 'How have humans protected their secret messages through history? What has changed today?') | ||||||
|         self.assertTrue(len(result['entries']) >= 3) |         self.assertTrue(len(result['entries']) >= 3) | ||||||
|  |  | ||||||
|  |     def test_EveryonesMixtape(self): | ||||||
|  |         dl = FakeYDL() | ||||||
|  |         ie = EveryonesMixtapeIE(dl) | ||||||
|  |         result = ie.extract('http://everyonesmixtape.com/#/mix/m7m0jJAbMQi') | ||||||
|  |         self.assertIsPlaylist(result) | ||||||
|  |         self.assertEqual(result['id'], 'm7m0jJAbMQi') | ||||||
|  |         self.assertEqual(result['title'], 'Driving') | ||||||
|  |         self.assertEqual(len(result['entries']), 24) | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
| @@ -52,6 +52,7 @@ from .ehow import EHowIE | |||||||
| from .eighttracks import EightTracksIE | from .eighttracks import EightTracksIE | ||||||
| from .eitb import EitbIE | from .eitb import EitbIE | ||||||
| from .escapist import EscapistIE | from .escapist import EscapistIE | ||||||
|  | from .everyonesmixtape import EveryonesMixtapeIE | ||||||
| from .exfm import ExfmIE | from .exfm import ExfmIE | ||||||
| from .extremetube import ExtremeTubeIE | from .extremetube import ExtremeTubeIE | ||||||
| from .facebook import FacebookIE | from .facebook import FacebookIE | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								youtube_dl/extractor/everyonesmixtape.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								youtube_dl/extractor/everyonesmixtape.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  | from ..utils import ( | ||||||
|  |     compat_urllib_request, | ||||||
|  |     ExtractorError, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class EveryonesMixtapeIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'https?://(?:www\.)?everyonesmixtape\.com/#/mix/(?P<id>[0-9a-zA-Z]+)(?:/(?P<songnr>[0-9]))?$' | ||||||
|  |  | ||||||
|  |     _TEST = { | ||||||
|  |         'url': 'http://everyonesmixtape.com/#/mix/m7m0jJAbMQi/5', | ||||||
|  |         'file': '5bfseWNmlds.mp4', | ||||||
|  |         "info_dict": { | ||||||
|  |             "title": "Passion Pit - \"Sleepyhead\" (Official Music Video)", | ||||||
|  |             "uploader": "FKR.TV", | ||||||
|  |             "uploader_id": "frenchkissrecords", | ||||||
|  |             "description": "Music video for \"Sleepyhead\" from Passion Pit's debut EP Chunk Of Change.\nBuy on iTunes: https://itunes.apple.com/us/album/chunk-of-change-ep/id300087641\n\nDirected by The Wilderness.\n\nhttp://www.passionpitmusic.com\nhttp://www.frenchkissrecords.com", | ||||||
|  |             "upload_date": "20081015" | ||||||
|  |         }, | ||||||
|  |         'params': { | ||||||
|  |             'skip_download': True,  # This is simply YouTube | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         mobj = re.match(self._VALID_URL, url) | ||||||
|  |         playlist_id = mobj.group('id') | ||||||
|  |  | ||||||
|  |         pllist_url = 'http://everyonesmixtape.com/mixtape.php?a=getMixes&u=-1&linked=%s&explore=' % playlist_id | ||||||
|  |         pllist_req = compat_urllib_request.Request(pllist_url) | ||||||
|  |         pllist_req.add_header('X-Requested-With', 'XMLHttpRequest') | ||||||
|  |  | ||||||
|  |         playlist_list = self._download_json( | ||||||
|  |             pllist_req, playlist_id, note='Downloading playlist metadata') | ||||||
|  |         try: | ||||||
|  |             playlist_no = next(playlist['id'] | ||||||
|  |                                for playlist in playlist_list | ||||||
|  |                                if playlist['code'] == playlist_id) | ||||||
|  |         except StopIteration: | ||||||
|  |             raise ExtractorError('Playlist id not found') | ||||||
|  |  | ||||||
|  |         pl_url = 'http://everyonesmixtape.com/mixtape.php?a=getMix&id=%s&userId=null&code=' % playlist_no | ||||||
|  |         pl_req = compat_urllib_request.Request(pl_url) | ||||||
|  |         pl_req.add_header('X-Requested-With', 'XMLHttpRequest') | ||||||
|  |         playlist = self._download_json( | ||||||
|  |             pl_req, playlist_id, note='Downloading playlist info') | ||||||
|  |  | ||||||
|  |         entries = [{ | ||||||
|  |             '_type': 'url', | ||||||
|  |             'url': t['url'], | ||||||
|  |             'title': t['title'], | ||||||
|  |         } for t in playlist['tracks']] | ||||||
|  |  | ||||||
|  |         if mobj.group('songnr'): | ||||||
|  |             songnr = int(mobj.group('songnr')) - 1 | ||||||
|  |             return entries[songnr] | ||||||
|  |  | ||||||
|  |         playlist_title = playlist['mixData']['name'] | ||||||
|  |         return { | ||||||
|  |             '_type': 'playlist', | ||||||
|  |             'id': playlist_id, | ||||||
|  |             'title': playlist_title, | ||||||
|  |             'entries': entries, | ||||||
|  |         } | ||||||
| @@ -131,6 +131,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): | |||||||
|                      ( |                      ( | ||||||
|                          (?:https?://|//)?                                    # http(s):// or protocol-independent URL (optional) |                          (?:https?://|//)?                                    # http(s):// or protocol-independent URL (optional) | ||||||
|                          (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/| |                          (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/| | ||||||
|  |                             (?:www\.)?deturl\.com/www\.youtube\.com/| | ||||||
|  |                             (?:www\.)?pwnyoutube\.com| | ||||||
|                             tube\.majestyc\.net/| |                             tube\.majestyc\.net/| | ||||||
|                             youtube\.googleapis\.com/)                        # the various hostnames, with wildcard subdomains |                             youtube\.googleapis\.com/)                        # the various hostnames, with wildcard subdomains | ||||||
|                          (?:.*?\#/)?                                          # handle anchor (#/) redirect urls |                          (?:.*?\#/)?                                          # handle anchor (#/) redirect urls | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister