Esempio n. 1
0
def proxy(sub):
    logger.debug('proxy %s %s', package_name, sub)
    try:
        from system.model import ModelSetting as SystemModelSetting
        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())
Esempio n. 2
0
def get_actor_info(entity, retry=True):
    try:
        from . import Vars
        url = 'https://hentaku.co/starsearch.php'
        data = {'name' : entity['name']}
        page = _session.post(url, headers=_headers, data=data)
        page.encoding = 'utf-8'
        data = page.text
        data = '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">' + data
        tree = html.fromstring(data)
        nodes = tree.xpath('//img')
        if nodes:
            entity['img'] = nodes[0].attrib['src'].strip()
            from system.model import ModelSetting as SystemModelSetting
            entity['img'] = '%s/av_agent/api/image_proxy?url=%s' % (SystemModelSetting.get('ddns'), entity['img'])
            if SystemModelSetting.get_bool('auth_use_apikey'):
                entity['img'] += '&apikey=%s' % SystemModelSetting.get('auth_apikey')

            nodes = tree.xpath('//div[@class="avstar_info_b"]')
            tmps = nodes[0].text_content().split('/')
            entity['name_kor'] = tmps[0].strip()
            entity['name_eng'] = tmps[1].strip()
        else:
            entity['img'] = 'xxxx'
            entity['name_kor'] = ''
            entity['name_eng'] = ''
        return entity
    except ValueError:
        # 2020-06-01
        # 단시간에 많은 요청시시 Error발생
        if retry:
            logger.debug(u'단시간 많은 요청으로 재요청')
            time.sleep(1)
            return get_actor_info(entity, retry=False)
        else:
            logger.debug(u'잠시후 다시 요청')
            entity['img'] = 'xxxx'
            entity['name_kor'] = ''
            entity['name_eng'] = ''
            return entity

    except Exception as exception: 
        logger.error('Exception:%s', exception)
        logger.error(traceback.format_exc())
Esempio n. 3
0
    def do_action(req):
        try:
            logger.debug(req.form)
            #return
            folder_id = req.form['folder_id']
            my_remote_path = req.form['my_remote_path']
            
            # 게시판
            board_type = req.form['board_type']
            category_type = req.form['category_type']
            board_title = req.form['board_title']
            board_content = req.form['board_content']
            board_daum_url = req.form['board_daum_url']
            folder_name = req.form['folder_name']

            size = int(req.form['size'])
            daum_info = req.form['daum_info']
            action = req.form['action']
            user_id = SystemModelSetting.get('sjva_me_user_id')
            if board_content.startswith('ID:'):
                user_id = board_content.split('\n')[0].split(':')[1].strip()
                board_content = board_content[board_content.find('\n'):]


            def func():
                ret = RcloneTool.do_action(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), action, 'category', folder_id, '', '', my_remote_path, 'real', folder_id_encrypted=True, listener=None)

                msg = u'Percent : %s\n' % ret['percent']
                socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)
                #msg = u'폴더ID : %s\n' % ret['folder_id']
                #socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)

                if ret['percent'] == 100:
                    msg = u'업로드 크기 적용..\n'
                    socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)
                    tmp = ModelSetting.get_int('size_upload')
                    tmp += size
                    ModelSetting.set('size_upload', str(tmp))

                    if board_type != 'share_private':
                        msg = u'게시물 등록중...\n'
                        socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)
                        
                        data = {'board_type' : board_type, 'category_type':category_type, 'board_title':board_title, 'board_content':board_content, 'board_daum_url' : board_daum_url, 'folder_name':folder_name, 'size':size, 'daum_info':daum_info, 'folder_id':ret['folder_id'], 'user_id':user_id, 'lsjson' : json.dumps(ret['lsjson'])}
                        LogicUser.site_append(data)
                
                msg = u'모두 완료되었습니다.\n'
                socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)

            thread = threading.Thread(target=func, args=())
            thread.setDaemon(True)
            thread.start()
            return ''
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Esempio n. 4
0
def first_menu(sub):
    try:
        if sub == 'setting':
            arg = ModelSetting.to_dict()
            arg['package_name'] = package_name
            arg['scheduler'] = str(scheduler.is_include(package_name))
            arg['is_running'] = str(scheduler.is_running(package_name))
            arg['is_test_server'] = (SystemModelSetting.get('ddns').find(
                'https://sjva-dev.soju6jan.com') != -1)
            return render_template('%s_%s.html' % (package_name, sub), arg=arg)
        elif sub in ['site', 'scheduler', 'group']:
            arg = {'package_name': package_name}
            return render_template('%s_%s.html' % (package_name, sub), arg=arg)
        elif sub == 'search':
            arg = {}
            arg = {'package_name': package_name}
            arg['ddns'] = SystemModelSetting.get('ddns')

            try:
                import downloader
                arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download(
                )
            except:
                arg['is_available_normal_download'] = False
            arg["search_word"] = request.args.get('search_word')
            arg['is_torrent_info_installed'] = False
            try:
                import torrent_info
                arg['is_torrent_info_installed'] = True
            except Exception as e:
                pass
            arg['apikey'] = ''
            if SystemModelSetting.get_bool('auth_use_apikey'):
                arg['apikey'] = SystemModelSetting.get('auth_apikey')

            return render_template('%s_%s.html' % (package_name, sub), arg=arg)
        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())
Esempio n. 5
0
 def process_telegram_data(data):
     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/add_download?url=%s' % (
                         SystemModelSetting.get('ddns'), package_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(daum_tv.Logic.get_search_name_from_original(ret.file_name).encode('utf8')), ret.daum_id)
                             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')
             LogicNormal.invoke()
             TorrentProcess.receive_new_data(ret, package_name)
     except Exception, e:
         logger.error('Exception:%s', e)
         logger.error(traceback.format_exc())
Esempio n. 6
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_sjva_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())

                    import framework.common.notify as Notify
                    Notify.send_message(
                        msg,
                        image_url=ret.daum_poster,
                        message_id='bot_downloader_movie_receive')
                LogicNormal.invoke()
                TorrentProcess.receive_new_data(ret, package_name)
        except Exception, e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Esempio n. 7
0
 def get_m3uall():
     try:
         from system.model import ModelSetting as SystemModelSetting
         apikey = None
         if SystemModelSetting.get_bool('auth_use_apikey'):
             apikey = SystemModelSetting.get('auth_apikey')
         m3u = '#EXTM3U\n'
         idx = 1
         for c in LogicKlive.get_channel_list():
             url = '{ddns}/{package_name}/api/url.m3u8?m=url&s={source}&i={source_id}'.format(ddns=SystemModelSetting.get('ddns'), package_name=package_name, source=c.source, source_id=c.source_id)
             if apikey is not None:
                 url += '&apikey=%s' % apikey
             if c.is_tv:
                 m3u += M3U_FORMAT % (c.source+'|' + c.source_id, c.title, c.icon, c.source, idx, idx, c.source + ' ' + c.title, url)
             else:
                 m3u += M3U_RADIO_FORMAT % (c.source+'|'+c.source_id, c.title, c.icon, c.source, idx, idx, c.source + ' ' + c.title, url)
             idx += 1
         return m3u
     except Exception as e: 
         logger.error('Exception:%s', e)
         logger.error(traceback.format_exc())
Esempio n. 8
0
def first_menu(sub): 
    logger.debug('DETAIL %s %s', package_name, sub)
    if sub == 'setting':
        arg = ModelSetting.to_dict()
        arg['package_name']  = package_name
        arg['scheduler'] = str(scheduler.is_include(package_name))
        arg['is_running'] = str(scheduler.is_running(package_name))
        ddns = SystemModelSetting.get('ddns')
        arg['rss_api'] = '%s/%s/api/rss' % (ddns, package_name)
        if SystemModelSetting.get_bool('auth_use_apikey'):
            arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey')
        return render_template('%s_setting.html' % package_name, sub=sub, arg=arg)
    elif sub == 'list':
        arg = {'package_name' : package_name}
        arg['is_torrent_info_installed'] = False
        try:
            import torrent_info
            arg['is_torrent_info_installed'] = True
        except Exception as e: 
            pass
        arg['is_available_normal_download'] = False
        try:
            import downloader
            arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download()
        except Exception as e: 
            pass
        arg['apikey'] = ''
        if SystemModelSetting.get_bool('auth_use_apikey'):
            arg['apikey'] = SystemModelSetting.get('auth_apikey')
        arg['ddns'] = SystemModelSetting.get('ddns')
        arg['show_log'] = ModelSetting.get('show_log')
        return render_template('%s_list.html' % package_name, arg=arg)
    elif sub == 'log':
        return render_template('log.html', package=package_name)
    return render_template('sample.html', title='%s - %s' % (package_name, sub))
Esempio n. 9
0
def first_menu(sub):
    if sub == 'setting':
        arg = ModelSetting.to_dict()
        arg['package_name'] = package_name
        arg['agent_server'] = SystemModelSetting.get(
            'ddns') + '/%s/api' % package_name
        return render_template('%s_setting.html' % package_name,
                               sub=sub,
                               arg=arg)
    elif sub == 'log':
        return render_template('log.html', package=package_name)
    return render_template('sample.html',
                           title='%s - %s' % (package_name, sub))
Esempio n. 10
0
    def process_menu(self, sub, req):
        arg = ModelSetting.to_dict()
        arg["package_name"] = package_name
        if sub == "setting":
            arg["trackers"] = "\n".join(json.loads(arg["trackers"]))
            arg["tracker_update_from_list"] = [
                [x, f"https://ngosang.github.io/trackerslist/trackers_{x}.txt"] for x in self.tracker_update_from_list
            ]
            arg["plugin_ver"] = plugin_info["version"]
            from system.model import ModelSetting as SystemModelSetting

            ddns = SystemModelSetting.get("ddns")
            arg["json_api"] = f"{ddns}/{package_name}/api/json"
            arg["m2t_api"] = f"{ddns}/{package_name}/api/m2t"
            if SystemModelSetting.get_bool("auth_use_apikey"):
                arg["json_api"] += f"?apikey={SystemModelSetting.get('auth_apikey')}"
                arg["m2t_api"] += f"?apikey={SystemModelSetting.get('auth_apikey')}"
            return render_template(f"{package_name}_{sub}.html", sub=sub, arg=arg)
        if sub == "search":
            arg["cache_size"] = len(self.torrent_cache)
            return render_template(f"{package_name}_{sub}.html", arg=arg)
        return render_template("sample.html", title=f"{package_name} - {sub}")
Esempio n. 11
0
    def get_m3u_for_sinaplayer():
        try:
            from system.model import ModelSetting as SystemModelSetting
            apikey = None
            if SystemModelSetting.get_bool('auth_use_apikey'):
                apikey = SystemModelSetting.get('auth_apikey')
            ddns = SystemModelSetting.get('ddns')
            m3u = '#EXTM3U\n'
            query = db.session.query(ModelCustom)
            query = query.order_by(ModelCustom.number)
            query = query.order_by(ModelCustom.epg_id)
            saved_channeld_list = query.all()

            for c in saved_channeld_list:
                if c.is_drm_channel:
                    play_info = LogicKlive.get_play_info(
                        c.source, c.source_id, c.quality)
                    play_info = json.dumps(play_info)
                else:
                    play_info = '%s/%s/api/url.m3u8?m=url&s=%s&i=%s&q=%s' % (
                        ddns, package_name, c.source, c.source_id, c.quality)
                    if apikey is not None:
                        play_info += '&apikey=%s' % apikey

                import epg
                ins = epg.ModelEpgMakerChannel.get_instance_by_name(c.epg_name)
                icon = '' if ins is None else ins.icon
                if icon is None:
                    icon = c.icon
                tvg_name = c.title
                group_name = c.group
                m3u += M3U_FORMAT % (c.source + '|' + c.source_id, tvg_name,
                                     icon, group_name, c.number, c.number,
                                     c.title, play_info)
            return m3u
        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Esempio n. 12
0
def detail(sub):
    if sub == 'setting':
        arg = ModelSetting.to_dict()
        arg['scheduler'] = str(scheduler.is_include(package_name))
        arg['is_running'] = str(scheduler.is_running(package_name))
        from system.model import ModelSetting as SystemModelSetting
        ddns = SystemModelSetting.get('ddns')
        arg['ddns'] = ddns
        apikey = None
        if SystemModelSetting.get_bool('auth_use_apikey'):
            apikey = SystemModelSetting.get('auth_apikey')
        for tmp in ['tvheadend', 'klive', 'hdhomerun']:
            arg[tmp] = '{ddns}/{package_name}/api/{sub}'.format(
                ddns=ddns, package_name=package_name, sub=tmp)
            if apikey is not None:
                arg[tmp] += '?apikey=' + apikey
        return render_template('{package_name}_{sub}.html'.format(
            package_name=package_name, sub=sub),
                               arg=arg)
    elif sub == 'log':
        return render_template('log.html', package=package_name)
    return render_template('sample.html',
                           title='%s - %s' % (package_name, sub))
Esempio n. 13
0
def detail(sub):
    if sub == 'setting':
        arg = ModelSetting.to_dict()
        arg['trackers'] = '\n'.join(json.loads(arg['trackers']))
        arg['plugin_ver'] = plugin_info['version']
        from system.model import ModelSetting as SystemModelSetting
        ddns = SystemModelSetting.get('ddns')
        arg['api_url_base'] = '%s/%s/api' % (ddns, package_name)
        return render_template('%s_setting.html' % package_name, sub=sub, arg=arg)
    elif sub == 'search':
        arg = ModelSetting.to_dict()
        return render_template('%s_search.html' % package_name, arg=arg)
    elif sub == 'log':
        return render_template('log.html', package=package_name)
    return render_template('sample.html', title='%s - %s' % (package_name, sub))
Esempio n. 14
0
    def add_copy_force(self, item_id):
        try:
            item = ModelShareItem.get_by_id(item_id)
            logger.debug(f'복사 재요청!!!!! {item_id}')
            ret = {'ret':'fail', 'remote_path':item.remote_path, 'server_response':None}
            can_use_share_flag = RcloneTool2.can_use_share(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), ret['remote_path'])
            if not can_use_share_flag:
                ret['ret'] = 'cannot_access'
                return ret

            data = item.as_dict()
            data['ddns'] = SystemModelSetting.get('ddns')
            data['sjva_me_id'] = SystemModelSetting.get('sjva_me_user_id')
            data['version'] = version
            url = P.SERVER_URL + '/gd_share_server/noapi/user/request'
            res = requests.post(url, data={'data':json.dumps(data)})

            ret['server_response'] = res.json()
            if ret['server_response']['ret'] == 'enqueue':
                if 'db_id' in ret['server_response'] and ret['server_response']['queue_name'] is not None:
                    item.status = 'request'
                    item.request_time = datetime.now()
                    item.save()
                    ret['ret'] = 'success'
            else:
                item.status = ret['server_response']['ret']
                ret['ret'] = ret['server_response']['ret']

        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
            ret['ret'] = 'fail'
            ret['log'] = str(e)

        logger.debug(ret)
        return ret
Esempio n. 15
0
    def process_telegram_data(data):
        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/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_sjva_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
                    import framework.common.notify as Notify
                    Notify.send_message(msg,
                                        image_url=poster,
                                        message_id='bot_downloader_av_receive')
                LogicNormal.invoke()
                TorrentProcess.receive_new_data(ret, package_name)
        except Exception, e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Esempio n. 16
0
    def process_ajax(sub, req):
        try:
            if sub == 'selenium_test_go':
                driver = SystemLogicSelenium.get_driver()
                driver.get(req.form['url'])
                return jsonify('success')
            elif sub == 'capture':
                driver = SystemLogicSelenium.get_driver()
                img = Image.open(BytesIO((driver.get_screenshot_as_png())))

                timestamp = time.time()
                timestamp = str(timestamp).split('.')[0]
                tmp = os.path.join(path_data, 'tmp', '%s.png' % timestamp)
                img.save(tmp)
                from system.model import ModelSetting as SystemModelSetting
                ddns = SystemModelSetting.get('ddns')
                url = '%s/open_file%s' % (ddns, tmp)
                logger.debug(url)
                ret = {}
                ret['ret'] = 'success'
                ret['data'] = url
                return jsonify(ret)
            elif sub == 'full_capture':
                driver = SystemLogicSelenium.get_driver()
                img = SystemLogicSelenium.full_screenshot(driver)

                timestamp = time.time()
                timestamp = str(timestamp).split('.')[0]
                tmp = os.path.join(path_data, 'tmp', '%s.png' % timestamp)
                img.save(tmp)
                return send_file(tmp, mimetype='image/png')
            elif sub == 'cookie':
                driver = SystemLogicSelenium.get_driver()
                data = driver.get_cookies()
                return jsonify(data)
            elif sub == 'daum_capcha':
                daum_capcha = req.form['daum_capcha']
                driver = SystemLogicSelenium.get_driver()
                #driver.find_element_by_xpath('//div[@class="secret_viewer"]/p/img').screenshot("captcha.png")
                driver.find_element_by_xpath(
                    '//input[@id="answer"]').send_keys(daum_capcha)
                driver.find_element_by_xpath('//input[@value="%s"]' %
                                             u'확인').click()
                return jsonify({'ret': 'success'})
        except Exception as exception:
            logger.error('Exception:%s', exception)
            logger.error(traceback.format_exc())
            return jsonify('exception')
Esempio n. 17
0
def get_logger(name):
    logger = logging.getLogger(name)
    if not logger.handlers:
        #global system_loading
        global level_unset_logger_list
        global logger_list
        level = logging.DEBUG
        from framework import flag_system_loading 
        try:
            if flag_system_loading:
                try:
                    from system.model import ModelSetting as SystemModelSetting
                    level = SystemModelSetting.get('log_level')
                    level = int(level)
                except:
                    level = logging.DEBUG
                if level_unset_logger_list is not None:
                    for item in level_unset_logger_list:
                        item.setLevel(level)
                    level_unset_logger_list = None
            else:
                level_unset_logger_list.append(logger)
                 
        except:
            pass
        logger.setLevel(level)
        formatter = logging.Formatter(u'[%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s] %(message)s')
        def customTime(*args):
            utc_dt = utc.localize(datetime.utcnow())
            my_tz = timezone("Asia/Seoul")
            converted = utc_dt.astimezone(my_tz)
            return converted.timetuple()

        formatter.converter = customTime
        file_max_bytes = 1 * 1024 * 1024 
        fileHandler = logging.handlers.RotatingFileHandler(filename=os.path.join(path_data, 'log', '%s.log' % name), maxBytes=file_max_bytes, backupCount=5, encoding='utf8', delay=True)
        streamHandler = logging.StreamHandler() 


        # handler에 fommater 세팅 
        fileHandler.setFormatter(formatter)
        streamHandler.setFormatter(CustomFormatter()) 
        
        # Handler를 logging에 추가
        logger.addHandler(fileHandler)
        logger.addHandler(streamHandler)
    return logger
Esempio n. 18
0
    def get_list_by_api(req, is_site, arg, site=None, board_id=None):
        try:
            #default_torrent_mode = db.session.query(ModelSetting).filter_by(key='default_torrent_mode').first().value
            default_torrent_mode = 'magnet'
            torrent_mode = req.args.get('torrent_mode')
            search_word = req.args.get('search')
            if search_word is not None and search_word != '':
                search_word = search_word.replace(' ', '+')
            if torrent_mode is not None:
                default_torrent_mode = torrent_mode

            if is_site:
                if site is None:
                    sched_entity = db.session.query(ModelScheduler2).filter_by(
                        id=arg).first()
                else:
                    sched_entity = db.session.query(ModelScheduler2).filter_by(
                        sitename=site).filter_by(board_id=board_id).first()

                items = LogicSearchSelf.get_list(
                    call='api',
                    sitename=sched_entity.sitename,
                    board=sched_entity.board_id,
                    search_word=search_word)
                title = 'SITE : %s  BOARD : %s' % (sched_entity.sitename,
                                                   sched_entity.board_id)
            else:
                groupname = arg
                group_entity = db.session.query(ModelGroup2).filter_by(
                    groupname=arg).first()
                items = LogicSearchSelf.get_list(call='api',
                                                 group=group_entity.groupname,
                                                 search_word=search_word)
                title = 'GROUP : %s' % (group_entity.groupname)

            #from .torrent_site_base import TorrentSite

            xml = LogicSearchSelf.make_rss(title, items, default_torrent_mode,
                                           SystemModelSetting.get('ddns'))

            return xml
        except Exception as e:
            logger.debug('Exception:%s', e)
            logger.debug(traceback.format_exc())
            logger.debug(
                'get_list_by_api is_site:%s, arg:%s, site:%s, board_id:%s',
                is_site, arg, site, board_id)
Esempio n. 19
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/tvheadend/proxy" % ddns,
                "LineupURL": "%s/tvheadend/proxy/lineup.json" % ddns,
                "TunerCount": 2
            }
            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':
            tvh_url = ModelSetting.get('tvh_url')
            tvh_auth = ModelSetting.get('tvh_auth')
            profile = ModelSetting.get('plex_profile')
            r = LogicNormal.get_response(
                '/api/channel/grid?start=0&limit=99999')
            channels = r.json()['entries']
            lineup = []
            for c in channels:
                if c['enabled']:
                    url = '%s/stream/channel/%s?auth=%s&profile=%s' % (
                        tvh_url, c['uuid'], tvh_auth, profile)
                    lineup.append({
                        'GuideNumber': str(c['number']),
                        'GuideName': c['name'],
                        'URL': url
                    })
            return jsonify(lineup)
    except Exception as e:
        logger.error('Exception:%s', e)
        logger.error(traceback.format_exc())
Esempio n. 20
0
    def send_discord_message(cls, text, image_url=None, webhook_url=None):
        from system.model import ModelSetting as SystemModelSetting
        try:
            if webhook_url is None:
                webhook_url = SystemModelSetting.get('notify_discord_webhook')

            webhook = DiscordWebhook(url=webhook_url, content=text)
            if image_url is not None:
                embed = DiscordEmbed()
                embed.set_timestamp()
                embed.set_image(url=image_url)
                webhook.add_embed(embed)
            response = webhook.execute()
            return True
        except Exception as exception:
            logger.error('Exception:%s', exception)
            logger.error(traceback.format_exc())
        return False
Esempio n. 21
0
    def do_action(self, req):
        try:
            upload_folderid = '16Wcqs0W60m0OaX9WU2ePPEy__O35wuYR'
            my_remote_path = req.form['my_remote_path'].strip()
            
            # 게시판
            board_type = req.form['board_type'].strip()
            category_type = req.form['category_type'].strip()
            board_title = req.form['board_title'].strip()
            board_content = req.form['board_content'].strip()
            board_daum_url = req.form['board_daum_url'].strip()
            folder_name = req.form['folder_name'].strip()

            size = int(req.form['size'].strip())
            daum_info = req.form['daum_info'].strip()
            action = req.form['action'].strip()
            user_id = SystemModelSetting.get('sjva_me_user_id')
            if board_content.startswith('ID:'):
                user_id = board_content.split('\n')[0].split(':')[1].strip()
                board_content = board_content[board_content.find('\n'):]

            def func():
                ret = RcloneTool2.do_user_upload(ModelSetting.get('rclone_path'), ModelSetting.get('rclone_config_path'), my_remote_path, folder_name, upload_folderid, board_type, category_type, is_move=(action=='move'))

                if ret['completed']:
                    if board_type != 'share_private' and ret['folder_id'] != '':
                        msg = u'6. 게시물 등록중...\n'
                        socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)
                        data = {'board_type' : board_type, 'category_type':category_type, 'board_title':board_title, 'board_content':board_content, 'board_daum_url' : board_daum_url, 'folder_name':folder_name, 'size':ret['size'], 'daum_info':daum_info, 'folder_id':ret['folder_id'], 'user_id':user_id, 'lsjson' : json.dumps(ret['lsjson'])}
                        self.site_append(data)
                    else:
                        msg = u'업로드한 폴더ID값을 가져올 수 없어서 사이트 등록에 실패하였습니다.\n관리자에게 등록 요청하세요.\n'
                        socketio.emit("command_modal_add_text", str(msg), namespace='/framework', broadcast=True)
                else:
                    socketio.emit("command_modal_add_text", u'업로드가 완료되지 않아 게시글이 등록되지 않습니다.\n', namespace='/framework', broadcast=True)
                    socketio.emit("command_modal_add_text", u'확인 후 다시 시도하세요.\n', namespace='/framework', broadcast=True)
                socketio.emit("command_modal_add_text", u'\n모두 완료되었습니다.\n', namespace='/framework', broadcast=True)
            thread = threading.Thread(target=func, args=())
            thread.setDaemon(True)
            thread.start()
            return ''
        except Exception as e: 
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
Esempio n. 22
0
def detail(sub):
    if sub == 'setting':
        arg = ModelSetting.to_dict()
        arg['package_name'] = package_name
        arg['rule_size'] = len(ModelSetting.get_json('rules'))
        arg['ddns'] = SystemModelSetting.get('ddns').rstrip('/')
        arg['project_template_list'] = [
            ['', '선택하면 설치 명령이 자동 완성됩니다.'],
            ['git|https://github.com/codedread/kthoom', 'https://github.com/codedread/kthoom'],
            ['git|https://github.com/daleharvey/pacman', 'https://github.com/daleharvey/pacman'],
            ['git|https://github.com/ziahamza/webui-aria2|docs', 'https://github.com/ziahamza/webui-aria2'],
            ['git|https://github.com/SauravKhare/speedtest', 'https://github.com/SauravKhare/speedtest'],
            ['tar|https://github.com/viliusle/miniPaint/archive/v4.2.4.tar.gz', 'https://github.com/viliusle/miniPaint'],
            ['zip|https://github.com/mayswind/AriaNg/releases/download/1.1.6/AriaNg-1.1.6.zip', 'https://github.com/mayswind/AriaNg'],
        ]
        return render_template('%s_setting.html' % package_name, sub=sub, arg=arg)
    elif sub == 'log':
        return render_template('log.html', package=package_name)
    return render_template('sample.html', title='%s - %s' % (package_name, sub))
Esempio n. 23
0
def second_menu(sub, sub2):
    try:
        arg = ModelSetting.to_dict()
        arg['package_name']  = package_name
        if sub == 'direct':
            if sub2 == 'setting':
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
            elif sub2 in ['request']:
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
        elif sub == 'rss':
            if sub2 == 'setting':
                arg['sub']  = sub
                arg['scheduler'] = str(scheduler.is_include('%s_%s' % (package_name, sub)))
                arg['is_running'] = str(scheduler.is_running('%s_%s' % (package_name, sub)))
                from system.model import ModelSetting as SystemModelSetting
                ddns = SystemModelSetting.get('ddns')
                arg['rss_api'] = '%s/%s/api/%s' % (ddns, package_name, sub)
                if SystemModelSetting.get_bool('auth_use_apikey'):
                    arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey')
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
            elif sub2 in ['job', 'list']:
                arg['is_available_normal_download'] = False
                try:
                    import downloader
                    arg['is_available_normal_download'] = downloader.Logic.is_available_normal_download()
                except:
                    pass
                if sub2 == 'list':
                    arg['jobs'] = ModelOffcloud2Job.get_list(by_dict=True)
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
        elif sub == 'cache':
            if sub2 == 'setting':
                arg['sub'] = sub
                from system.model import ModelSetting as SystemModelSetting
                ddns = SystemModelSetting.get('ddns')
                arg['rss_api'] = '%s/%s/api/%s' % (ddns, package_name, sub)
                if SystemModelSetting.get_bool('auth_use_apikey'):
                    arg['rss_api'] += '?apikey=%s' % SystemModelSetting.get('auth_apikey')
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
            elif sub2 == 'list':
                arg['type'] = ['KTV', 'KTV_ETC', 'MOVIE', 'MOVIE_ETC', 'MUSIC', 'SHOW', 'ANI', 'PROGRAM', 'JAV_CENSORED_DMM', 'JAV_CENSORED_JAVDB', 'JAV_CENSORED_ETC', 'JAV_UNCENSORED', 'AV_WEST', 'AV_EAST', 'ETC']
                return render_template('%s_%s_%s.html' % (package_name, sub, sub2), arg=arg)
        return render_template('sample.html', title='%s - %s - %s' % (package_name, sub, sub2))
    except Exception as e: 
        logger.error('Exception:%s', e)
        logger.error(traceback.format_exc())
Esempio n. 24
0
    def get_channel_list(cls):
        try:
            stamp = str(datetime.datetime.today().strftime('%Y%m%d%H%M%S'))
            url = 'http://123.140.104.150/api/epg/v1/channel/virtual?access_key=C4A0697007C3548D389B&cp_id=S_LGU_HYUK0920&system_id=HDTV&SA_ID=500053434041&STB_MAC=v000.5343.4041&NSC_TYPE=LTE&BASE_GB=Y&BASE_CD=W172.017&YOUTH_YN=N&ORDER_GB=N&POOQ_YN=N&HDTV_VIEW_GB=R&SID=001010005638&CLIENT_IP=172.17.100.15&OS_INFO=android_4.4.2&NW_INFO=WIFI&APP_TYPE=ROSA&DEV_MODEL=SM-N935F&CARRIER_TYPE=E&UI_VER=04.38.04&NOW_PAGE=25&PRE_PAGE=&MENU_NM=&CONTS_GB=&TERM_BINVER=3.8.118.0106'
            ret = []
            request = py_urllib2.Request(url)
            response = py_urllib2.urlopen(request)
            tree = ET.parse(response)
            root = tree.getroot()
            for item in root.findall('list'):
                #info = {}
                #info['id'] = item.findtext('service_id')
                #info['title'] = item.findtext('service_name').strip()
                #info['img'] = item.findtext('img_url') + item.findtext('img_file_name')
                #info['summary'] = item.findtext('description')
                #url = item.findtext('live_server1') + item.findtext('live_file_name1')
                #info['url']  = '%s?VOD_RequestID=v2M2-0101-1010-7272-5050-0000%s;LTE;480p;WIFI&APPNAME=hdtv&ALBUM_ID=%s&ma=D0:17:C2:CE:D7:A1' % (url, stamp, info['id'])
                #if item.findtext('live_file_name1') != '' and item.findtext('genre_name') != u'성인':
                #	result.append(info)
                import system

                
                if item.findtext('service_id') in ['628', '629', '743']:
                    if not SystemModelSetting.get_bool('videoportal_adult'):
                        continue

                c = ModelChannel(cls.source_name, 
                    item.findtext('service_id'), 
                    item.findtext('service_name').strip(), 
                    item.findtext('img_url') + item.findtext('img_file_name'),
                    True)
                c.current = item.findtext('description')
                ret.append(c)

        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())
        return ret
Esempio n. 25
0
    def scheduler_function():
        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='%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='%s_%s_%s' %
                                            (item.server_id, item.file_count,
                                             item.total_size))
                            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())
Esempio n. 26
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'):
                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'):
                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
Esempio n. 27
0
    def make_rss(title,
                 rss_list,
                 torrent_mode,
                 ddns,
                 is_bot=False,
                 search_word=None):
        from framework.common.rss import RssUtil
        xml = '<rss xmlns:showrss="http://showrss.info/" version="2.0">\n'
        xml += '\t<channel>\n'
        xml += '\t\t<title>' + '%s</title>\n' % title
        xml += '\t\t<link></link>\n'
        xml += '\t\t<description></description>\n'
        magnet_flag = False
        for bbs in rss_list:
            _dict = bbs.as_dict()
            if bbs.torrent_info is None and 'magnet' in _dict and _dict[
                    'magnet'] is not None:
                for magnet in _dict['magnet']:
                    magnet_flag = True
                    item_str = '\t\t<item>\n'
                    tmp = '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml(
                        bbs.title)
                    item_str += tmp
                    item_str += '\t\t\t<link>%s</link>\n' % magnet
                    date_str = bbs.created_time.strftime(
                        '%a, %d %b %Y %H:%M:%S') + ' +0900'
                    item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str
                    item_str += '\t\t</item>\n'
                    xml += item_str

            else:
                if bbs.torrent_info is not None:
                    for info in bbs.torrent_info:
                        magnet_flag = True
                        item_str = '\t\t<item>\n'
                        if search_word is not None and search_word != '' and info[
                                'name'].find(search_word) == -1:
                            continue
                        tmp = '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml(
                            info['name'])
                        item_str += tmp
                        item_str += '\t\t\t<link>magnet:?xt=urn:btih:%s</link>\n' % info[
                            'info_hash']
                        date_str = bbs.created_time.strftime(
                            '%a, %d %b %Y %H:%M:%S') + ' +0900'
                        item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str
                        item_str += '\t\t</item>\n'
                        xml += item_str

            if _dict['files']:
                for index, download in enumerate(_dict['files']):
                    try:
                        item_str = '\t\t<item>\n'
                        if magnet_flag and download[1].lower().endswith(
                                '.torrent'):
                            continue
                        item_str += '\t\t\t<title>%s</title>\n' % RssUtil.replace_xml(
                            download[1])
                        url = '%s/%s/api/download/%s_%s' % (ddns, package_name,
                                                            bbs.id, index)
                        if SystemModelSetting.get_bool('auth_use_apikey'):
                            url += '?apikey=%s' % SystemModelSetting.get(
                                'auth_apikey')
                        item_str += '\t\t\t<link>%s</link>\n' % url
                        date_str = bbs.created_time.strftime(
                            '%a, %d %b %Y %H:%M:%S') + ' +0900'
                        item_str += '\t\t\t<pubDate>%s</pubDate>\n' % date_str
                        item_str += '\t\t</item>\n'
                        xml += item_str
                    except Exception as e:
                        logger.debug('Exception:%s', e)
                        logger.debug(traceback.format_exc())

        xml += '\t</channel>\n'
        xml += '</rss>'
        return xml
Esempio n. 28
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)
Esempio n. 29
0
def api(sub):
    try:
        if sub == 'add_download':
            db_id = request.args.get('id')
            ret1 = LogicNormal.add_download(db_id)
            ret2 = LogicNormal.add_download_sub(db_id, -1)
            return jsonify(ret1)
        elif sub == 'rss':
            ret = ModelMovieItem.api_list(request)
            data = []
            for item in ret:
                entity = {}
                entity['title'] = item.filename
                entity['link'] = item.magnet
                entity['created_time'] = item.created_time
                data.append(entity)
                if 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')
                        entity = {}
                        entity['title'] = sub[1]
                        entity['link'] = url
                        entity['created_time'] = item.created_time
                        data.append(entity)

            from framework.common.rss import RssUtil
            xml = RssUtil.make_rss(package_name, data)
            return Response(xml, mimetype='application/xml')
        elif sub == 'attach':
            tmp = request.args.get('id').split('_')
            entity = ModelMovieItem.get_by_id(tmp[0])
            if entity is not None:
                import requests
                import io
                session = requests.Session()

                if entity.sub[int(tmp[1])][2] != 'NONE':
                    logger.debug('url : %s', entity.sub[int(tmp[1])][2])
                    page = get_html(session,
                                    entity.sub[int(tmp[1])][2],
                                    stream=True)
                else:
                    logger.debug('url : %s', entity.url)
                    logger.debug('url : %s', entity.sub[int(tmp[1])][0])
                    page = get_html(session, entity.url)
                    page = get_html(session,
                                    entity.sub[int(tmp[1])][0],
                                    referer=entity.url,
                                    stream=True)

                byteio = io.BytesIO()
                for chunk in page.iter_content(1024):
                    byteio.write(chunk)

                filedata = byteio.getvalue()
                logger.debug('LENGTH : %s', len(filedata))

                attach_filename = entity.sub[int(tmp[1])][1]
                if ModelSetting.get_bool('sub_change_filename'):
                    ext = os.path.splitext(attach_filename)[1].lower()
                    if ext in ['.smi', '.srt', '.ass']:
                        attach_filename = '%s%s' % (os.path.splitext(
                            entity.filename)[0], ext)

                logger.debug('filename : %s', attach_filename)
            return send_file(io.BytesIO(filedata),
                             mimetype='application/octet-stream',
                             as_attachment=True,
                             attachment_filename=attach_filename)
    except Exception as e:
        logger.error('Exception:%s', e)
        logger.error(traceback.format_exc())
Esempio n. 30
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':
                from system.model import ModelSetting as SystemModelSetting
                #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"
                    ]

                    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':
                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'))
        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'),
                                  quality=request.args.get('quality'))
    elif sub == 'redirect':
        try:

            url = request.args.get('url')
            proxy = request.args.get('proxy')
            proxies = None
            if proxy is not None:
                proxy = urllib.unquote(proxy)
                proxies = {"https": proxy, 'http': proxy}
            url = urllib.unquote(url)
            #logger.debug('REDIRECT:%s', url)
            res = requests.get(url, proxies=proxies)
            data = res.content
            return data, 200, {'Content-Type': res.headers['Content-Type']}
        except Exception as e:
            logger.error('Exception:%s', e)
            logger.error(traceback.format_exc())