def process_telegram_data(self, data, target=None):
     try:
         ret = ModelBotDownloaderKtvItem.process_telegram_data(data)
         #logger.debug(ret)
         if ret is not None:
             if ModelSetting.get_bool('receive_info_send_telegram'):
                 msg = '😉 TV 정보 수신\n'
                 msg += '제목 : %s\n' % data['filename']
                 if ret is None:
                     msg += '중복 마그넷입니다.'
                     #TelegramHandle.sendMessage(msg)
                 else:
                     url = '%s/%s/api/%s/add_download?url=%s' % (SystemModelSetting.get('ddns'), package_name, self.name, ret.magnet)
                     if SystemModelSetting.get_bool('auth_use_apikey'):
                         url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')
                     if app.config['config']['is_sjva_server']:
                         msg += '\n' + ret.magnet + '\n'
                     else:
                         msg += '\n➕ 다운로드 추가\n<%s>\n' % url
                     try:
                         if ret.daum_id is not None:
                             url = 'https://search.daum.net/search?w=tv&q=%s&irk=%s&irt=tv-program&DA=TVP' % (urllib.quote(ret.daum_title.encode('utf8')), ret.daum_id)
                             msg += '\n● Daum 정보\n%s' % url
                     except Exception as e: 
                         logger.error('Exception:%s', e)
                         logger.error(traceback.format_exc())  
                 import framework.common.notify as Notify
                 Notify.send_message(msg, image_url=ret.daum_poster_url, message_id='bot_downloader_ktv_receive')
             self.invoke()
             TorrentProcess.receive_new_data(ret, package_name)
     except Exception, e:
             logger.error('Exception:%s', e)
             logger.error(traceback.format_exc())
Ejemplo n.º 2
0
 def process_telegram_data(data):
     try:
         logger.debug('receive data')
         logger.debug(data)
         type_list = ModelSetting.get('cache_save_type_list').split('|')
         type_list = Util.get_list_except_empty(type_list)
         if len(type_list) == 0 or data['t'] in type_list:
             ret = ModelOffcloud2Cache.add(data)
             if ret is not None:
                 logger.debug('Offcloud2 %s append' % ret.name)
                 if ModelSetting.get_bool(
                         'cache_receive_info_send_telegram'):
                     msg = '😉 Offcloud2 캐쉬 정보 수신\n'
                     msg += 'Type : %s\n' % data['t']
                     msg += '%s\n' % data['n']
                     from system.model import ModelSetting as SystemModelSetting
                     ddns = SystemModelSetting.get('ddns')
                     url = '%s/%s/api/cache_download?id=%s' % (
                         ddns, package_name, ret.id)
                     if SystemModelSetting.get_bool('auth_use_apikey'):
                         url += '&apikey=%s' % SystemModelSetting.get(
                             'auth_apikey')
                     msg += '➕ 리모트 다운로드 추가\n<%s>' % url
                     import framework.common.notify as Notify
                     Notify.send_message(
                         msg, message_id='offcloud2_cache_receive')
     except Exception as e:
         logger.error(e)
         logger.error(traceback.format_exc())
Ejemplo n.º 3
0
 def process_telegram_data(self, data, target=None):
     try:
         ret = ModelItem.process_telegram_data(data)
         logger.debug(data)
         #ret = None
         if ret is not None:
             if ModelSetting.get_bool('receive_send_notify'):
                 msg = '😉 AV 정보 수신\n'
                 msg += '제목 : [%s] %s (%s)\n' % (ret.code, ret.title, ret.date)
                 msg += '파일 : %s\n' % ret.filename
                 msg += '폴더 : %s\n' % ret.dirname
                 msg += '크기 : %s\n' % Util.sizeof_fmt(ret.total_size)
                 
                 url = '%s/%s/api/%s/add_download?id=%s' % (SystemModelSetting.get('ddns'), package_name, self.name, ret.id)
                 if SystemModelSetting.get_bool('auth_use_apikey'):
                     url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')
                 if app.config['config']['is_server']:
                     msg += '\n' + ret.magnet + '\n'
                 else:
                     msg += '\n➕ 다운로드 추가\n<%s>\n' % url
                 #msg += '\n➕ 다운로드 추가\n<%s>\n' % url
                 
                 poster = ret.poster if ModelSetting.get_bool('show_poster_notify') else None
                 ToolBaseNotify.send_message(msg, image_url=poster, message_id='bot_downloader_av_receive')
             self.invoke()
             try:
                 if app.config['config']['is_server']:
                     from tool_expand import TorrentProcess
                     TorrentProcess.receive_new_data(ret, package_name)
             except: pass
     except Exception as e:
             logger.error('Exception:%s', e)
             logger.error(traceback.format_exc())
Ejemplo n.º 4
0
 def process_menu(self, sub, req):
     arg = P.ModelSetting.to_dict()
     arg['sub'] = self.name
     if sub == 'setting':
         arg['scheduler'] = str(
             scheduler.is_include(self.get_scheduler_name()))
         arg['is_running'] = str(
             scheduler.is_running(self.get_scheduler_name()))
         ddns = SystemModelSetting.get('ddns')
         arg['rss_api'] = '%s/%s/api/%s/rss' % (ddns, package_name,
                                                self.name)
         if SystemModelSetting.get_bool('auth_use_apikey'):
             arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get(
                 'auth_apikey')
         return render_template(
             '{package_name}_{module_name}_{sub}.html'.format(
                 package_name=package_name, module_name=self.name, sub=sub),
             arg=arg)
     elif sub == 'list':
         arg['is_torrent_info_installed'] = False
         try:
             import torrent_info
             arg['is_torrent_info_installed'] = True
         except:
             pass
         return render_template(
             '{package_name}_{module_name}_{sub}.html'.format(
                 package_name=package_name, module_name=self.name, sub=sub),
             arg=arg)
     return render_template('sample.html',
                            title='%s - %s' % (package_name, sub))
Ejemplo n.º 5
0
def first_menu(sub): 
    #logger.debug('DETAIL %s %s', package_name, sub)
    try:
        arg = ModelSetting.to_dict()
        arg['package_name']  = package_name
        arg['ddns'] = SystemModelSetting.get('ddns')
        arg['auth_use_apikey'] = str(SystemModelSetting.get_bool('auth_use_apikey'))
        arg['auth_apikey'] = SystemModelSetting.get('auth_apikey')
        if sub == 'setting':
            arg['scheduler'] = str(scheduler.is_include(package_name))
            arg['is_running'] = str(scheduler.is_running(package_name))
            ddns = SystemModelSetting.get('ddns')
            arg['api_m3u'] = '{ddns}/{package_name}/api/m3u'.format(ddns=ddns, package_name=package_name)
            arg['api_m3utvh'] = '{ddns}/{package_name}/api/m3utvh'.format(ddns=ddns, package_name=package_name)
            arg['api_m3uall'] = '{ddns}/{package_name}/api/m3uall'.format(ddns=ddns, package_name=package_name)
            arg['xmltv'] = '{ddns}/epg/api/klive'.format(ddns=ddns)
            arg['plex_proxy'] = '{ddns}/{package_name}/proxy'.format(ddns=ddns, package_name=package_name)
            arg['wavve_vod'] = '{ddns}/{package_name}/wavve/api/m3u'.format(ddns=ddns, package_name=package_name)
            arg['tving_vod'] = '{ddns}/{package_name}/tving/api/m3u'.format(ddns=ddns, package_name=package_name)
            
            if SystemModelSetting.get_bool('auth_use_apikey'):
                apikey = SystemModelSetting.get('auth_apikey')
                for tmp in ['api_m3u', 'api_m3uall', 'api_m3utvh', 'xmltv', 'wavve_vod', 'tving_vod']:
                    arg[tmp] += '?apikey={apikey}'.format(apikey=apikey)

            from .source_streamlink import SourceStreamlink
            arg['tmp_is_streamlink_installed'] = 'Installed' if SourceStreamlink.is_installed() else 'Not Installed'
            from .source_youtubedl import SourceYoutubedl
            arg['tmp_is_youtubedl_installed'] = 'Installed' if SourceYoutubedl.is_installed() else 'Not Installed'
            return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg)
        elif sub == 'list':
            
            return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg)
        elif sub == 'custom_create':
            return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg)
        elif sub == 'custom_edit':
            return render_template('{package_name}_{sub}.html'.format(package_name=package_name, sub=sub), arg=arg)
        elif sub == 'proxy':
            return redirect('/klive/proxy/discover.json')
        elif sub == 'log':
            return render_template('log.html', package=package_name)
        return render_template('sample.html', title='%s - %s' % (package_name, sub))
    except Exception as e: 
        logger.error('Exception:%s', e)
        logger.error(traceback.format_exc())
Ejemplo n.º 6
0
 def make_apikey(url):
     from framework import SystemModelSetting
     url = url.format(ddns=SystemModelSetting.get('ddns'))
     if SystemModelSetting.get_bool('auth_use_apikey'):
         if url.find('?') == -1:
             url += '?'
         else:
             url += '&'
         url += 'apikey=%s' % SystemModelSetting.get('auth_apikey')
     return url
Ejemplo n.º 7
0
 def make_apikey_url(cls, url):
     from framework import SystemModelSetting
     if not url.startswith('http'):
         url = SystemModelSetting.get('ddns') + url
     if SystemModelSetting.get_bool('auth_use_apikey'):
         if url.find('?') == -1:
             url += '?'
         else:
             url += '&'
         url += 'apikey=%s' % SystemModelSetting.get('auth_apikey')
     return url
Ejemplo n.º 8
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="" group-title="웨이브 최신 VOD",{title}\n{url}\n'
            ch_number = 1
            for page in range(1, ModelSetting.get_int('wavve_vod_page') + 1):
                vod_list = Wavve.vod_newcontents(page=page)['list']
                for info in vod_list:
                    title = info['programtitle']
                    if info['episodenumber'] != '':
                        title += ' (%s회)' % info['episodenumber']
                    tmp = info['episodetitle'].find('Quick VOD')
                    if tmp != -1:
                        title += info['episodetitle'][tmp - 2:]

                    video_url = '%s/%s/wavve/api/streaming.m3u8?contentid=%s&type=%s' % (
                        SystemModelSetting.get('ddns'), package_name,
                        info['contentid'], info['type'])
                    if SystemModelSetting.get_bool('auth_use_apikey'):
                        video_url += '&apikey=%s' % SystemModelSetting.get(
                            'auth_apikey')
                    data += form.format(contentid=info['contentid'],
                                        title=title,
                                        channel_number=ch_number,
                                        logo='',
                                        url=video_url)

                    channel_tag = ET.SubElement(root, 'channel')
                    channel_tag.set('id', info['contentid'])
                    #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)
                    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())
Ejemplo n.º 9
0
 def process_menu(self, sub, req):
     arg = P.ModelSetting.to_dict()
     if sub == 'setting':
         arg['sample'] = '%s/%s/api/google/rss?remote=[구글리모트]&title=[제목]&desc=&image=&genre=' % (
             SystemModelSetting.get('ddns'), package_name)
         if SystemModelSetting.get_bool('auth_use_apikey'):
             arg['sample'] += '&apikey=%s' % SystemModelSetting.get(
                 'auth_apikey')
         return render_template(
             '{package_name}_{module_name}_{sub}.html'.format(
                 package_name=P.package_name,
                 module_name=self.name,
                 sub=sub),
             arg=arg)
     return render_template('sample.html',
                            title='%s - %s' % (package_name, sub))
Ejemplo n.º 10
0
 def process_menu(self, sub, req):
     arg = P.ModelSetting.to_dict()
     if sub == 'setting':
         arg['tmp_pb_api'] = '%s/%s/api/podbbang/%s' % (
             SystemModelSetting.get('ddns'), package_name, '12548')
         if SystemModelSetting.get_bool('auth_use_apikey'):
             arg['tmp_pb_api'] += '?apikey=%s' % SystemModelSetting.get(
                 'auth_apikey')
         return render_template(
             '{package_name}_{module_name}_{sub}.html'.format(
                 package_name=P.package_name,
                 module_name=self.name,
                 sub=sub),
             arg=arg)
     return render_template('sample.html',
                            title='%s - %s' % (package_name, sub))
Ejemplo n.º 11
0
 def change_redirect_data(cls, data, proxy=None):
     try:
         #logger.debug(data)
         from system.model import ModelSetting as SystemModelSetting
         tmp = re.compile(r'http(.*?)$', re.MULTILINE).finditer(data)
         for m in tmp:
             u = m.group(0)
             u2 = '{ddns}/{package_name}/api/redirect?url={url}'.format(ddns=SystemModelSetting.get('ddns'), package_name=package_name, url=urllib.quote(u))
             if SystemModelSetting.get_bool('auth_use_apikey'):
                 u2 += '&apikey={apikey}'.format(apikey=SystemModelSetting.get('auth_apikey'))
             if proxy is not None:
                 u2 += '&proxy=%s' % proxy
             data = data.replace(u, u2)
         #logger.debug(data)
         return data
     except Exception as e:
         logger.error('Exception:%s', e)
         logger.error(traceback.format_exc())
         
Ejemplo n.º 12
0
def proxy(sub):
    logger.debug('proxy %s %s', package_name, sub)
    try:
        if sub == 'discover.json':
            ddns = SystemModelSetting.get('ddns')
            data = {
                "FriendlyName": "HDHomeRun CONNECT",
                "ModelNumber": "HDHR4-2US",
                "FirmwareName": "hdhomerun4_atsc",
                "FirmwareVersion": "20190621",
                "DeviceID": "104E8010",
                "DeviceAuth": "UF4CFfWQh05c3jROcArmAZaf",
                "BaseURL": "%s/klive/proxy" % ddns,
                "LineupURL": "%s/klive/proxy/lineup.json" % ddns,
                "TunerCount": 20
            }
            return jsonify(data)
        elif sub == 'lineup_status.json':
            data = {
                "ScanInProgress": 0,
                "ScanPossible": 1,
                "Source": "Cable",
                "SourceList": ["Antenna", "Cable"]
            }
            return jsonify(data)
        elif sub == 'lineup.json':
            lineup = []
            custom_list = LogicKlive.get_saved_custom_instance()
            ddns = SystemModelSetting.get('ddns')
            apikey = None
            if SystemModelSetting.get_bool('auth_use_apikey'):
                apikey = SystemModelSetting.get('auth_apikey')
            for c in custom_list:
                tmp = c.get_m3u8(ddns, 'plex', apikey)
                lineup.append({
                    'GuideNumber': str(c.number),
                    'GuideName': c.title,
                    'URL': tmp
                })
            return jsonify(lineup)
    except Exception as e:
        logger.error('Exception:%s', e)
        logger.error(traceback.format_exc())
Ejemplo n.º 13
0
    def add_download_sub(db_id, index):
        try:
            import downloader
            item = ModelMovieItem.get_by_id(db_id)
            is_available_normal_download = downloader.Logic.is_available_normal_download()
            if is_available_normal_download and item.sub is not None:
                for idx, dummy in enumerate(item.sub):
                    if index == -1 or idx == index:
                        url = '%s/%s/api/attach?id=%s_%s' % (SystemModelSetting.get('ddns'), package_name, item.id, idx)
                        if SystemModelSetting.get_bool('auth_use_apikey'):
                            url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')

                        downloader.Logic.add_download2(url, ModelSetting.get('torrent_program'), ModelSetting.get('path'), request_type=package_name, request_sub_type='', server_id='movie_%s_%s_%s' % (item.server_id, item.file_count, item.total_size), magnet=item.magnet )
                return True
            return False
        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
            return False
Ejemplo n.º 14
0
 def process_telegram_data(data):
     try:
         ret = ModelMovieItem.process_telegram_data(data)
         #logger.debug('telegram bot receive. is exist : %s', ret)
         if ret is not None:
             if ModelSetting.get_bool('receive_info_send_telegram'):
                 msg = '😉 영화 정보 수신\n'
                 msg += '제목 : %s (%s)\n' % (ret.movie_title, ret.movie_year)
                 msg += '파일 : %s\n' % ret.filename
                 url = '%s/%s/api/add_download?id=%s' % (SystemModelSetting.get('ddns'), package_name, ret.id)
                 if SystemModelSetting.get_bool('auth_use_apikey'):
                     url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')
                 if app.config['config']['is_server']:
                     msg += '\n' + ret.magnet + '\n'
                 else:
                     msg += '\n➕ 다운로드 추가\n<%s>\n' % url
                 #msg += '\n➕ 다운로드 추가\n<%s>\n' % url
                 try:
                     if ret.movie_title is not None:
                         if ret.movie_target == 'imdb':
                             url = 'https://www.imdb.com/title/%s' % ret.movie_id
                             msg += '\n● IMDB 정보\n%s' % url
                         else:
                             url = 'https://movie.daum.net/moviedb/main?movieId=%s' % (ret.movie_id)
                             msg += '\n● Daum 정보\n%s' % url
                 except Exception as e: 
                     logger.error('Exception:%s', e)
                     logger.error(traceback.format_exc())  
                 ToolBaseNotify.send_message(msg, image_url=ret.daum_poster, message_id='bot_downloader_movie_receive')
             LogicNormal.invoke()
             try:
                 if app.config['config']['is_server']:
                     from tool_expand import TorrentProcess
                     TorrentProcess.receive_new_data(ret, package_name)
             except: pass
             
     except Exception as e:
             logger.error('Exception:%s', e)
             logger.error(traceback.format_exc())
Ejemplo n.º 15
0
    def make_klive(sub):
        try:
            from klive.logic_klive import LogicKlive
            from klive.model import ModelSetting as KliveModelSetting
            if LogicKlive.source_list is None:
                tmp = LogicKlive.channel_load_from_site()
            instance = LogicKlive.source_list['wavve']
            from system.model import ModelSetting as SystemModelSetting

            tmp = builder.ElementMaker(
                nsmap={'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'})
            root = tmp.rss(version="2.0")
            EE = builder.ElementMaker(
                namespace="http://www.itunes.com/dtds/podcast-1.0.dtd",
                nsmap={'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'})
            channel_tag = (E.channel(
                E.title('KLive Radio'),
                E.link(),
                E.description('KLive Radio'),
                E.language('ko-kr'),
                E.copyright(''),
                EE.subtitle(),
                EE.author(),
                EE.summary('KLive Radio'),
                EE.category('Radio'),
                EE.image(),
                EE.explicit('no'),
                EE.keywords('Radio'),
            ))
            root.append(channel_tag)
            for idx, c in enumerate(instance.get_channel_list()):
                if not c.is_tv:
                    logger.debug(c.title)
                    logger.debug(c.current)
                    logger.debug(c.source_id)
                    logger.debug(c.source)
                    url = '%s/klive/api/url.m3u8?m=url&s=%s&i=%s' % (
                        SystemModelSetting.get('ddns'), c.source, c.source_id)
                    if SystemModelSetting.get_bool('auth_use_apikey'):
                        url += '&apikey=%s' % SystemModelSetting.get(
                            'auth_apikey')

                    channel_tag.append(
                        E.item(
                            E.title(c.title),
                            EE.subtitle(c.current),
                            EE.summary(c.current),
                            E.guid(str(idx + 1)),
                            E.pubDate(datetime.now().strftime(
                                '%a, %d %b %Y %H:%M:%S') + ' +0900'),
                            #EE.duration(),
                            E.enclosure(
                                url=url
                            ),  #, length=item['file_size'], type='audio/mp3'),
                            E.description(c.current)))
            return app.response_class(ET.tostring(root,
                                                  pretty_print=True,
                                                  xml_declaration=True,
                                                  encoding="utf-8"),
                                      mimetype='application/xml')
        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Ejemplo n.º 16
0
    def scheduler_function_torrent_check():
        try:
            last_id = ModelSetting.get_int('last_id')
            flag_first = False
            if last_id == -1:
                flag_first = True
                # 최초 실행은 -1로 판단하고, 봇을 설정안했다면 0으로
                query = db.session.query(ModelMovieItem) \
                    .filter(ModelMovieItem.created_time > datetime.datetime.now() + datetime.timedelta(days=-7))
                items = query.all()
            else:
                query = db.session.query(ModelMovieItem) \
                    .filter(ModelMovieItem.id > last_id )
                items = query.all()

            # 하나씩 판단....
            logger.debug('New Feed.. last_id:%s count :%s', last_id, len(items))
            for item in items:
                try:
                    flag_download = False
                    item.download_status = ''
                    item.downloader_item_id = None
                    item.log = ''

                    option_auto_download = ModelSetting.get('option_auto_download')
                    if option_auto_download == '0':
                        item.download_status = 'no'
                    else:
                        flag_download = LogicNormal.check_option_meta(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_target(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_country_include(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_country_exclude(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_year(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_genre_include(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_genre_exclude(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_rate(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_keyword_include(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_keyword_exclude(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_quality(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_source(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_video_codec(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_audio_codec(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_sub(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_plex(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_size(item)
                        if flag_download:
                            flag_download = LogicNormal.check_option_server_id_mod(item)

                        #다운로드
                        if flag_download:
                            if option_auto_download == '1':
                                import downloader
                                downloader_item_id = downloader.Logic.add_download2(item.magnet, ModelSetting.get('torrent_program'), ModelSetting.get('path'), request_type=package_name, request_sub_type='', server_id='movie_%s_%s_%s' % (item.server_id, item.file_count, item.total_size) )['downloader_item_id']
                                item.downloader_item_id = downloader_item_id
                                item.download_status = 'true'

                                is_available_normal_download = downloader.Logic.is_available_normal_download()
                                if is_available_normal_download and item.sub is not None:
                                    for idx, sub in enumerate(item.sub):
                                        url = '%s/%s/api/attach?id=%s_%s' % (SystemModelSetting.get('ddns'), package_name, item.id, idx)
                                        if SystemModelSetting.get_bool('auth_use_apikey'):
                                            url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')

                                        downloader.Logic.add_download2(url, ModelSetting.get('torrent_program'), ModelSetting.get('path'), request_type=package_name, request_sub_type='', server_id='movie_%s_%s_%s' % (item.server_id, item.file_count, item.total_size), magnet=item.magnet)
                            else:
                                item.download_status = 'true_only_status'
                        else:
                            if option_auto_download == '1':
                                item.download_status = 'false'
                            else:
                                item.download_status = 'false_only_status'
                        
                    if ModelSetting.get_bool('download_start_send_telegram'):
                        LogicNormal.send_telegram_message(item)
                    item.download_check_time =  datetime.datetime.now()
                    db.session.add(item)
                except Exception as e: 
                    logger.error('Exception:%s', e)
                    logger.error(traceback.format_exc())

            new_last_id = last_id
            if flag_first and len(items) == 0:
                new_last_id = '0'
            else:
                if len(items) > 0:
                    new_last_id = '%s' % items[len(items)-1].id
            if new_last_id != last_id:
                ModelSetting.set('last_id', str(new_last_id))
            db.session.commit()

        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Ejemplo n.º 17
0
def xmltv_php(source):
    url = '/%s/%s/api/epg' % (package_name, source)
    if SystemModelSetting.get_bool('auth_use_apikey'):
        url += '?apikey=%s' % SystemModelSetting.get('auth_apikey') 
    return redirect(url)
Ejemplo n.º 18
0
def api(sub):
    if sub == 'url.m3u8':
        try:
            mode = request.args.get('m')
            source = request.args.get('s')
            source_id = request.args.get('i')
            quality = request.args.get('q')
            logger.debug('m:%s, s:%s, i:%s', mode, source, source_id)
            action, ret = LogicKlive.get_url(source, source_id, quality, mode)
            #logger.debug('action:%s, url:%s', action, ret)
            
            if mode == 'plex':
                #new_url = '%s/klive/api/url.m3u8?m=web_play&s=%s&i=%s&q=%s' % (SystemModelSetting.get('ddns'), source, source_id, quality)
                new_url = '%s/klive/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % (SystemModelSetting.get('ddns'), source, source_id, quality)
                #logger.debug(SystemModelSetting.get_bool('auth_use_apikey'))
                if SystemModelSetting.get_bool('auth_use_apikey'):
                    new_url += '&apikey=%s' % SystemModelSetting.get('auth_apikey')
                def generate():
                    startTime = time.time()
                    buffer = []
                    sentBurst = False
                    
                    if platform.system() == 'Windows':
                        path_ffmpeg = os.path.join(path_app_root, 'bin', platform.system(), 'ffmpeg.exe')
                    else:
                        path_ffmpeg = 'ffmpeg'

                    #ffmpeg_command = [path_ffmpeg, "-i", new_url, "-c", "copy", "-f", "mpegts", "-tune", "zerolatency", "pipe:stdout"]
                    #ffmpeg_command = [path_ffmpeg, "-i", new_url, "-c:v", "copy", "-c:a", "aac", "-b:a", "128k", "-f", "mpegts", "-tune", "zerolatency", "pipe:stdout"]
                    
                    # 2020-12-17 by 잠자
                    ffmpeg_command = [path_ffmpeg, "-loglevel", "quiet", "-i", new_url, "-c:v", "copy", "-c:a", "aac", "-b:a", "128k", "-f", "mpegts", "-tune", "zerolatency", "pipe:stdout"]


                    #logger.debug('command : %s', ffmpeg_command)
                    process = subprocess.Popen(ffmpeg_command, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, bufsize = -1)
                    global process_list
                    process_list.append(process)
                    while True:
                        line = process.stdout.read(1024)
                        buffer.append(line)
                        if sentBurst is False and time.time() > startTime + 1 and len(buffer) > 0:
                            sentBurst = True
                            for i in range(0, len(buffer) - 2):
                                yield buffer.pop(0)
                        elif time.time() > startTime + 1 and len(buffer) > 0:
                            yield buffer.pop(0)
                        process.poll()
                        if isinstance(process.returncode, int):
                            if process.returncode > 0:
                                logger.debug('FFmpeg Error :%s', process.returncode)
                            break
                return Response(stream_with_context(generate()), mimetype = "video/MP2T")

            if action == 'redirect':
                return redirect(ret, code=302)
            elif action == 'return_after_read':
                logger.warning('return_after_read')
                data = LogicKlive.get_return_data(source, source_id, ret, mode)
                #logger.debug('Data len : %s', len(data))
                return data, 200, {'Content-Type': 'application/vnd.apple.mpegurl'}
            elif action == 'return':
                return ret
            if ret == None: return
            if mode == 'url.m3u8':
                return redirect(ret, code=302)
            elif mode == 'lc':
                return ret
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())  
    elif sub == 'm3uall':
        return LogicKlive.get_m3uall()
    elif sub == 'm3u':
        data = LogicKlive.get_m3u(m3u_format=request.args.get('format'), group=request.args.get('group'), call=request.args.get('call'))
        if request.args.get('file') == 'true':
            import framework.common.util as CommonUtil
            basename = 'klive_custom.m3u'
            filename = os.path.join(path_data, 'tmp', basename)
            CommonUtil.write_file(data, filename)
            return send_file(filename, as_attachment=True, attachment_filename=basename)
        else:
            return data
    elif sub == 'm3utvh':
        return LogicKlive.get_m3u(for_tvh=True, m3u_format=request.args.get('format'), group=request.args.get('group'))
    elif sub == 'redirect':
        try:
            url = request.args.get('url')
            proxy = request.args.get('proxy')
            proxies = None
            if proxy is not None:
                proxy = py_urllib.unquote(proxy)
                proxies={"https": proxy, 'http':proxy}
            url = py_urllib.unquote(url)
            #logger.debug('REDIRECT:%s', url)
            #logger.warning(f"redirect : {url}")
            # 2021-06-03
            """
            res = requests.get(url, proxies=proxies)
            data = res.content
            return data, 200, {'Content-Type':res.headers['Content-Type']}
            """
            headers = {'Connection' : 'keep-alive'}
            r = requests.get(url, headers=headers, stream=True, proxies=proxies)
            rv = Response(r.iter_content(chunk_size=1024), r.status_code, content_type=r.headers['Content-Type'], direct_passthrough=True)
            return rv

        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())

    elif sub == 'url.mpd':
        try:
            mode = request.args.get('m')
            source = request.args.get('s')
            source_id = request.args.get('i')
            quality = request.args.get('q')
            return_format = 'json'
            data = LogicKlive.get_play_info(source, source_id, quality, mode=mode, return_format=return_format)
            return jsonify(data)
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
    elif sub == 'url.strm':
        try:
            mode = request.args.get('m')
            source = request.args.get('s')
            source_id = request.args.get('i')
            quality = request.args.get('q')
            return_format = 'strm'
            data = LogicKlive.get_play_info(source, source_id, quality, mode=mode, return_format=return_format)
            #return data

            import framework.common.util as CommonUtil
            from .model import ModelCustom
            db_item = ModelCustom.get(source, source_id)
            if db_item is not None:
                basename = '%s.strm' % db_item.title
            else:
                basename = '%s.strm' % source_id
            filename = os.path.join(path_data, 'tmp', basename)
            CommonUtil.write_file(data, filename)
            return send_file(filename, as_attachment=True, attachment_filename=basename)

            #return data
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())              
    elif sub == 'sinaplayer':
        data = LogicKlive.get_m3u_for_sinaplayer()
        return data
Ejemplo n.º 19
0
def get_proxy():
    if SystemModelSetting.get_bool('site_wavve_use_proxy'):
        return SystemModelSetting.get('site_wavve_proxy_url')
Ejemplo n.º 20
0
    def add_download2(download_url, default_torrent_program, download_path, request_type='web', request_sub_type='', server_id=None, magnet=None):
        try:

            ######################## add name to magnet
            if ModelSetting.get_bool('use_download_name') and download_url.lower().find('magnet') != -1:
                if "&dn=" not in download_url:
                    try:
                        data = {'uri': download_url}
                        url = '%s/torrent_info/api/json' % (SystemModelSetting.get('ddns'))
                        if SystemModelSetting.get_bool('auth_use_apikey'):
                            url += '?apikey=%s' % SystemModelSetting.get('auth_apikey')
                        
                        raw_info = requests.get(url, data).json()
                        if raw_info[u'success']:
                            download_url += '&dn=' + raw_info[u'info'][u'name']
                        # else:
                        #     #logger.debug("log: %d", str(raw_info[u'log']))
                    except:
                        pass
            ######################## torrent_tracker
            if ModelSetting.get_bool('use_tracker') and download_url.lower().find('magnet') != -1:
                tracker_list = []
                tracker_list += [tracker.strip() for tracker in ModelSetting.get('tracker_list').split('\n') if len(tracker.strip()) != 0]
                tracker_list += [tracker.strip() for tracker in ModelSetting.get('tracker_list_manual').split('\n') if len(tracker.strip()) != 0]
                for tracker in tracker_list:
                    download_url += '&tr=' + tracker
            ########################

            setting_list = db.session.query(ModelSetting).all()
            arg = Util.db_list_to_dict(setting_list)
            if default_torrent_program is None:
                default_torrent_program = arg['default_torrent_program']
            

            if download_path is not None and download_path.strip() == '':
                download_path = None
            if default_torrent_program == '0':
                if download_path is None:
                    download_path = arg['transmission_default_path']
                download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet)
                ret = LogicTransmission.add_download(download_url, download_path)
            elif default_torrent_program == '1':
                if download_path is None:
                    download_path = arg['downloadstation_default_path']
                download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet)
                ret = LogicDownloadStation.add_download(download_url, download_path)
            elif default_torrent_program == '2':
                if download_path is None:
                    download_path = arg['qbittorrnet_default_path']
                download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet)
                ret = LogicQbittorrent.add_download(download_url, download_path)
            elif default_torrent_program == '3':
                if download_path is None:
                    download_path = arg['aria2_default_path']
                download_path = LogicNormal.get_download_path(download_path, server_id, download_url, magnet=magnet)
                ret = LogicAria2.add_download(download_url, download_path)

            ret['default_torrent_program'] = default_torrent_program
            ret['downloader_item_id'] = ModelDownloaderItem.save(ret, request_type, request_sub_type)
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
            ret = {'ret':'error'}
        finally:
            return ret