[vimeo] Add an extractor for users (closes #1871)
This commit is contained in:
		@@ -106,6 +106,10 @@ class TestAllURLsMatching(unittest.TestCase):
 | 
			
		||||
        self.assertMatch(':colbertreport', ['ComedyCentralShows'])
 | 
			
		||||
        self.assertMatch(':cr', ['ComedyCentralShows'])
 | 
			
		||||
 | 
			
		||||
    def test_vimeo_matching(self):
 | 
			
		||||
        self.assertMatch('http://vimeo.com/channels/tributes', ['vimeo:channel'])
 | 
			
		||||
        self.assertMatch('http://vimeo.com/user7108434', ['vimeo:user'])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ from youtube_dl.extractor import (
 | 
			
		||||
    DailymotionPlaylistIE,
 | 
			
		||||
    DailymotionUserIE,
 | 
			
		||||
    VimeoChannelIE,
 | 
			
		||||
    VimeoUserIE,
 | 
			
		||||
    UstreamChannelIE,
 | 
			
		||||
    SoundcloudSetIE,
 | 
			
		||||
    SoundcloudUserIE,
 | 
			
		||||
@@ -54,6 +55,14 @@ class TestPlaylists(unittest.TestCase):
 | 
			
		||||
        self.assertEqual(result['title'], u'Vimeo Tributes')
 | 
			
		||||
        self.assertTrue(len(result['entries']) > 24)
 | 
			
		||||
 | 
			
		||||
    def test_vimeo_user(self):
 | 
			
		||||
        dl = FakeYDL()
 | 
			
		||||
        ie = VimeoUserIE(dl)
 | 
			
		||||
        result = ie.extract('http://vimeo.com/nkistudio/videos')
 | 
			
		||||
        self.assertIsPlaylist(result)
 | 
			
		||||
        self.assertEqual(result['title'], u'Nki')
 | 
			
		||||
        self.assertTrue(len(result['entries']) > 65)
 | 
			
		||||
 | 
			
		||||
    def test_ustream_channel(self):
 | 
			
		||||
        dl = FakeYDL()
 | 
			
		||||
        ie = UstreamChannelIE(dl)
 | 
			
		||||
 
 | 
			
		||||
@@ -159,7 +159,11 @@ from .viddler import ViddlerIE
 | 
			
		||||
from .videodetective import VideoDetectiveIE
 | 
			
		||||
from .videofyme import VideofyMeIE
 | 
			
		||||
from .videopremium import VideoPremiumIE
 | 
			
		||||
from .vimeo import VimeoIE, VimeoChannelIE
 | 
			
		||||
from .vimeo import (
 | 
			
		||||
    VimeoIE,
 | 
			
		||||
    VimeoChannelIE,
 | 
			
		||||
    VimeoUserIE,
 | 
			
		||||
)
 | 
			
		||||
from .vine import VineIE
 | 
			
		||||
from .viki import VikiIE
 | 
			
		||||
from .vk import VKIE
 | 
			
		||||
 
 | 
			
		||||
@@ -249,25 +249,46 @@ class VimeoChannelIE(InfoExtractor):
 | 
			
		||||
    IE_NAME = u'vimeo:channel'
 | 
			
		||||
    _VALID_URL = r'(?:https?://)?vimeo.\com/channels/(?P<id>[^/]+)'
 | 
			
		||||
    _MORE_PAGES_INDICATOR = r'<a.+?rel="next"'
 | 
			
		||||
    _TITLE_RE = r'<link rel="alternate"[^>]+?title="(.*?)"'
 | 
			
		||||
 | 
			
		||||
    def _real_extract(self, url):
 | 
			
		||||
        mobj = re.match(self._VALID_URL, url)
 | 
			
		||||
        channel_id =  mobj.group('id')
 | 
			
		||||
    def _extract_videos(self, list_id, base_url):
 | 
			
		||||
        video_ids = []
 | 
			
		||||
 | 
			
		||||
        for pagenum in itertools.count(1):
 | 
			
		||||
            webpage = self._download_webpage('http://vimeo.com/channels/%s/videos/page:%d' % (channel_id, pagenum),
 | 
			
		||||
                                             channel_id, u'Downloading page %s' % pagenum)
 | 
			
		||||
            webpage = self._download_webpage(
 | 
			
		||||
                '%s/videos/page:%d/' % (base_url, pagenum),list_id,
 | 
			
		||||
                u'Downloading page %s' % pagenum)
 | 
			
		||||
            video_ids.extend(re.findall(r'id="clip_(\d+?)"', webpage))
 | 
			
		||||
            if re.search(self._MORE_PAGES_INDICATOR, webpage, re.DOTALL) is None:
 | 
			
		||||
                break
 | 
			
		||||
 | 
			
		||||
        entries = [self.url_result('http://vimeo.com/%s' % video_id, 'Vimeo')
 | 
			
		||||
                   for video_id in video_ids]
 | 
			
		||||
        channel_title = self._html_search_regex(r'<a href="/channels/%s">(.*?)</a>' % channel_id,
 | 
			
		||||
                                                webpage, u'channel title')
 | 
			
		||||
        list_title = self._html_search_regex(self._TITLE_RE, webpage,
 | 
			
		||||
            u'list title')
 | 
			
		||||
        return {'_type': 'playlist',
 | 
			
		||||
                'id': channel_id,
 | 
			
		||||
                'title': channel_title,
 | 
			
		||||
                'id': list_id,
 | 
			
		||||
                'title': list_title,
 | 
			
		||||
                'entries': entries,
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
    def _real_extract(self, url):
 | 
			
		||||
        mobj = re.match(self._VALID_URL, url)
 | 
			
		||||
        channel_id =  mobj.group('id')
 | 
			
		||||
        return self._extract_videos(channel_id, 'http://vimeo.com/channels/%s' % channel_id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VimeoUserIE(VimeoChannelIE):
 | 
			
		||||
    IE_NAME = u'vimeo:user'
 | 
			
		||||
    _VALID_URL = r'(?:https?://)?vimeo.\com/(?P<name>[^/]+)'
 | 
			
		||||
    _TITLE_RE = r'<a[^>]+?class="user">([^<>]+?)</a>'
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def suitable(cls, url):
 | 
			
		||||
        if VimeoChannelIE.suitable(url) or VimeoIE.suitable(url):
 | 
			
		||||
            return False
 | 
			
		||||
        return super(VimeoUserIE, cls).suitable(url)
 | 
			
		||||
 | 
			
		||||
    def _real_extract(self, url):
 | 
			
		||||
        mobj = re.match(self._VALID_URL, url)
 | 
			
		||||
        name = mobj.group('name')
 | 
			
		||||
        return self._extract_videos(name, 'http://vimeo.com/%s' % name)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user