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())
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())
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())
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())
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())