Add support for Vine - closes #845
authorAnna Bernardi <anna.bernardi.9@gmail.com>
Sun, 19 May 2013 22:25:26 +0000 (00:25 +0200)
committerFilippo Valsorda <filippo.valsorda@gmail.com>
Sun, 19 May 2013 22:33:14 +0000 (00:33 +0200)
test/tests.json
youtube_dl/InfoExtractors.py

index 740f7756cf0c71443a0078074e19c616cf43cc93..19505155637adf9080815c54030b2212f55266ac 100644 (file)
       "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."
     }
+  },
+  {
+    "name": "Vine",
+    "url": "https://vine.co/v/b9KOOWX7HUx",
+    "file": "b9KOOWX7HUx.mp4",
+    "md5": "2f36fed6235b16da96ce9b4dc890940d",
+    "info_dict":{
+      "title":"Chicken."
+    }
   }
 ]
index 938d2d805d2e3ad8ca881677a8a2c18709ce3201..551969a2e75f5aa3f56a2a2db963dea9f25a17cd 100755 (executable)
@@ -4069,8 +4069,8 @@ class InaIE(InfoExtractor):
         }]
 
 class HowcastIE(InfoExtractor):
-    """Information Extractor for Ina.fr"""
-    _VALID_URL = r'(?:https?://)?(?:www\.)?howcast\.com/videos/(?P<id>[\d]+)'
+    """Information Extractor for Howcast.com"""
+    _VALID_URL = r'(?:https?://)?(?:www\.)?howcast\.com/videos/(?P<id>\d+)'
 
     def _real_extract(self, url):
         mobj = re.match(self._VALID_URL, url)
@@ -4104,6 +4104,35 @@ class HowcastIE(InfoExtractor):
             'description': video_description,
         }]
 
+class VineIE(InfoExtractor):
+    """Information Extractor for Vine.co"""
+    _VALID_URL = r'(?:https?://)?(?:www\.)?vine\.co/v/(?P<id>\w+)'
+
+    def _real_extract(self, url):
+
+        mobj = re.match(self._VALID_URL, url)
+
+        video_id = mobj.group('id')
+        webpage_url = 'https://vine.co/v/' + video_id
+        webpage = self._download_webpage(webpage_url, video_id)
+
+        mobj = re.search(r'<meta property="twitter:player:stream" content="([^"]+)"', webpage)
+        if mobj is None:
+            raise ExtractorError(u'Unable to extract video URL')
+        video_url = mobj.group(1)
+
+        mobj = re.search(r'<meta property="og:title" content="([^"]+)"', webpage)
+        if mobj is None:
+            raise ExtractorError(u'Unable to extract title')
+        video_title = mobj.group(1)
+
+        return [{
+            'id':       video_id,
+            'url':      video_url,
+            'ext':      'mp4',
+            'title':    video_title,
+        }]
+
 def gen_extractors():
     """ Return a list of an instance of every supported extractor.
     The order does matter; the first extractor matched is the one handling the URL.
@@ -4162,6 +4191,7 @@ def gen_extractors():
         RedTubeIE(),
         InaIE(),
         HowcastIE(),
+        VineIE(),
         GenericIE()
     ]