diff --git a/test/tests.json b/test/tests.json index 0a9052f9dd41..740f7756cf0c 100644 --- a/test/tests.json +++ b/test/tests.json @@ -441,5 +441,15 @@ "title": "Obama Celebrates Iraq Victory" }, "skip": "Requires rtmpdump" + }, + { + "name": "Howcast", + "url": "http://www.howcast.com/videos/390161-How-to-Tie-a-Square-Knot-Properly", + "file": "390161.mp4", + "md5": "1d7ba54e2c9d7dc6935ef39e00529138", + "info_dict":{ + "title":"How to Tie a Square Knot Properly", + "description":"The square knot, also known as the reef knot, is one of the oldest, most basic knots to tie, and can be used in many different ways. Here's the proper way to tie a square knot." + } } ] diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index 112d97a8691a..938d2d805d2e 100755 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -4041,7 +4041,7 @@ class RedTubeIE(InfoExtractor): class InaIE(InfoExtractor): """Information Extractor for Ina.fr""" - _VALID_URL = r'(?:http://)?(?:www.)?ina\.fr/video/(?PI[0-9]+)/.*' + _VALID_URL = r'(?:http://)?(?:www\.)?ina\.fr/video/(?PI[0-9]+)/.*' def _real_extract(self,url): mobj = re.match(self._VALID_URL, url) @@ -4068,6 +4068,42 @@ class InaIE(InfoExtractor): 'title': video_title, }] +class HowcastIE(InfoExtractor): + """Information Extractor for Ina.fr""" + _VALID_URL = r'(?:https?://)?(?:www\.)?howcast\.com/videos/(?P[\d]+)' + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + + video_id = mobj.group('id') + webpage_url = 'http://www.howcast.com/videos/' + video_id + webpage = self._download_webpage(webpage_url, video_id) + + mobj = re.search(r'\'file\': "(http://mobile-media\.howcast\.com/\d+\.mp4)"', webpage) + if mobj is None: + raise ExtractorError(u'Unable to extract video URL') + video_url = mobj.group(1) + + mobj = re.search(r'