diff options
| author | Chih-Hsuan Yen <yan12125@gmail.com> | 2018-03-11 22:25:30 +0800 | 
|---|---|---|
| committer | Chih-Hsuan Yen <yan12125@gmail.com> | 2018-03-11 22:25:30 +0800 | 
| commit | 08250b69c29f8fc3bb73c6461363472197a86f03 (patch) | |
| tree | ceeadb2889c2c6bac2c08b33ab2146e3a247fdee | |
| parent | d116918993c1de9b2bfabf98b2af236263f86137 (diff) | |
[line] Add support for tv.line.me (closes #9427)
| -rw-r--r-- | ChangeLog | 6 | ||||
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/line.py | 90 | 
3 files changed, 97 insertions, 0 deletions
@@ -1,3 +1,9 @@ +version <unreleased> + +Extractors ++ [line] Add support for tv.line.me (#9427) + +  version 2018.03.10  Core diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index bef3b82ee..6d6ae89f8 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -550,6 +550,7 @@ from .limelight import (      LimelightChannelIE,      LimelightChannelListIE,  ) +from .line import LineTVIE  from .litv import LiTVIE  from .liveleak import (      LiveLeakIE, diff --git a/youtube_dl/extractor/line.py b/youtube_dl/extractor/line.py new file mode 100644 index 000000000..8414312fc --- /dev/null +++ b/youtube_dl/extractor/line.py @@ -0,0 +1,90 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import js_to_json + + +class LineTVIE(InfoExtractor): +    _VALID_URL = r'https?://tv\.line\.me/v/(?P<id>\d+)_[^/]+-(?P<segment>ep\d+-\d+)' + +    _TESTS = [{ +        'url': 'https://tv.line.me/v/793123_goodbye-mrblack-ep1-1/list/69246', +        'info_dict': { +            'id': '793123_ep1-1', +            'ext': 'mp4', +            'title': 'Goodbye Mr.Black | EP.1-1', +            'thumbnail': r're:^https?://.*\.jpg$', +            'duration': 998.509, +            'view_count': int, +        }, +    }, { +        'url': 'https://tv.line.me/v/2587507_%E6%B4%BE%E9%81%A3%E5%A5%B3%E9%86%ABx-ep1-02/list/185245', +        'only_matching': True, +    }] + +    def _real_extract(self, url): +        series_id, segment = re.match(self._VALID_URL, url).groups() +        video_id = '%s_%s' % (series_id, segment) + +        webpage = self._download_webpage(url, video_id) + +        player_params = self._parse_json(self._search_regex( +            r'naver\.WebPlayer\(({[^}]+})\)', webpage, 'player parameters'), +            video_id, transform_source=js_to_json) + +        video_info = self._download_json( +            'https://global-nvapis.line.me/linetv/rmcnmv/vod_play_videoInfo.json', +            video_id, query={ +                'videoId': player_params['videoId'], +                'key': player_params['key'], +            }) + +        stream = video_info['streams'][0] +        extra_query = '?__gda__=' + stream['key']['value'] +        formats = self._extract_m3u8_formats( +            stream['source'] + extra_query, video_id, ext='mp4', +            entry_protocol='m3u8_native', m3u8_id='hls') + +        for a_format in formats: +            a_format['url'] += extra_query + +        duration = None +        for video in video_info.get('videos', {}).get('list', []): +            encoding_option = video.get('encodingOption', {}) +            abr = video['bitrate']['audio'] +            vbr = video['bitrate']['video'] +            tbr = abr + vbr +            formats.append({ +                'url': video['source'], +                'format_id': 'http-%d' % int(tbr), +                'height': encoding_option.get('height'), +                'width': encoding_option.get('width'), +                'abr': abr, +                'vbr': vbr, +                'filesize': video.get('size'), +            }) +            if video.get('duration') and duration is None: +                duration = video['duration'] + +        self._sort_formats(formats) + +        if not formats[0].get('width'): +            formats[0]['vcodec'] = 'none' + +        title = self._og_search_title(webpage) + +        # like_count requires an additional API request https://tv.line.me/api/likeit/getCount +         +        return { +            'id': video_id, +            'title': title, +            'formats': formats, +            'extra_param_to_segment_url': extra_query[1:], +            'duration': duration, +            'thumbnails': [{'url': thumbnail['source']} +                           for thumbnail in video_info.get('thumbnails', {}).get('list', [])], +            'view_count': video_info.get('meta', {}).get('count'), +        }  | 
