Пример #1
0
 def analyze_program_page(code, page):
     try:
         data = Tving.get_vod_list(Tving.config['program_param'] % code, page=int(page))
         return {'url_type': 'program', 'page':page, 'code':code, 'data' : data}
         
     except Exception as e: 
         logger.error('Exception:%s', e)
         logger.error(traceback.format_exc())        
Пример #2
0
    def analyze(url):
        try:
            logger.debug('analyze :%s', url)
            url_type = None
            code = None
            if url.startswith('http'):
                match = re.compile(r'player\/(?P<code>E\d+)').search(url)
                if match:
                    url_type = 'episode'
                    code = match.group('code')
            else:
                if url.startswith('E'):
                    url_type = 'episode'
                    code = url
                elif url.startswith('P'):
                    url_type = 'program'
                    code = url.strip()
                elif url.startswith('M'):
                    url_type = 'movie'
                    code = url.strip()
                else:
                    pass
            logger.debug('Analyze %s %s', url_type, code)
            ModelSetting.set('recent_code', code)
            if url_type is None:
                return {'url_type':'None'}
            elif url_type == 'episode':
                quality = ModelSetting.get('quality')
                quality = Tving.get_quality_to_tving(quality)
                data, vod_url = TvingBasic.get_episode_json(code, quality)
                logger.debug(vod_url)
                if data is not None:
                    episode = Episode('basic')
                    episode = TvingBasic.make_episode_by_json(episode, data, vod_url)
                    TvingBasic.current_episode = episode
                    return {'url_type': url_type, 'ret' : True, 'data' : episode.as_dict()}
                else:
                    return {'url_type': url_type, 'ret' : False, 'data' : data}
            elif url_type == 'program':
                data = Tving.get_vod_list(Tving.config['program_param'] % code, page=1)
                return {'url_type': url_type, 'page':'1', 'code':code, 'data' : data}
            elif url_type == 'movie':
                proxy_url = ModelSetting.get('proxy_url') if ModelSetting.get_bool('use_proxy') else None
                data = Tving.get_movie_json(code, ModelSetting.get('device_id'), proxy_url, ModelSetting.get('token'))

                
                return {'url_type': url_type, 'page':'1', 'code':code, 'data' : data}

        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())        
Пример #3
0
    def scheduler_function():
        try:
            #logger.debug('start scheduler_function')
            import ffmpeg
            page = ModelSetting.get_int('auto_page')
            max_pf_count = ModelSetting.get('max_pf_count')
            save_path = ModelSetting.get('auto_save_path')
            default_quality = Tving.get_quality_to_tving(ModelSetting.get('auto_quality'))
            retry_user_abort = ModelSetting.get_bool('retry_user_abort')
            except_channel = ModelSetting.get('except_channel')
            except_program = ModelSetting.get(key='except_program')
            download_qvod = ModelSetting.get_bool('download_qvod')
            download_program_in_qvod = ModelSetting.get('download_program_in_qvod')
            download_mode = ModelSetting.get(key='download_mode')
            whitelist_program = ModelSetting.get('whitelist_program')
            whitelist_first_episode_download = ModelSetting.get_bool('whitelist_first_episode_download')

            except_channels = [x.strip() for x in except_channel.replace('\n', ',').split(',')]
            except_programs = [x.strip().replace(' ', '') for x in except_program.replace('\n', ',').split(',')]
            download_program_in_qvods = [x.strip().replace(' ', '') for x in download_program_in_qvod.replace('\n', ',').split(',')]
            whitelist_programs = [x.strip().replace(' ', '') for x in whitelist_program.replace('\n', ',').split(',')]
            
            except_channels = Util.get_list_except_empty(except_channels)
            except_programs = Util.get_list_except_empty(except_programs)
            download_program_in_qvods = Util.get_list_except_empty(download_program_in_qvods)
            whitelist_programs = Util.get_list_except_empty(whitelist_programs)
            logger.debug('except_channels:%s', except_channels)
            logger.debug('except_programs:%s', except_programs)
            logger.debug('download_qvod :%s %s', download_qvod, type(download_qvod))
            logger.debug('download_program_in_qvods:%s', download_program_in_qvods)
            for i in range(1, page+1):
                vod_list = Tving.get_vod_list(page=i)["body"]["result"]
                for vod in vod_list:
                    try:
                        if not scheduler.is_include('tving_recent'):
                            logger.debug('not in scheduler')
                            return
                        code = vod["episode"]["code"]
                        with db.session.no_autoflush:
                            # 2019-01-11 720권한만 있을 때 1080p를 받으려고 하면 계속 episode를 생성
                            #episode = db.session.query(Episode).filter_by(episode_code=code, quality=default_quality).with_for_update().first() 
                            #episode = db.session.query(Episode).filter_by(episode_code=code).with_for_update().first()
                            
                            # 2020-02-14 qvod episode_code 고정
                            episode = db.session.query(Episode).filter_by(episode_code=code, broadcast_date=str(vod["episode"]["broadcast_date"])[2:]).with_for_update().first()

                            if episode is not None:
                                logger.debug('program_name:%s frequency:%s %s %s', episode.program_name, episode.frequency, episode.user_abort, episode.retry)
                                if episode.completed:
                                    logger.debug('COMPLETED')
                                    continue
                                elif episode.user_abort:
                                    if retry_user_abort:
                                        episode.user_abort = False
                                    else:
                                        continue
                                elif episode.etc_abort > 10:
                                    # 1:알수없는이유 시작실패, 2 타임오버, 3, 강제스톱.킬
                                    # 12:제외채널, 13:제외프로그램
                                    # 14:화이트리스트
                                    # 9 : retry
                                    # 8 : qvod
                                    logger.debug('ETC ABORT:%s', episode.etc_abort)
                                    continue
                                elif episode.retry > 20:
                                    logger.debug('retry 20')
                                    episode.etc_abort = 15
                                    continue
                            # URL때문에 DB에 있어도 다시 JSON을 받아야함.
                            json_data, url = TvingBasic.get_episode_json(code, default_quality)
                            if episode is None:
                                logger.debug('EPISODE is none')
                                episode = Episode('auto')
                                episode = TvingBasic.make_episode_by_json(episode, json_data, url)
                                db.session.add(episode)
                            else:
                                episode = TvingBasic.make_episode_by_json(episode, json_data, url)

                            # qvod 체크
                            is_qvod = False
                            if url.find('quickvod') != -1:
                                is_qvod = True
                            
                            # 채널, 프로그램 체크
                            flag_download = True
                            if is_qvod:
                                if not download_qvod:
                                    flag_download = False
                                    for program_name in download_program_in_qvods:
                                        if episode.program_name.replace(' ', '').find(program_name) != -1:
                                            episode.etc_abort = 0
                                            flag_download = True
                                            logger.debug('is qvod.. %s %s', program_name, flag_download)
                                            break
                                    
                                    if not flag_download:
                                        episode.etc_abort = 8
                                        db.session.commit()
                                        logger.debug('is qvod.. pass')
                                        continue

                            if download_mode == '0':
                                for program_name in except_programs:
                                    if episode.program_name.replace(' ', '').find(program_name) != -1:
                                        episode.etc_abort = 13
                                        flag_download = False
                                        break

                                if episode.channel_name in except_channels:
                                    episode.etc_abort = 12
                                    flag_download = False
                            else:
                                if flag_download: #무조건 탐
                                    find_in_whitelist = False
                                    for program_name in whitelist_programs:
                                        if episode.program_name.replace(' ', '').find(program_name) != -1:
                                            find_in_whitelist = True
                                            break
                                    if not find_in_whitelist:
                                        episode.etc_abort = 14
                                        flag_download = False
                                if not flag_download and whitelist_first_episode_download and episode.frequency == 1:
                                    flag_download = True
                            if flag_download:
                                episode.etc_abort = 0
                                episode.retry += 1
                                episode.pf = 0 # 재시도
                                episode.save_path = save_path
                                episode.start_time = datetime.now()
                                db.session.commit()
                            else:
                                db.session.commit()
                                time.sleep(2)
                                continue

                            logger.debug('FFMPEG Start.. id:%s', episode.id)
                            if episode.id is None:
                                logger.debug('PROGRAM:%s', episode.program_name)
                            
                            f = ffmpeg.Ffmpeg(url, episode.filename, plugin_id=episode.id, listener=TvingBasic.ffmpeg_listener, max_pf_count=max_pf_count, call_plugin='%s_recent' % package_name, save_path=save_path)
                            f.start_and_wait()
                    except Exception as e: 
                        logger.error('Exception:%s', e)
                        logger.error(traceback.format_exc())
                   
                    
                    #break
            #logger.debug('end scheduler_function')
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Пример #4
0
    def make_vod_m3u(cls):
        try:
            from lxml import etree as ET
            from system.model import ModelSetting as SystemModelSetting

            data = "#EXTM3U\n"
            root = ET.Element('tv')
            root.set('generator-info-name', "wavve")
            form = '#EXTINF:-1 tvg-id="{contentid}" tvg-name="{title}" tvh-chno="{channel_number}" tvg-logo="{logo}" group-title="티빙 최신 VOD",{title}\n{url}\n'
            ch_number = 1
            for page in range(1, ModelSetting.get_int('tving_vod_page') + 1):
                vod_list = Tving.get_vod_list(page=page)["body"]["result"]
                for vod in vod_list:
                    #logger.debug(vod)
                    code = vod["vod_code"]
                    title = vod['vod_name']['ko']
                    try:
                        logo = 'http://image.tving.com%s' % (
                            vod['fgram']['image'][0]['url'])
                    except:
                        logo = ''
                    video_url = '%s/%s/tving/api/streaming.m3u8?contentid=%s' % (
                        SystemModelSetting.get('ddns'), package_name, code)
                    if SystemModelSetting.get_bool('auth_use_apikey'):
                        video_url += '&apikey=%s' % SystemModelSetting.get(
                            'auth_apikey')
                    data += form.format(contentid=code,
                                        title=title,
                                        channel_number=ch_number,
                                        logo=logo,
                                        url=video_url)

                    channel_tag = ET.SubElement(root, 'channel')
                    channel_tag.set('id', code)
                    #channel_tag.set('repeat-programs', 'true')

                    display_name_tag = ET.SubElement(channel_tag,
                                                     'display-name')
                    display_name_tag.text = '%s(%s)' % (title, ch_number)
                    display_name_tag = ET.SubElement(channel_tag,
                                                     'display-number')
                    display_name_tag.text = str(ch_number)

                    duration = vod['episode']['duration']
                    datetime_start = datetime.now()
                    for i in range(3):
                        datetime_stop = datetime_start + timedelta(
                            seconds=duration + 1)
                        program_tag = ET.SubElement(root, 'programme')
                        program_tag.set(
                            'start',
                            datetime_start.strftime('%Y%m%d%H%M%S') + ' +0900')
                        program_tag.set(
                            'stop',
                            datetime_stop.strftime('%Y%m%d%H%M%S') + ' +0900')
                        program_tag.set('channel', code)
                        datetime_start = datetime_stop

                        #program_tag.set('video-src', video_url)
                        #program_tag.set('video-type', 'HTTP_PROGRESSIVE')

                        title_tag = ET.SubElement(program_tag, 'title')
                        title_tag.set('lang', 'ko')
                        title_tag.text = title

                        icon_tag = ET.SubElement(program_tag, 'icon')
                        icon_tag.set('src', logo)
                        if 'synopsis' in vod['episode']:
                            desc_tag = ET.SubElement(program_tag, 'desc')
                            desc_tag.set('lang', 'ko')
                            desc_tag.text = vod['episode']['synopsis']['ko']
                    channel_tag = None
                    program_tag = None

                    ch_number += 1

            tree = ET.ElementTree(root)
            ret = ET.tostring(root,
                              pretty_print=True,
                              xml_declaration=True,
                              encoding="utf-8")
            return data, ret
        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Пример #5
0
 def analyze(url):
     try:
         logger.debug('analyze :%s', url)
         url_type = None
         code = None
         match = re.compile(r'(?P<code>[EMP]\d+)').search(url)
         if match:
             code = match.group('code')
             if code.startswith('E'):
                 url_type = 'episode'
             elif code.startswith('P'):
                 url_type = 'program'
             elif code.startswith('M'):
                 url_type = 'movie'
         logger.debug('Analyze %s %s', url_type, code)
         if url_type is None:
             return {'url_type': 'None'}
         elif url_type == 'episode':
             quality = ModelSetting.get('quality')
             quality = Tving.get_quality_to_tving(quality)
             try:
                 data, vod_url = TvingBasic.get_episode_json(code, quality)
             except TypeError as e:
                 data, vod_url = None, None
             logger.debug(vod_url)
             if data is not None:
                 episode = Episode('basic')
                 episode = TvingBasic.make_episode_by_json(
                     episode, data, vod_url)
                 TvingBasic.current_episode = episode
                 return {
                     'url_type': url_type,
                     'ret': True,
                     'code': code,
                     'data': episode.as_dict()
                 }
             else:
                 return {
                     'url_type': url_type,
                     'ret': False,
                     'data': {
                         'message': '에피소드 정보를 얻지 못함'
                     }
                 }
         elif url_type == 'program':
             data = Tving.get_vod_list(Tving.config['program_param'] % code,
                                       page=1)
             return {
                 'url_type': url_type,
                 'page': '1',
                 'code': code,
                 'data': data
             }
         elif url_type == 'movie':
             data = Tving.get_movie_json(code)
             return {
                 'url_type': url_type,
                 'page': '1',
                 'code': code,
                 'data': data
             }
     except Exception as e:
         logger.error('Exception:%s', e)
         logger.error(traceback.format_exc())