Compare commits
13 Commits
a900247086
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 92771db871 | |||
| 4fef22f3df | |||
| a8138d4a71 | |||
| af3c43128d | |||
| 3b2c92a0e3 | |||
| 2ddda383c5 | |||
| 47a6407dfe | |||
| af73adf1aa | |||
| 3102ba50ad | |||
| 6e9b71f4cc | |||
| 5ff663e288 | |||
| 11a933a4f6 | |||
| a426a57824 |
247
logic_anilife.py
247
logic_anilife.py
@@ -112,38 +112,23 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
default_route_socketio(P, self)
|
default_route_socketio(P, self)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_html(url, referer=None, stream=False, timeout=5):
|
def get_html(url: str, referer: str = None, stream: bool = False, timeout: int = 5):
|
||||||
data = ""
|
data = ""
|
||||||
try:
|
try:
|
||||||
print("cloudflare protection bypass ==================")
|
print("cloudflare protection bypass ==================")
|
||||||
# return LogicAniLife.get_html_cloudflare(url)
|
# return LogicAniLife.get_html_cloudflare(url)
|
||||||
return LogicAniLife.get_html_selenium(url, referer)
|
return LogicAniLife.get_html_selenium(url, referer)
|
||||||
# return LogicAniLife.get_html_playwright(url)
|
# return LogicAniLife.get_html_playwright(url)
|
||||||
# import browser_cookie3
|
|
||||||
|
|
||||||
# cj = browser_cookie3.chrome(domain_name="anilife.live")
|
|
||||||
referer = "https://anilife.live/"
|
|
||||||
|
|
||||||
if LogicAniLife.session is None:
|
|
||||||
LogicAniLife.session = requests.session()
|
|
||||||
|
|
||||||
# logger.debug('get_html :%s', url)
|
|
||||||
LogicAniLife.headers["Referer"] = "" if referer is None else referer
|
|
||||||
LogicAniLife.headers[
|
|
||||||
"Cookie"
|
|
||||||
] = "_ga=GA1.1.578607927.1660813724; __gads=ID=10abb8b98b6828ae-2281c943a9d500fd:T=1660813741:RT=1660813741:S=ALNI_MYU_iB2lBgSrEQUBwhKpNsToaqQ8A; sbtsck=javuwDzcOJqUyweM1OQeNGzHbjoHp7Cgw44XnPdM738c3E=; SPSI=e48379959d54a6a62cc7abdcafdb2761; SPSE=h5HfMGLJzLqzNafMD3YaOvHSC9xfh77CcWdKvexp/z5N5OsTkIiYSCudQhFffEfk/0pcOTVf0DpeV0RoNopzig==; anilife_csrf=b93b9f25a12a51cf185805ec4de7cf9d; UTGv2=h46b326af644f4ac5d0eb1502881136b3750; __gpi=UID=000008ba227e99e0:T=1660813741:RT=1660912282:S=ALNI_MaJHIVJIGpQ5nTE9lvypKQxJnn10A; DSR=SXPX8ELcRgh6N/9rNgjpQoNfaX2DRceeKYR0/ul7qTI9gApWQpZxr8jgymf/r0HsUT551vtOv2CMWpIn0Hd26A==; DCSS=89508000A76BBD939F6DDACE5BD9EB902D2212A; DGCC=Wdm; adOtr=7L4Xe58995d; spcsrf=6554fa003bf6a46dd9b7417acfacc20a; _ga_56VYJJ7FTM=GS1.1.1660912281.10.1.1660912576.0.0.0; PRLST=EO"
|
|
||||||
|
|
||||||
page_content = LogicAniLife.session.get(
|
|
||||||
url, headers=headers, timeout=timeout, allow_redirects=True
|
|
||||||
)
|
|
||||||
data = page_content.text
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("Exception:%s", e)
|
logger.error("Exception:%s", e)
|
||||||
logger.error(traceback.format_exc())
|
logger.error(traceback.format_exc())
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_html_requests(url, referer=None, stream=False, timeout=5):
|
def get_html_requests(
|
||||||
|
url: str, referer: str = None, stream: str = False, timeout: int = 5
|
||||||
|
) -> str:
|
||||||
data = ""
|
data = ""
|
||||||
try:
|
try:
|
||||||
print("get_html_requests ==================")
|
print("get_html_requests ==================")
|
||||||
@@ -173,14 +158,20 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_html_playwright(
|
async def get_html_playwright(
|
||||||
url, headless=False, referer=None, engine="chrome", stealth=False
|
url: str,
|
||||||
):
|
headless: bool = False,
|
||||||
|
referer: str = None,
|
||||||
|
engine: str = "chrome",
|
||||||
|
stealth: bool = False,
|
||||||
|
) -> str:
|
||||||
|
try:
|
||||||
from playwright.sync_api import sync_playwright
|
from playwright.sync_api import sync_playwright
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
from playwright_stealth import stealth_sync, stealth_async
|
from playwright_stealth import stealth_sync, stealth_async
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
cookie = None
|
||||||
browser_args = [
|
browser_args = [
|
||||||
"--window-size=1300,570",
|
"--window-size=1300,570",
|
||||||
"--window-position=000,000",
|
"--window-position=000,000",
|
||||||
@@ -237,8 +228,8 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
||||||
"Chrome/69.0.3497.100 Safari/537.36"
|
"Chrome/69.0.3497.100 Safari/537.36"
|
||||||
)
|
)
|
||||||
|
|
||||||
# from playwright_stealth import stealth_sync
|
# from playwright_stealth import stealth_sync
|
||||||
cookie = None
|
|
||||||
|
|
||||||
def set_cookie(req):
|
def set_cookie(req):
|
||||||
nonlocal cookie
|
nonlocal cookie
|
||||||
@@ -246,6 +237,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
cookie = req.headers["cookie"]
|
cookie = req.headers["cookie"]
|
||||||
|
|
||||||
async with async_playwright() as p:
|
async with async_playwright() as p:
|
||||||
|
try:
|
||||||
if engine == "chrome":
|
if engine == "chrome":
|
||||||
browser = await p.chromium.launch(
|
browser = await p.chromium.launch(
|
||||||
channel="chrome", args=browser_args, headless=headless
|
channel="chrome", args=browser_args, headless=headless
|
||||||
@@ -264,7 +256,9 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
# user_agent=ua,
|
# user_agent=ua,
|
||||||
# )
|
# )
|
||||||
|
|
||||||
LogicAniLife.headers["Referer"] = "https://anilife.live/detail/id/471"
|
LogicAniLife.headers[
|
||||||
|
"Referer"
|
||||||
|
] = "https://anilife.live/detail/id/471"
|
||||||
# print(LogicAniLife.headers)
|
# print(LogicAniLife.headers)
|
||||||
|
|
||||||
LogicAniLife.headers["Referer"] = LogicAniLife.episode_url
|
LogicAniLife.headers["Referer"] = LogicAniLife.episode_url
|
||||||
@@ -273,7 +267,9 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
LogicAniLife.headers["Referer"] = referer
|
LogicAniLife.headers["Referer"] = referer
|
||||||
|
|
||||||
logger.debug(f"LogicAniLife.headers::: {LogicAniLife.headers}")
|
logger.debug(f"LogicAniLife.headers::: {LogicAniLife.headers}")
|
||||||
context = await browser.new_context(extra_http_headers=LogicAniLife.headers)
|
context = await browser.new_context(
|
||||||
|
extra_http_headers=LogicAniLife.headers
|
||||||
|
)
|
||||||
await context.add_cookies(LogicAniLife.cookies)
|
await context.add_cookies(LogicAniLife.cookies)
|
||||||
|
|
||||||
# LogicAniLife.headers["Cookie"] = cookie_value
|
# LogicAniLife.headers["Cookie"] = cookie_value
|
||||||
@@ -316,6 +312,18 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
print(f"run at {time.time() - start} sec")
|
print(f"run at {time.time() - start} sec")
|
||||||
|
|
||||||
return await page.content()
|
return await page.content()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Exception:%s", e)
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
finally:
|
||||||
|
await browser.close()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Exception:%s", e)
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
finally:
|
||||||
|
# browser.close()
|
||||||
|
pass
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_vod_url_v1(
|
async def get_vod_url_v1(
|
||||||
@@ -360,9 +368,6 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
browser = await p.webkit.launch(headless=headless)
|
browser = await p.webkit.launch(headless=headless)
|
||||||
else:
|
else:
|
||||||
browser = await p.firefox.launch(headless=headless)
|
browser = await p.firefox.launch(headless=headless)
|
||||||
# context = browser.new_context(
|
|
||||||
# user_agent=ua,
|
|
||||||
# )
|
|
||||||
|
|
||||||
LogicAniLife.headers["Referer"] = "https://anilife.live/detail/id/471"
|
LogicAniLife.headers["Referer"] = "https://anilife.live/detail/id/471"
|
||||||
# print(LogicAniLife.headers)
|
# print(LogicAniLife.headers)
|
||||||
@@ -421,7 +426,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
return await page.content()
|
return await page.content()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def get_vod_url(url, headless=False):
|
async def get_vod_url(url: str, headless: bool = False) -> str:
|
||||||
from playwright.sync_api import sync_playwright
|
from playwright.sync_api import sync_playwright
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
from playwright_stealth import stealth_async
|
from playwright_stealth import stealth_async
|
||||||
@@ -451,7 +456,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
"--no-first-run",
|
"--no-first-run",
|
||||||
"--no-zygote",
|
"--no-zygote",
|
||||||
# "--single-process",
|
# "--single-process",
|
||||||
# "--disable-gpu",
|
"--disable-gpu",
|
||||||
"--use-gl=egl",
|
"--use-gl=egl",
|
||||||
"--disable-blink-features=AutomationControlled",
|
"--disable-blink-features=AutomationControlled",
|
||||||
"--disable-background-networking",
|
"--disable-background-networking",
|
||||||
@@ -488,6 +493,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
# from playwright_stealth import stealth_sync
|
# from playwright_stealth import stealth_sync
|
||||||
|
|
||||||
async with async_playwright() as p:
|
async with async_playwright() as p:
|
||||||
|
try:
|
||||||
# browser = await p.chromium.launch(headless=headless, args=browser_args)
|
# browser = await p.chromium.launch(headless=headless, args=browser_args)
|
||||||
browser = await p.chromium.launch(headless=headless, args=browser_args)
|
browser = await p.chromium.launch(headless=headless, args=browser_args)
|
||||||
|
|
||||||
@@ -568,30 +574,15 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
|
|
||||||
logger.debug(f"run at {time.time() - start} sec")
|
logger.debug(f"run at {time.time() - start} sec")
|
||||||
|
|
||||||
# html_content = LogicAniLife.get_html_selenium(
|
|
||||||
# vod_url, "https://anilife.live"
|
|
||||||
# )
|
|
||||||
|
|
||||||
# html_content = LogicAniLife.get_html_playwright(
|
|
||||||
# vod_url, False, referer="https://anilife.live"
|
|
||||||
# )
|
|
||||||
|
|
||||||
# html_content = LogicAniLife.get_html(
|
|
||||||
# vod_url, referer="https://anilife.live"
|
|
||||||
# )
|
|
||||||
# html_content = LogicAniLife.get_html_requests(
|
|
||||||
# vod_url, referer="https://anilife.live"
|
|
||||||
# )
|
|
||||||
|
|
||||||
# print(f"html_content:: {html_content}")
|
|
||||||
# output_json = html_to_json.convert(html_content)
|
|
||||||
# resolution = output_json["html"][0]["body"][0]["_value"]
|
|
||||||
# logger.debug(f"output_json:: {resolution}")
|
|
||||||
|
|
||||||
return vod_url
|
return vod_url
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Exception:%s", e)
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
finally:
|
||||||
|
await browser.close()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_html_selenium(url, referer):
|
def get_html_selenium(url: str, referer: str) -> bytes:
|
||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
from selenium import webdriver
|
from selenium import webdriver
|
||||||
from selenium_stealth import stealth
|
from selenium_stealth import stealth
|
||||||
@@ -603,6 +594,8 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
options.add_argument("start-maximized")
|
options.add_argument("start-maximized")
|
||||||
options.add_argument("--headless")
|
options.add_argument("--headless")
|
||||||
options.add_argument("--no-sandbox")
|
options.add_argument("--no-sandbox")
|
||||||
|
options.add_argument("window-size=1920x1080")
|
||||||
|
options.add_argument("disable-gpu")
|
||||||
# options.add_argument('--no-sandbox')
|
# options.add_argument('--no-sandbox')
|
||||||
options.add_argument("--disable-dev-shm-usage")
|
options.add_argument("--disable-dev-shm-usage")
|
||||||
options.add_experimental_option("excludeSwitches", ["enable-automation"])
|
options.add_experimental_option("excludeSwitches", ["enable-automation"])
|
||||||
@@ -626,7 +619,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
|
|
||||||
stealth(
|
stealth(
|
||||||
driver,
|
driver,
|
||||||
languages=["en-US", "en"],
|
languages=["ko-KR", "ko"],
|
||||||
vendor="Google Inc.",
|
vendor="Google Inc.",
|
||||||
platform="Win32",
|
platform="Win32",
|
||||||
webgl_vendor="Intel Inc.",
|
webgl_vendor="Intel Inc.",
|
||||||
@@ -644,7 +637,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
for cookie in cookies_list:
|
for cookie in cookies_list:
|
||||||
cookies_dict[cookie["name"]] = cookie["value"]
|
cookies_dict[cookie["name"]] = cookie["value"]
|
||||||
|
|
||||||
logger.debug(cookies_dict)
|
# logger.debug(cookies_dict)
|
||||||
LogicAniLife.cookies = cookies_list
|
LogicAniLife.cookies = cookies_list
|
||||||
# LogicAniLife.headers["Cookie"] = driver.get_cookies()
|
# LogicAniLife.headers["Cookie"] = driver.get_cookies()
|
||||||
LogicAniLife.episode_url = driver.current_url
|
LogicAniLife.episode_url = driver.current_url
|
||||||
@@ -652,6 +645,8 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
elem = driver.find_element(By.XPATH, "//*")
|
elem = driver.find_element(By.XPATH, "//*")
|
||||||
source_code = elem.get_attribute("outerHTML")
|
source_code = elem.get_attribute("outerHTML")
|
||||||
|
|
||||||
|
driver.close()
|
||||||
|
|
||||||
return source_code.encode("utf-8")
|
return source_code.encode("utf-8")
|
||||||
|
|
||||||
# Create a request interceptor
|
# Create a request interceptor
|
||||||
@@ -748,7 +743,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
# print(scraper.get(url, headers=LogicAniLife.headers).content)
|
# print(scraper.get(url, headers=LogicAniLife.headers).content)
|
||||||
# print(scraper.get(url).content)
|
# print(scraper.get(url).content)
|
||||||
# return scraper.get(url, headers=LogicAniLife.headers).content
|
# return scraper.get(url, headers=LogicAniLife.headers).content
|
||||||
print(LogicAniLife.headers)
|
# print(LogicAniLife.headers)
|
||||||
return sess.get(
|
return sess.get(
|
||||||
url, headers=LogicAniLife.session.headers, timeout=10, allow_redirects=True
|
url, headers=LogicAniLife.session.headers, timeout=10, allow_redirects=True
|
||||||
).content.decode("utf8", errors="replace")
|
).content.decode("utf8", errors="replace")
|
||||||
@@ -761,6 +756,8 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
arg = P.ModelSetting.to_dict()
|
arg = P.ModelSetting.to_dict()
|
||||||
arg["sub"] = self.name
|
arg["sub"] = self.name
|
||||||
if sub in ["setting", "queue", "list", "category", "request"]:
|
if sub in ["setting", "queue", "list", "category", "request"]:
|
||||||
|
if sub == "request" and req.args.get("content_code") is not None:
|
||||||
|
arg["anilife_current_code"] = req.args.get("content_code")
|
||||||
if sub == "setting":
|
if sub == "setting":
|
||||||
job_id = "%s_%s" % (self.P.package_name, self.name)
|
job_id = "%s_%s" % (self.P.package_name, self.name)
|
||||||
arg["scheduler"] = str(scheduler.is_include(job_id))
|
arg["scheduler"] = str(scheduler.is_include(job_id))
|
||||||
@@ -799,6 +796,37 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
return jsonify(
|
return jsonify(
|
||||||
{"ret": "success", "cate": cate, "page": page, "data": data}
|
{"ret": "success", "cate": cate, "page": page, "data": data}
|
||||||
)
|
)
|
||||||
|
elif sub == "complete_list":
|
||||||
|
data = []
|
||||||
|
|
||||||
|
cate = request.form["type"]
|
||||||
|
logger.debug("cate:: %s", cate)
|
||||||
|
page = request.form["page"]
|
||||||
|
|
||||||
|
data = self.get_anime_info(cate, page)
|
||||||
|
# self.current_data = data
|
||||||
|
return jsonify(
|
||||||
|
{"ret": "success", "cate": cate, "page": page, "data": data}
|
||||||
|
)
|
||||||
|
elif sub == "search":
|
||||||
|
data = []
|
||||||
|
# cate = request.form["type"]
|
||||||
|
# page = request.form["page"]
|
||||||
|
cate = request.form["type"]
|
||||||
|
query = request.form["query"]
|
||||||
|
page = request.form["page"]
|
||||||
|
|
||||||
|
data = self.get_search_result(query, page, cate)
|
||||||
|
# self.current_data = data
|
||||||
|
return jsonify(
|
||||||
|
{
|
||||||
|
"ret": "success",
|
||||||
|
"cate": cate,
|
||||||
|
"page": page,
|
||||||
|
"query": query,
|
||||||
|
"data": data,
|
||||||
|
}
|
||||||
|
)
|
||||||
elif sub == "add_queue":
|
elif sub == "add_queue":
|
||||||
logger.debug(f"add_queue routine ===============")
|
logger.debug(f"add_queue routine ===============")
|
||||||
ret = {}
|
ret = {}
|
||||||
@@ -835,11 +863,67 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
thread.daemon = True
|
thread.daemon = True
|
||||||
thread.start()
|
thread.start()
|
||||||
return jsonify("")
|
return jsonify("")
|
||||||
|
elif sub == "web_list":
|
||||||
|
return jsonify(ModelAniLifeItem.web_list(request))
|
||||||
|
elif sub == "db_remove":
|
||||||
|
return jsonify(ModelAniLifeItem.delete_by_id(req.form["id"]))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
P.logger.error("Exception:%s", e)
|
P.logger.error("Exception:%s", e)
|
||||||
P.logger.error(traceback.format_exc())
|
P.logger.error(traceback.format_exc())
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def add_whitelist(*args):
|
||||||
|
ret = {}
|
||||||
|
|
||||||
|
logger.debug(f"args: {args}")
|
||||||
|
try:
|
||||||
|
|
||||||
|
if len(args) == 0:
|
||||||
|
code = str(LogicAniLife.current_data["code"])
|
||||||
|
else:
|
||||||
|
code = str(args[0])
|
||||||
|
|
||||||
|
print(code)
|
||||||
|
|
||||||
|
whitelist_program = P.ModelSetting.get("anilife_auto_code_list")
|
||||||
|
# whitelist_programs = [
|
||||||
|
# str(x.strip().replace(" ", ""))
|
||||||
|
# for x in whitelist_program.replace("\n", "|").split("|")
|
||||||
|
# ]
|
||||||
|
whitelist_programs = [
|
||||||
|
str(x.strip()) for x in whitelist_program.replace("\n", "|").split("|")
|
||||||
|
]
|
||||||
|
|
||||||
|
if code not in whitelist_programs:
|
||||||
|
whitelist_programs.append(code)
|
||||||
|
whitelist_programs = filter(
|
||||||
|
lambda x: x != "", whitelist_programs
|
||||||
|
) # remove blank code
|
||||||
|
whitelist_program = "|".join(whitelist_programs)
|
||||||
|
entity = (
|
||||||
|
db.session.query(P.ModelSetting)
|
||||||
|
.filter_by(key="anilife_auto_code_list")
|
||||||
|
.with_for_update()
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
entity.value = whitelist_program
|
||||||
|
db.session.commit()
|
||||||
|
ret["ret"] = True
|
||||||
|
ret["code"] = code
|
||||||
|
if len(args) == 0:
|
||||||
|
return LogicAniLife.current_data
|
||||||
|
else:
|
||||||
|
return ret
|
||||||
|
else:
|
||||||
|
ret["ret"] = False
|
||||||
|
ret["log"] = "이미 추가되어 있습니다."
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Exception:%s", e)
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
ret["ret"] = False
|
||||||
|
ret["log"] = str(e)
|
||||||
|
return ret
|
||||||
|
|
||||||
def setting_save_after(self):
|
def setting_save_after(self):
|
||||||
if self.queue.get_max_ffmpeg_count() != P.ModelSetting.get_int(
|
if self.queue.get_max_ffmpeg_count() != P.ModelSetting.get_int(
|
||||||
"anilife_max_ffmpeg_process_count"
|
"anilife_max_ffmpeg_process_count"
|
||||||
@@ -849,7 +933,12 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def scheduler_function(self):
|
def scheduler_function(self):
|
||||||
pass
|
logger.debug(f"ohli24 scheduler_function::=========================")
|
||||||
|
|
||||||
|
content_code_list = P.ModelSetting.get_list("ohli24_auto_code_list", "|")
|
||||||
|
url = f'{P.ModelSetting.get("anilife_url")}/dailyani'
|
||||||
|
if "all" in content_code_list:
|
||||||
|
ret_data = LogicAniLife.get_auto_anime_info(self, url=url)
|
||||||
|
|
||||||
def plugin_load(self):
|
def plugin_load(self):
|
||||||
self.queue = FfmpegQueue(
|
self.queue = FfmpegQueue(
|
||||||
@@ -885,8 +974,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
.text_content()
|
.text_content()
|
||||||
.strip()
|
.strip()
|
||||||
)
|
)
|
||||||
# print(des_items1)
|
|
||||||
# print(len(des_items))
|
|
||||||
des = {}
|
des = {}
|
||||||
des_key = [
|
des_key = [
|
||||||
"_otit",
|
"_otit",
|
||||||
@@ -926,8 +1014,8 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
"최근 방영일": "_recent_date",
|
"최근 방영일": "_recent_date",
|
||||||
"개봉년도": "_release_year",
|
"개봉년도": "_release_year",
|
||||||
}
|
}
|
||||||
print(main_title)
|
# print(main_title)
|
||||||
print(image)
|
# print(image)
|
||||||
# print(des_items)
|
# print(des_items)
|
||||||
|
|
||||||
list_body_li = tree.xpath('//div[@class="eplister"]/ul/li')
|
list_body_li = tree.xpath('//div[@class="eplister"]/ul/li')
|
||||||
@@ -1036,9 +1124,9 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
logger.info("url:::> %s", url)
|
logger.info("url:::> %s", url)
|
||||||
data = {}
|
data = {}
|
||||||
response_data = LogicAniLife.get_html(url, timeout=10)
|
response_data = LogicAniLife.get_html(url, timeout=10)
|
||||||
print(response_data)
|
# logger.debug(response_data)
|
||||||
|
|
||||||
logger.debug(f"wrapper_xath:: {wrapper_xpath}")
|
# logger.debug(f"wrapper_xath:: {wrapper_xpath}")
|
||||||
tree = html.fromstring(response_data)
|
tree = html.fromstring(response_data)
|
||||||
tmp_items = tree.xpath(wrapper_xpath)
|
tmp_items = tree.xpath(wrapper_xpath)
|
||||||
data["anime_count"] = len(tmp_items)
|
data["anime_count"] = len(tmp_items)
|
||||||
@@ -1050,7 +1138,7 @@ class LogicAniLife(LogicModuleBase):
|
|||||||
# logger.debug(entity["link"])
|
# logger.debug(entity["link"])
|
||||||
p = re.compile(r"^[http?s://]+[a-zA-Z0-9-]+/[a-zA-Z0-9-_.?=]+$")
|
p = re.compile(r"^[http?s://]+[a-zA-Z0-9-]+/[a-zA-Z0-9-_.?=]+$")
|
||||||
|
|
||||||
print(p.match(entity["link"]) != None)
|
# print(p.match(entity["link"]) != None)
|
||||||
if p.match(entity["link"]) is None:
|
if p.match(entity["link"]) is None:
|
||||||
entity["link"] = P.ModelSetting.get("anilife_url") + entity["link"]
|
entity["link"] = P.ModelSetting.get("anilife_url") + entity["link"]
|
||||||
# real_url = LogicAniLife.get_real_link(url=entity["link"])
|
# real_url = LogicAniLife.get_real_link(url=entity["link"])
|
||||||
@@ -1126,7 +1214,7 @@ class AniLifeQueueEntity(FfmpegQueueEntity):
|
|||||||
self.module_logic.socketio_callback("status", self.as_dict())
|
self.module_logic.socketio_callback("status", self.as_dict())
|
||||||
|
|
||||||
def info_dict(self, tmp):
|
def info_dict(self, tmp):
|
||||||
logger.debug("self.info::> %s", self.info)
|
# logger.debug("self.info::> %s", self.info)
|
||||||
for key, value in self.info.items():
|
for key, value in self.info.items():
|
||||||
tmp[key] = value
|
tmp[key] = value
|
||||||
tmp["vtt"] = self.vtt
|
tmp["vtt"] = self.vtt
|
||||||
@@ -1200,7 +1288,7 @@ class AniLifeQueueEntity(FfmpegQueueEntity):
|
|||||||
match = re.compile(regex).search(text)
|
match = re.compile(regex).search(text)
|
||||||
|
|
||||||
jawcloud_url = None
|
jawcloud_url = None
|
||||||
print(match)
|
# print(match)
|
||||||
if match:
|
if match:
|
||||||
jawcloud_url = match.group("jawcloud_url")
|
jawcloud_url = match.group("jawcloud_url")
|
||||||
|
|
||||||
@@ -1318,6 +1406,10 @@ class ModelAniLifeItem(db.Model):
|
|||||||
)
|
)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
db.session.add(self)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_by_id(cls, idx):
|
def get_by_id(cls, idx):
|
||||||
return db.session.query(cls).filter_by(id=idx).first()
|
return db.session.query(cls).filter_by(id=idx).first()
|
||||||
@@ -1326,9 +1418,28 @@ class ModelAniLifeItem(db.Model):
|
|||||||
def get_by_anilife_id(cls, anilife_id):
|
def get_by_anilife_id(cls, anilife_id):
|
||||||
return db.session.query(cls).filter_by(anilife_id=anilife_id).first()
|
return db.session.query(cls).filter_by(anilife_id=anilife_id).first()
|
||||||
|
|
||||||
def save(self):
|
@classmethod
|
||||||
db.session.add(self)
|
def delete_by_id(cls, idx):
|
||||||
|
db.session.query(cls).filter_by(id=idx).delete()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
return True
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def web_list(cls, req):
|
||||||
|
ret = {}
|
||||||
|
page = int(req.form["page"]) if "page" in req.form else 1
|
||||||
|
page_size = 30
|
||||||
|
job_id = ""
|
||||||
|
search = req.form["search_word"] if "search_word" in req.form else ""
|
||||||
|
option = req.form["option"] if "option" in req.form else "all"
|
||||||
|
order = req.form["order"] if "order" in req.form else "desc"
|
||||||
|
query = cls.make_query(search=search, order=order, option=option)
|
||||||
|
count = query.count()
|
||||||
|
query = query.limit(page_size).offset((page - 1) * page_size)
|
||||||
|
lists = query.all()
|
||||||
|
ret["list"] = [item.as_dict() for item in lists]
|
||||||
|
ret["paging"] = Util.get_paging_info(count, page, page_size)
|
||||||
|
return ret
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def make_query(cls, search="", order="desc", option="all"):
|
def make_query(cls, search="", order="desc", option="all"):
|
||||||
@@ -1356,6 +1467,10 @@ class ModelAniLifeItem(db.Model):
|
|||||||
)
|
)
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_list_uncompleted(cls):
|
||||||
|
return db.session.query(cls).filter(cls.status != "completed").all()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def append(cls, q):
|
def append(cls, q):
|
||||||
item = ModelAniLifeItem()
|
item = ModelAniLifeItem()
|
||||||
|
|||||||
@@ -804,7 +804,7 @@ class Ohli24QueueEntity(FfmpegQueueEntity):
|
|||||||
ourls = parse.urlparse(url)
|
ourls = parse.urlparse(url)
|
||||||
|
|
||||||
headers = {
|
headers = {
|
||||||
"referer": f"{ourls.scheme}://{ourls.netloc}",
|
"Referer": f"{ourls.scheme}://{ourls.netloc}",
|
||||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Whale/3.12.129.46 Safari/537.36",
|
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Whale/3.12.129.46 Safari/537.36",
|
||||||
}
|
}
|
||||||
logger.debug("make_episode_info()::url==> %s", url)
|
logger.debug("make_episode_info()::url==> %s", url)
|
||||||
|
|||||||
@@ -1,5 +1,25 @@
|
|||||||
{% extends "base.html" %} {% block content %}
|
{% extends "base.html" %} {% block content %}
|
||||||
|
<div id="preloader">
|
||||||
|
<div class='demo'>
|
||||||
|
<!-- <div class="loader-inner">-->
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<!-- </div>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="input-group mb-2">
|
<div class="input-group mb-2">
|
||||||
<input
|
<input
|
||||||
id="input_search"
|
id="input_search"
|
||||||
@@ -9,7 +29,7 @@
|
|||||||
aria-label="Search"
|
aria-label="Search"
|
||||||
aria-describedby="search-addon"
|
aria-describedby="search-addon"
|
||||||
/>
|
/>
|
||||||
<button id="btn_search" type="button" class="btn btn-outline-primary">
|
<button id="btn_search" type="button" class="btn btn-primary">
|
||||||
search
|
search
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -70,6 +90,13 @@
|
|||||||
enableAutoReload: true // it will reload the new image when validating attributes changes
|
enableAutoReload: true // it will reload the new image when validating attributes changes
|
||||||
});
|
});
|
||||||
observer.observe();
|
observer.observe();
|
||||||
|
const loader = document.getElementById("preloader");
|
||||||
|
|
||||||
|
const dismissLoadingScreen = async function () {
|
||||||
|
console.log("Before the delay")
|
||||||
|
// await delay(2.5);
|
||||||
|
loader.style.display = "none";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const get_anime_list = (type, page) => {
|
const get_anime_list = (type, page) => {
|
||||||
@@ -128,6 +155,7 @@
|
|||||||
div_visible = true
|
div_visible = true
|
||||||
console.log(div_visible)
|
console.log(div_visible)
|
||||||
}
|
}
|
||||||
|
dismissLoadingScreen()
|
||||||
next_page = page + 1
|
next_page = page + 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -652,5 +680,134 @@
|
|||||||
button.btn-favorite {
|
button.btn-favorite {
|
||||||
background-color: #e0ff42;
|
background-color: #e0ff42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: NanumSquareNeo, system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-image: linear-gradient(90deg, #233f48, #6c6fa2, #768dae);
|
||||||
|
}
|
||||||
|
|
||||||
|
.demo {
|
||||||
|
width: 100px;
|
||||||
|
height: 102px;
|
||||||
|
border-radius: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 45%;
|
||||||
|
left: calc(50% - 50px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle .inner {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 100%;
|
||||||
|
border: 5px solid rgba(0, 255, 170, 0.7);
|
||||||
|
border-right: none;
|
||||||
|
border-top: none;
|
||||||
|
backgroudn-clip: padding;
|
||||||
|
box-shadow: inset 0px 0px 10px rgba(0, 255, 170, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(0) {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(0) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(1) {
|
||||||
|
transform: rotate(70deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(1) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(2) {
|
||||||
|
transform: rotate(140deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(2) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.demo {
|
||||||
|
-webkit-animation: spin 5s infinite linear;
|
||||||
|
animation: spin 5s infinite linear;
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
/*position: fixed;*/
|
||||||
|
right: 0;
|
||||||
|
/*top: 0;*/
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
margin: 0 auto;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-inner {
|
||||||
|
bottom: 0;
|
||||||
|
height: 60px;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#preloader {
|
||||||
|
/*background-color: green;*/
|
||||||
|
/*color: white;*/
|
||||||
|
/*height: 100vh;*/
|
||||||
|
/*width: 100%;*/
|
||||||
|
/*position: fixed;*/
|
||||||
|
/*z-index: 100;*/
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
172
templates/anime_downloader_anilife_list.html
Normal file
172
templates/anime_downloader_anilife_list.html
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<form id="form_search" class="form-inline" style="text-align:left">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row show-grid">
|
||||||
|
<span class="col-md-4">
|
||||||
|
<select id="order" name="order" class="form-control form-control-sm">
|
||||||
|
<option value="desc">최근순</option>
|
||||||
|
<option value="asc">오래된순</option>
|
||||||
|
</select>
|
||||||
|
<select id="option" name="option" class="form-control form-control-sm">
|
||||||
|
<option value="all">전체</option>
|
||||||
|
<option value="completed">완료</option>
|
||||||
|
</select>
|
||||||
|
</span>
|
||||||
|
<span class="col-md-8">
|
||||||
|
<input id="search_word" name="search_word" class="form-control form-control-sm w-75" type="text" placeholder="" aria-label="Search">
|
||||||
|
<button id="search" class="btn btn-sm btn-outline-success">검색</button>
|
||||||
|
<button id="reset_btn" class="btn btn-sm btn-outline-success">리셋</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div id='page1'></div>
|
||||||
|
{{ macros.m_hr_head_top() }}
|
||||||
|
{{ macros.m_row_start('0') }}
|
||||||
|
{{ macros.m_col(2, macros.m_strong('Poster')) }}
|
||||||
|
{{ macros.m_col(10, macros.m_strong('Info')) }}
|
||||||
|
{{ macros.m_row_end() }}
|
||||||
|
{{ macros.m_hr_head_bottom() }}
|
||||||
|
<div id="list_div"></div>
|
||||||
|
<div id='page2'></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var package_name = "{{arg['package_name']}}";
|
||||||
|
var sub = "{{arg['sub']}}";
|
||||||
|
var current_data = null;
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
global_sub_request_search('1');
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#search").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
global_sub_request_search('1');
|
||||||
|
});
|
||||||
|
|
||||||
|
$("body").on('click', '#page', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
global_sub_request_search($(this).data('page'));
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#reset_btn").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
document.getElementById("order").value = 'desc';
|
||||||
|
document.getElementById("option").value = 'all';
|
||||||
|
document.getElementById("search_word").value = '';
|
||||||
|
global_sub_request_search('1')
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$("body").on('click', '#json_btn', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var id = $(this).data('id');
|
||||||
|
for (i in current_data.list) {
|
||||||
|
if (current_data.list[i].id == id) {
|
||||||
|
m_modal(current_data.list[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("body").on('click', '#self_search_btn', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var search_word = $(this).data('title');
|
||||||
|
document.getElementById("search_word").value = search_word;
|
||||||
|
global_sub_request_search('1')
|
||||||
|
});
|
||||||
|
|
||||||
|
$("body").on('click', '#remove_btn', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
id = $(this).data('id');
|
||||||
|
$.ajax({
|
||||||
|
url: '/'+package_name+'/ajax/'+sub+ '/db_remove',
|
||||||
|
type: "POST",
|
||||||
|
cache: false,
|
||||||
|
data: {id:id},
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
if (data) {
|
||||||
|
$.notify('<strong>삭제되었습니다.</strong>', {
|
||||||
|
type: 'success'
|
||||||
|
});
|
||||||
|
global_sub_request_search(current_data.paging.current_page, false)
|
||||||
|
} else {
|
||||||
|
$.notify('<strong>삭제 실패</strong>', {
|
||||||
|
type: 'warning'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("body").on('click', '#request_btn', function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var content_code = $(this).data('content_code');
|
||||||
|
$(location).attr('href', '/' + package_name + '/' + sub + '/request?content_code=' + content_code)
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function make_list(data) {
|
||||||
|
//console.log(data)
|
||||||
|
str = '';
|
||||||
|
for (i in data) {
|
||||||
|
//console.log(data[i])
|
||||||
|
str += m_row_start();
|
||||||
|
str += m_col(1, data[i].id);
|
||||||
|
tmp = (data[i].status == 'completed') ? '완료' : '미완료';
|
||||||
|
str += m_col(1, tmp);
|
||||||
|
tmp = data[i].created_time + '(추가)';
|
||||||
|
if (data[i].completed_time != null)
|
||||||
|
tmp += data[i].completed_time + '(완료)';
|
||||||
|
str += m_col(3, tmp)
|
||||||
|
tmp = data[i].savepath + '<br>' + data[i].filename + '<br><br>';
|
||||||
|
tmp2 = m_button('json_btn', 'JSON', [{'key':'id', 'value':data[i].id}]);
|
||||||
|
tmp2 += m_button('request_btn', '작품 검색', [{'key':'content_code', 'value':data[i].content_code}]);
|
||||||
|
tmp2 += m_button('self_search_btn', '목록 검색', [{'key':'title', 'value':data[i].title}]);
|
||||||
|
tmp2 += m_button('remove_btn', '삭제', [{'key':'id', 'value':data[i].id}]);
|
||||||
|
tmp += m_button_group(tmp2)
|
||||||
|
str += m_col(7, tmp)
|
||||||
|
str += m_row_end();
|
||||||
|
if (i != data.length -1) str += m_hr();
|
||||||
|
}
|
||||||
|
document.getElementById("list_div").innerHTML = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
/*height: 100vh;*/
|
||||||
|
/*display: flex;*/
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background-size: 300% 300%;
|
||||||
|
background-image: linear-gradient(
|
||||||
|
-45deg,
|
||||||
|
rgba(59,173,227,1) 0%,
|
||||||
|
rgba(87,111,230,1) 25%,
|
||||||
|
rgba(152,68,183,1) 51%,
|
||||||
|
rgba(255,53,127,1) 100%
|
||||||
|
);
|
||||||
|
animation: AnimateBG 20s ease infinite;
|
||||||
|
}
|
||||||
|
#main_container {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes AnimateBG {
|
||||||
|
0%{background-position:0% 50%}
|
||||||
|
50%{background-position:100% 50%}
|
||||||
|
100%{background-position:0% 50%}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
@@ -1,10 +1,31 @@
|
|||||||
{% extends "base.html" %} {% block content %}
|
{% extends "base.html" %} {% block content %}
|
||||||
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
<div id="preloader" class="loader">
|
||||||
|
<div class="loader-inner">
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<form id="program_list">
|
<form id="program_list">
|
||||||
{{ macros.setting_input_text_and_buttons('code', '작품 Code',
|
{{ macros.setting_input_text_and_buttons('code', '작품 Code',
|
||||||
[['analysis_btn', '분석'], ['go_anilife_btn', 'Go 애니라이프']], desc='예)
|
[['analysis_btn', '분석'], ['go_anilife_btn', 'Go 애니라이프']], desc='예)
|
||||||
"https://anilife.live/g/l?id=f6e83ec6-bd25-4d6c-9428-c10522687604" 이나 "f6e83ec6-bd25-4d6c-9428-c10522687604"') }}
|
"https://anilife.live/detail/id/101 예> 원피스 코드: 101"')
|
||||||
|
}}
|
||||||
</form>
|
</form>
|
||||||
<form id="program_auto_form">
|
<form id="program_auto_form">
|
||||||
<div id="episode_list"></div>
|
<div id="episode_list"></div>
|
||||||
@@ -23,7 +44,6 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function findGetParameter(parameterName) {
|
function findGetParameter(parameterName) {
|
||||||
let result = null,
|
let result = null,
|
||||||
tmp = [];
|
tmp = [];
|
||||||
@@ -35,7 +55,48 @@
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const loader = document.getElementById("preloader");
|
||||||
|
|
||||||
|
const dismissLoadingScreen = async function () {
|
||||||
|
console.log("Before the delay")
|
||||||
|
// await delay(2.5);
|
||||||
|
loader.style.display = "none";
|
||||||
|
};
|
||||||
|
|
||||||
|
const wait_seconds = function () {
|
||||||
|
// REFERENCE: https://www.w3schools.com/jsref/met_win_settimeout.asp
|
||||||
|
let result = setTimeout(dismissLoadingScreen, 2500);
|
||||||
|
console.log(result)
|
||||||
|
};
|
||||||
|
const init = function () {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function delay(n) {
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
setTimeout(resolve, n * 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function myAsyncFunction() {
|
||||||
|
//Do what you want here
|
||||||
|
console.log("Before the delay")
|
||||||
|
|
||||||
|
await delay(2.5);
|
||||||
|
|
||||||
|
console.log("After the delay")
|
||||||
|
//Do what you want here too
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// myAsyncFunction();
|
||||||
|
// window.addEventListener("DOMContentLoaded", dismissLoadingScreen);
|
||||||
|
|
||||||
|
// window.addEventListener("DOMContentLoaded", wait_seconds);
|
||||||
|
|
||||||
function analyze(wr_id, bo_table) {
|
function analyze(wr_id, bo_table) {
|
||||||
|
// e.preventDefault();
|
||||||
|
// e.stopPropagation()
|
||||||
// e.preventDefault();
|
// e.preventDefault();
|
||||||
const code = document.getElementById("code").value
|
const code = document.getElementById("code").value
|
||||||
console.log(code)
|
console.log(code)
|
||||||
@@ -50,6 +111,7 @@
|
|||||||
// {#console.log(ret.code)#}
|
// {#console.log(ret.code)#}
|
||||||
console.log(ret.data)
|
console.log(ret.data)
|
||||||
make_program(ret.data)
|
make_program(ret.data)
|
||||||
|
$("#loader").css("display", 'none')
|
||||||
} else {
|
} else {
|
||||||
$.notify('<strong>분석 실패</strong><br>' + ret.log, {type: 'warning'});
|
$.notify('<strong>분석 실패</strong><br>' + ret.log, {type: 'warning'});
|
||||||
}
|
}
|
||||||
@@ -59,7 +121,7 @@
|
|||||||
|
|
||||||
function make_program(data) {
|
function make_program(data) {
|
||||||
current_data = data;
|
current_data = data;
|
||||||
console.log("current_data::", current_data)
|
// console.log("current_data::", current_data)
|
||||||
str = '';
|
str = '';
|
||||||
tmp = '<div class="form-inline">'
|
tmp = '<div class="form-inline">'
|
||||||
tmp += m_button('check_download_btn', '선택 다운로드 추가', []);
|
tmp += m_button('check_download_btn', '선택 다운로드 추가', []);
|
||||||
@@ -100,7 +162,8 @@
|
|||||||
|
|
||||||
str += m_hr_black();
|
str += m_hr_black();
|
||||||
for (i in data.episode) {
|
for (i in data.episode) {
|
||||||
str += m_row_start(); tmp = '';
|
str += m_row_start();
|
||||||
|
tmp = '';
|
||||||
if (data.episode[i].thumbnail)
|
if (data.episode[i].thumbnail)
|
||||||
tmp = '<img src="' + data.episode[i].thumbnail + '" class="img-fluid">'
|
tmp = '<img src="' + data.episode[i].thumbnail + '" class="img-fluid">'
|
||||||
str += m_col(3, tmp)
|
str += m_col(3, tmp)
|
||||||
@@ -128,7 +191,7 @@
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("code").value = params.code
|
document.getElementById("code").value = params.code
|
||||||
// {#document.getElementById("analysis_btn").click();#}
|
document.getElementById("analysis_btn").click();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("{{arg['anilife_current_code']}}" !== "") {
|
if ("{{arg['anilife_current_code']}}" !== "") {
|
||||||
@@ -157,14 +220,16 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
$("#loader").css("display", 'none')
|
||||||
|
// console.log('wr_id::', params.wr_id)
|
||||||
|
|
||||||
console.log('wr_id::', params.wr_id)
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#analysis_btn").unbind("click").bind('click', function (e) {
|
$("#analysis_btn").unbind("click").bind('click', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
|
$("#loader").css("display", 'block')
|
||||||
const code = document.getElementById("code").value
|
const code = document.getElementById("code").value
|
||||||
console.log(code)
|
console.log(code)
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -174,10 +239,13 @@
|
|||||||
data: {code: code},
|
data: {code: code},
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function (ret) {
|
success: function (ret) {
|
||||||
|
$("#loader").css("display", 'none')
|
||||||
if (ret.ret === 'success' && ret.data != null) {
|
if (ret.ret === 'success' && ret.data != null) {
|
||||||
// {#console.log(ret.code)#}
|
// {#console.log(ret.code)#}
|
||||||
console.log(ret.data)
|
console.log(ret.data)
|
||||||
|
|
||||||
make_program(ret.data)
|
make_program(ret.data)
|
||||||
|
dismissLoadingScreen()
|
||||||
} else {
|
} else {
|
||||||
$.notify('<strong>분석 실패</strong><br>' + ret.log, {type: 'warning'});
|
$.notify('<strong>분석 실패</strong><br>' + ret.log, {type: 'warning'});
|
||||||
}
|
}
|
||||||
@@ -258,6 +326,7 @@
|
|||||||
button.code-button {
|
button.code-button {
|
||||||
min-width: 82px !important;
|
min-width: 82px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip {
|
.tooltip {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -306,6 +375,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-tooltip-text]:hover {
|
[data-tooltip-text]:hover {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
@@ -364,5 +434,136 @@
|
|||||||
#screen_movie_list {
|
#screen_movie_list {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#preloader {
|
||||||
|
/*background-color: green;*/
|
||||||
|
/*color: white;*/
|
||||||
|
/*height: 100vh;*/
|
||||||
|
/*width: 100%;*/
|
||||||
|
/*position: fixed;*/
|
||||||
|
/*z-index: 100;*/
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
background: rgb(0, 0, 0, 0.8);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-inner {
|
||||||
|
bottom: 0;
|
||||||
|
height: 60px;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap {
|
||||||
|
animation: spin 2000ms cubic-bezier(.175, .885, .32, 1.275) infinite;
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 50px;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
transform-origin: 50% 100%;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line {
|
||||||
|
border: 4px solid transparent;
|
||||||
|
border-radius: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 100px;
|
||||||
|
left: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(1) {
|
||||||
|
animation-delay: -50ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(2) {
|
||||||
|
animation-delay: -100ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(3) {
|
||||||
|
animation-delay: -150ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(4) {
|
||||||
|
animation-delay: -200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(5) {
|
||||||
|
animation-delay: -250ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(1) .loader-line {
|
||||||
|
border-color: hsl(0, 80%, 60%);
|
||||||
|
height: 90px;
|
||||||
|
width: 90px;
|
||||||
|
top: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(2) .loader-line {
|
||||||
|
border-color: hsl(60, 80%, 60%);
|
||||||
|
height: 76px;
|
||||||
|
width: 76px;
|
||||||
|
top: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(3) .loader-line {
|
||||||
|
border-color: hsl(120, 80%, 60%);
|
||||||
|
height: 62px;
|
||||||
|
width: 62px;
|
||||||
|
top: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(4) .loader-line {
|
||||||
|
border-color: hsl(180, 80%, 60%);
|
||||||
|
height: 48px;
|
||||||
|
width: 48px;
|
||||||
|
top: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(5) .loader-line {
|
||||||
|
border-color: hsl(240, 80%, 60%);
|
||||||
|
height: 34px;
|
||||||
|
width: 34px;
|
||||||
|
top: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0%, 15% {
|
||||||
|
transform: rotate(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,4 +1,24 @@
|
|||||||
{% extends "base.html" %} {% block content %}
|
{% extends "base.html" %} {% block content %}
|
||||||
|
<!--<div id="preloader"></div>-->
|
||||||
|
<div id="preloader" class="loader">
|
||||||
|
<div class="loader-inner">
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
<div class="loader-line-wrap">
|
||||||
|
<div class="loader-line"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="yommi_wrapper">
|
<div id="yommi_wrapper">
|
||||||
<div class="input-group mb-2">
|
<div class="input-group mb-2">
|
||||||
<input
|
<input
|
||||||
@@ -62,6 +82,21 @@
|
|||||||
let current_cate = ''
|
let current_cate = ''
|
||||||
let current_query = ''
|
let current_query = ''
|
||||||
|
|
||||||
|
const loader = document.getElementById("preloader");
|
||||||
|
|
||||||
|
const dismissLoadingScreen = function () {
|
||||||
|
loader.style.display = "none";
|
||||||
|
};
|
||||||
|
|
||||||
|
const wait3seconds = function () {
|
||||||
|
// REFERENCE: https://www.w3schools.com/jsref/met_win_settimeout.asp
|
||||||
|
const result = setTimeout(dismissLoadingScreen, 2000);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("load", wait3seconds);
|
||||||
|
// window.addEventListener("load", dismissLoadingScreen);
|
||||||
|
|
||||||
|
|
||||||
const observer = lozad('.lozad', {
|
const observer = lozad('.lozad', {
|
||||||
rootMargin: '10px 0px', // syntax similar to that of CSS Margin
|
rootMargin: '10px 0px', // syntax similar to that of CSS Margin
|
||||||
threshold: 0.1, // ratio of element convergence
|
threshold: 0.1, // ratio of element convergence
|
||||||
@@ -751,6 +786,137 @@
|
|||||||
background-image: linear-gradient(90deg, #233f48, #6c6fa2, #768dae);
|
background-image: linear-gradient(90deg, #233f48, #6c6fa2, #768dae);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#preloader {
|
||||||
|
/*background-color: green;*/
|
||||||
|
/*color: white;*/
|
||||||
|
/*height: 100vh;*/
|
||||||
|
/*width: 100%;*/
|
||||||
|
/*position: fixed;*/
|
||||||
|
/*z-index: 100;*/
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.loader {*/
|
||||||
|
/* background: rgb(0, 0, 0, 0.8);*/
|
||||||
|
/* background: radial-gradient(#222, #000);*/
|
||||||
|
/* bottom: 0;*/
|
||||||
|
/* left: 0;*/
|
||||||
|
/* overflow: hidden;*/
|
||||||
|
/* position: fixed;*/
|
||||||
|
/* right: 0;*/
|
||||||
|
/* top: 0;*/
|
||||||
|
/* z-index: 99999;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
.loader-inner {
|
||||||
|
bottom: 0;
|
||||||
|
height: 60px;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap {
|
||||||
|
animation: spin 2000ms cubic-bezier(.175, .885, .32, 1.275) infinite;
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 50px;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
transform-origin: 50% 100%;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line {
|
||||||
|
border: 4px solid transparent;
|
||||||
|
border-radius: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
height: 100px;
|
||||||
|
left: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(1) {
|
||||||
|
animation-delay: -50ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(2) {
|
||||||
|
animation-delay: -100ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(3) {
|
||||||
|
animation-delay: -150ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(4) {
|
||||||
|
animation-delay: -200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(5) {
|
||||||
|
animation-delay: -250ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(1) .loader-line {
|
||||||
|
border-color: hsl(0, 80%, 60%);
|
||||||
|
height: 90px;
|
||||||
|
width: 90px;
|
||||||
|
top: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(2) .loader-line {
|
||||||
|
border-color: hsl(60, 80%, 60%);
|
||||||
|
height: 76px;
|
||||||
|
width: 76px;
|
||||||
|
top: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(3) .loader-line {
|
||||||
|
border-color: hsl(120, 80%, 60%);
|
||||||
|
height: 62px;
|
||||||
|
width: 62px;
|
||||||
|
top: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(4) .loader-line {
|
||||||
|
border-color: hsl(180, 80%, 60%);
|
||||||
|
height: 48px;
|
||||||
|
width: 48px;
|
||||||
|
top: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-line-wrap:nth-child(5) .loader-line {
|
||||||
|
border-color: hsl(240, 80%, 60%);
|
||||||
|
height: 34px;
|
||||||
|
width: 34px;
|
||||||
|
top: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0%, 15% {
|
||||||
|
transform: rotate(0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/bootstrap-icons.css">
|
||||||
|
|||||||
@@ -1,5 +1,25 @@
|
|||||||
{% extends "base.html" %} {% block content %}
|
{% extends "base.html" %} {% block content %}
|
||||||
|
<div id="preloader">
|
||||||
|
<div class='demo'>
|
||||||
|
<!-- <div class="loader-inner">-->
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<div class='circle'>
|
||||||
|
<div class='inner'></div>
|
||||||
|
</div>
|
||||||
|
<!-- </div>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<form id="program_list">
|
<form id="program_list">
|
||||||
{{ macros.setting_input_text_and_buttons('code', '작품 Code',
|
{{ macros.setting_input_text_and_buttons('code', '작품 Code',
|
||||||
@@ -22,6 +42,19 @@
|
|||||||
get: (searchParams, prop) => searchParams.get(prop),
|
get: (searchParams, prop) => searchParams.get(prop),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const loader = document.getElementById("preloader");
|
||||||
|
|
||||||
|
const dismissLoadingScreen = function () {
|
||||||
|
loader.style.display = "none";
|
||||||
|
$('.demo').css("display", "none")
|
||||||
|
};
|
||||||
|
|
||||||
|
const wait3seconds = function () {
|
||||||
|
// REFERENCE: https://www.w3schools.com/jsref/met_win_settimeout.asp
|
||||||
|
const result = setTimeout(dismissLoadingScreen, 2000);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("load", wait3seconds);
|
||||||
|
|
||||||
|
|
||||||
function findGetParameter(parameterName) {
|
function findGetParameter(parameterName) {
|
||||||
@@ -85,7 +118,6 @@
|
|||||||
tmp += m_row_start(2) + m_col(3, '원제', 'right') + m_col(9, data.des._otit) + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '원제', 'right') + m_col(9, data.des._otit) + m_row_end();
|
||||||
tmp += m_row_start(2) + m_col(3, '감독', 'right') + m_col(9, data.des._dir) + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '감독', 'right') + m_col(9, data.des._dir) + m_row_end();
|
||||||
tmp += m_row_start(2) + m_col(3, '제작사', 'right') + m_col(9, data.des._pub) + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '제작사', 'right') + m_col(9, data.des._pub) + m_row_end();
|
||||||
{#tmp += m_row_start(2) + m_col(3, '장르', 'right') + m_col(9, data.des._tag.join(' | ')) + m_row_end();#}
|
|
||||||
tmp += m_row_start(2) + m_col(3, '장르', 'right') + m_col(9, data.des._tag) + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '장르', 'right') + m_col(9, data.des._tag) + m_row_end();
|
||||||
tmp += m_row_start(2) + m_col(3, '분류', 'right') + m_col(9, data.des._classifi) + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '분류', 'right') + m_col(9, data.des._classifi) + m_row_end();
|
||||||
tmp += m_row_start(2) + m_col(3, '방영일', 'right') + m_col(9, data.date + '(' + data.day + ')') + m_row_end();
|
tmp += m_row_start(2) + m_col(3, '방영일', 'right') + m_col(9, data.date + '(' + data.day + ')') + m_row_end();
|
||||||
@@ -98,7 +130,8 @@
|
|||||||
|
|
||||||
str += m_hr_black();
|
str += m_hr_black();
|
||||||
for (i in data.episode) {
|
for (i in data.episode) {
|
||||||
str += m_row_start(); tmp = '';
|
str += m_row_start();
|
||||||
|
tmp = '';
|
||||||
if (data.episode[i].thumbnail)
|
if (data.episode[i].thumbnail)
|
||||||
tmp = '<img src="' + data.episode[i].thumbnail + '" class="img-fluid">'
|
tmp = '<img src="' + data.episode[i].thumbnail + '" class="img-fluid">'
|
||||||
str += m_col(3, tmp)
|
str += m_col(3, tmp)
|
||||||
@@ -256,6 +289,7 @@
|
|||||||
button.code-button {
|
button.code-button {
|
||||||
min-width: 82px !important;
|
min-width: 82px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tooltip {
|
.tooltip {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -304,6 +338,7 @@
|
|||||||
left: 0;
|
left: 0;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-tooltip-text]:hover {
|
[data-tooltip-text]:hover {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
@@ -362,5 +397,151 @@
|
|||||||
#screen_movie_list {
|
#screen_movie_list {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*@import url(https://fonts.googleapis.com/css?family=Lato);*/
|
||||||
|
/*a {*/
|
||||||
|
/* position: fixed;*/
|
||||||
|
/* bottom: 2%;*/
|
||||||
|
/* display: block;*/
|
||||||
|
/* text-align: center;*/
|
||||||
|
/* color: #0fa;*/
|
||||||
|
/* font-family: "Lato", sans-serif;*/
|
||||||
|
/* text-decoration: none !important;*/
|
||||||
|
/* width: 100%;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*body, html {*/
|
||||||
|
/* width: 100%;*/
|
||||||
|
/* height: 100%;*/
|
||||||
|
/* overflow: hidden;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*body {*/
|
||||||
|
/* background: linear-gradient(90deg, #00b377, #00d68f);*/
|
||||||
|
/* box-shadow: inset 0px 0px 90px rgba(0, 0, 0, 0.5);*/
|
||||||
|
/* margin: 0px;*/
|
||||||
|
/* padding: 0px;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
.demo {
|
||||||
|
width: 100px;
|
||||||
|
height: 102px;
|
||||||
|
border-radius: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 45%;
|
||||||
|
left: calc(50% - 50px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle .inner {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 100%;
|
||||||
|
border: 5px solid rgba(0, 255, 170, 0.7);
|
||||||
|
border-right: none;
|
||||||
|
border-top: none;
|
||||||
|
backgroudn-clip: padding;
|
||||||
|
box-shadow: inset 0px 0px 10px rgba(0, 255, 170, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(0) {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(0) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(1) {
|
||||||
|
transform: rotate(70deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(1) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(2) {
|
||||||
|
transform: rotate(140deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle:nth-of-type(2) .inner {
|
||||||
|
-webkit-animation: spin 2s infinite linear;
|
||||||
|
animation: spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.demo {
|
||||||
|
-webkit-animation: spin 5s infinite linear;
|
||||||
|
animation: spin 5s infinite linear;
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
/*position: fixed;*/
|
||||||
|
right: 0;
|
||||||
|
/*top: 0;*/
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
margin: 0 auto;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader-inner {
|
||||||
|
bottom: 0;
|
||||||
|
height: 60px;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#preloader {
|
||||||
|
/*background-color: green;*/
|
||||||
|
/*color: white;*/
|
||||||
|
/*height: 100vh;*/
|
||||||
|
/*width: 100%;*/
|
||||||
|
/*position: fixed;*/
|
||||||
|
/*z-index: 100;*/
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
background: radial-gradient(#222, #000);
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
position: fixed;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
z-index: 99999;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user