[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() | ||||
|                     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()): | ||||
|                     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 | ||||
|                 for key in ('id', 'url', 'title', 'ext'): | ||||
|   | ||||
| @@ -32,6 +32,7 @@ from youtube_dl.extractor import ( | ||||
|     IviCompilationIE, | ||||
|     ImdbListIE, | ||||
|     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.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__': | ||||
|     unittest.main() | ||||
|   | ||||
| @@ -52,6 +52,7 @@ from .ehow import EHowIE | ||||
| from .eighttracks import EightTracksIE | ||||
| from .eitb import EitbIE | ||||
| from .escapist import EscapistIE | ||||
| from .everyonesmixtape import EveryonesMixtapeIE | ||||
| from .exfm import ExfmIE | ||||
| from .extremetube import ExtremeTubeIE | ||||
| 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) | ||||
|                          (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/| | ||||
|                             (?:www\.)?deturl\.com/www\.youtube\.com/| | ||||
|                             (?:www\.)?pwnyoutube\.com| | ||||
|                             tube\.majestyc\.net/| | ||||
|                             youtube\.googleapis\.com/)                        # the various hostnames, with wildcard subdomains | ||||
|                          (?:.*?\#/)?                                          # handle anchor (#/) redirect urls | ||||
|   | ||||
		Reference in New Issue
	
	Block a user