diff --git a/.dockerignore b/.dockerignore
index a167b42c..8e05b4b9 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -19,5 +19,5 @@ coverage.xml
.pytest_cache
.hypothesis
-auto_bangumi/const_dev.py
+auto_bangumi/conf/const_dev.py
config/bangumi.json/config/bangumi.json
diff --git a/.gitignore b/.gitignore
index 451c94c8..5fa0a6bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -160,9 +160,10 @@ cython_debug/
#.idea/
# Custom
-/auto_bangumi/const_dev.py
+/auto_bangumi/conf/const_dev.py
/config/bangumi.json
/auto_bangumi/tester.py
/resource/names.txt
-/auto_bangumi/webui/
+
+
diff --git a/.idea/Bangumi_Auto_Rename.iml b/.idea/Bangumi_Auto_Rename.iml
index f79e6193..1c2660df 100644
--- a/.idea/Bangumi_Auto_Rename.iml
+++ b/.idea/Bangumi_Auto_Rename.iml
@@ -4,7 +4,7 @@
-
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index e863a931..37b833f1 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index cfee8c25..43d92eaf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -11,6 +11,6 @@ ENV TZ=Asia/Shanghai
ADD ./auto_bangumi /auto_bangumi
ADD ./config /config
+ADD ./templates /templates
-CMD [ "python3", "app.py"]
-CMD [ "uvicorn", "api:app", "--reload" ]
+CMD [ "run.sh"]
diff --git a/auto_bangumi/app.py b/auto_bangumi/app.py
index c21113eb..3919afa4 100644
--- a/auto_bangumi/app.py
+++ b/auto_bangumi/app.py
@@ -1,16 +1,16 @@
-from ast import arg
import os
import time
import logging
from conf import settings
-from argument_parser import parse
-from log import setup_logger
+from conf.argument_parser import parse
+from conf.log import setup_logger
from utils import json_config
-from core.rss_collector import RSSCollector
+from mikanani.rss_collector import RSSCollector
from core.download_client import DownloadClient
from core.renamer import Renamer
+from network.request import RequestsURL
logger = logging.getLogger(__name__)
@@ -55,42 +55,48 @@ def show_info():
logger.info("Starting AutoBangumi...")
-
def run():
+ # DEBUG 模式初始化
args = parse()
if args.debug:
try:
- from const_dev import DEV_SETTINGS
- import sys
+ from conf.const_dev import DEV_SETTINGS
+ settings.init(DEV_SETTINGS)
except ModuleNotFoundError:
logger.debug("Please copy `const_dev.py` to `const_dev.py` to use custom settings")
- sys.path.append('/opt/homebrew/Caskroom/miniforge/base/envs/auto_bangumi/bin/python')
- settings.init(DEV_SETTINGS)
else:
settings.init()
+ # 初始化
setup_logger()
show_info()
time.sleep(3)
download_client = DownloadClient()
+ url_request = RequestsURL()
download_client.init_downloader()
if settings.rss_link is None:
logger.error("Please add RIGHT RSS url.")
quit()
download_client.rss_feed()
- rss_collector = RSSCollector()
+ rss_collector = RSSCollector(url_request)
rename = Renamer(download_client)
+ # 主程序循环
while True:
bangumi_data = load_data_file()
try:
+ # 解析 RSS
rss_collector.collect(bangumi_data)
+ # 历史剧集收集
if settings.enable_eps_complete:
- download_client.eps_collect(bangumi_data["bangumi_info"])
+ download_client.eps_collect(bangumi_data["bangumi_info"], url_request)
+ url_request.close()
download_client.add_rules(bangumi_data["bangumi_info"], settings.rss_link)
+ # 首次等待
if bangumi_data["first_run"]:
logger.info(f"Waiting for downloading torrents...")
time.sleep(settings.first_sleep)
bangumi_data["first_run"] = False
save_data_file(bangumi_data)
+ # rename
if settings.method != "none":
rename.refresh()
rename.run()
diff --git a/auto_bangumi/bangumi_parser/fuzz_match.py b/auto_bangumi/bangumi_parser/fuzz_match.py
index d0e8ffb3..924bc890 100644
--- a/auto_bangumi/bangumi_parser/fuzz_match.py
+++ b/auto_bangumi/bangumi_parser/fuzz_match.py
@@ -42,7 +42,7 @@ class FuzzMatch:
if __name__ == "__main__":
- from const_dev import DEV_SETTINGS
+ from conf.const_dev import DEV_SETTINGS
settings.init(DEV_SETTINGS)
f = FuzzMatch()
name = "勇者、辞职不干了"
diff --git a/auto_bangumi/bangumi_parser/parser.py b/auto_bangumi/bangumi_parser/parser.py
index 1df585f0..7d7bc5cf 100644
--- a/auto_bangumi/bangumi_parser/parser.py
+++ b/auto_bangumi/bangumi_parser/parser.py
@@ -24,8 +24,8 @@ if __name__ == "__main__":
import sys, os
sys.path.append(os.path.dirname(".."))
- from log import setup_logger
- from const import BCOLORS
+ from conf.log import setup_logger
+ from conf.const import BCOLORS
setup_logger()
parser = Parser()
diff --git a/auto_bangumi/conf/__init__.py b/auto_bangumi/conf/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/auto_bangumi/argument_parser.py b/auto_bangumi/conf/argument_parser.py
similarity index 100%
rename from auto_bangumi/argument_parser.py
rename to auto_bangumi/conf/argument_parser.py
diff --git a/auto_bangumi/conf.py b/auto_bangumi/conf/conf.py
similarity index 100%
rename from auto_bangumi/conf.py
rename to auto_bangumi/conf/conf.py
diff --git a/auto_bangumi/const.py b/auto_bangumi/conf/const.py
similarity index 97%
rename from auto_bangumi/const.py
rename to auto_bangumi/conf/const.py
index 6bd7d0c7..aefd996a 100644
--- a/auto_bangumi/const.py
+++ b/auto_bangumi/conf/const.py
@@ -45,7 +45,8 @@ ENV_TO_ATTR = {
"AB_REMOVE_BAD_BT": ("remove_bad_torrent", lambda e: e.lower() in ("true", "1", "t")),
"AB_FIRST_SLEEP": ("first_sleep", lambda e: float(e)),
"AB_WEBUI_PORT": ("webui_port", lambda e: int(e)),
- "AB_FUZZ_MATCH": ("enable_fuzz_match", lambda e: e.lower() in ("true", "1", "t"))
+ "AB_FUZZ_MATCH": ("enable_fuzz_match", lambda e: e.lower() in ("true", "1", "t")),
+ "AB_HTTP_PROXY": "http_proxy"
}
diff --git a/auto_bangumi/log.py b/auto_bangumi/conf/log.py
similarity index 100%
rename from auto_bangumi/log.py
rename to auto_bangumi/conf/log.py
diff --git a/auto_bangumi/core/download_client.py b/auto_bangumi/core/download_client.py
index 6934e5d8..5ccfbe2d 100644
--- a/auto_bangumi/core/download_client.py
+++ b/auto_bangumi/core/download_client.py
@@ -8,7 +8,7 @@ from downloader.exceptions import ConflictError
from conf import settings
-from core.eps_complete import FullSeasonGet
+from mikanani.eps_complete import FullSeasonGet
logger = logging.getLogger(__name__)
@@ -81,7 +81,7 @@ class DownloadClient:
info["added"] = True
logger.info("Finished.")
- def eps_collect(self, bangumi_info):
+ def eps_collect(self, bangumi_info, request):
logger.info("Start collecting past episodes.")
for info in bangumi_info:
if info["download_past"]:
@@ -91,7 +91,8 @@ class DownloadClient:
info["season"],
info["subtitle"],
info["source"],
- info["dpi"]
+ info["dpi"],
+ request
).add_torrents_info()
for download in downloads:
self.client.torrents_add(
diff --git a/auto_bangumi/core/renamer.py b/auto_bangumi/core/renamer.py
index e0db38b5..c57fea9d 100644
--- a/auto_bangumi/core/renamer.py
+++ b/auto_bangumi/core/renamer.py
@@ -56,7 +56,7 @@ class Renamer:
if __name__ == "__main__":
- from const_dev import DEV_SETTINGS
+ from conf.const_dev import DEV_SETTINGS
settings.init(DEV_SETTINGS)
client = DownloadClient()
rename = Renamer(client)
diff --git a/auto_bangumi/downloader/qb_downloader.py b/auto_bangumi/downloader/qb_downloader.py
index 3ddf7bc5..900510d4 100644
--- a/auto_bangumi/downloader/qb_downloader.py
+++ b/auto_bangumi/downloader/qb_downloader.py
@@ -75,7 +75,7 @@ class QbDownloader:
if __name__ == "__main__":
try:
- from const_dev import DEV_SETTINGS
+ from conf.const_dev import DEV_SETTINGS
except ModuleNotFoundError:
logger.debug("Please copy `const_dev.py` to `const_dev.py` to use custom settings")
settings.init(DEV_SETTINGS)
diff --git a/auto_bangumi/mikanani/__init__.py b/auto_bangumi/mikanani/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/auto_bangumi/core/eps_complete.py b/auto_bangumi/mikanani/eps_complete.py
similarity index 85%
rename from auto_bangumi/core/eps_complete.py
rename to auto_bangumi/mikanani/eps_complete.py
index b1bcb10a..202105a1 100644
--- a/auto_bangumi/core/eps_complete.py
+++ b/auto_bangumi/mikanani/eps_complete.py
@@ -6,18 +6,20 @@ from bs4 import BeautifulSoup
import logging
from conf import settings
+from network.request import RequestsURL
logger = logging.getLogger(__name__)
class FullSeasonGet:
- def __init__(self, group, bangumi_name, season, sub, source, dpi):
+ def __init__(self, group, bangumi_name, season, sub, source, dpi , request: RequestsURL):
self.bangumi_name = re.sub(settings.rule_name_re, " ", bangumi_name).strip()
self.group = "" if group is None else group
self.season = season
self.subtitle = "" if sub is None else sub
self.source = "" if source is None else source
self.dpi = dpi
+ self._req = request
def get_season_rss(self):
if self.season == "S01":
@@ -26,11 +28,8 @@ class FullSeasonGet:
season = self.season
search_str = re.sub(r"[\W_]", "+",
f"{self.group} {self.bangumi_name} {season} {self.subtitle} {self.source} {self.dpi}")
- season = requests.get(
- f"https://mikanani.me/RSS/Search?searchstr={search_str}"
- )
- soup = BeautifulSoup(season.content, "xml")
- torrents = soup.find_all("enclosure")
+ season = self._req.get_url(search_str)
+ torrents = season.find_all("enclosure")
return torrents
def add_torrents_info(self):
diff --git a/auto_bangumi/core/rss_collector.py b/auto_bangumi/mikanani/rss_collector.py
similarity index 77%
rename from auto_bangumi/core/rss_collector.py
rename to auto_bangumi/mikanani/rss_collector.py
index b1875737..b4e9dedd 100644
--- a/auto_bangumi/core/rss_collector.py
+++ b/auto_bangumi/mikanani/rss_collector.py
@@ -1,29 +1,19 @@
# -*- coding: UTF-8 -*-
-import os
import logging
-import requests
-from bs4 import BeautifulSoup
from conf import settings
from bangumi_parser.analyser.rss_parser import ParserLV2
from bangumi_parser.fuzz_match import FuzzMatch
+from network.request import RequestsURL
logger = logging.getLogger(__name__)
class RSSCollector:
- def __init__(self):
+ def __init__(self, request: RequestsURL):
self._simple_analyser = ParserLV2()
self._fuzz_match = FuzzMatch()
-
- def get_rss_info(self, rss_link):
- try:
- req = requests.get(rss_link, "utf-8")
- rss = BeautifulSoup(req.text, "xml")
- return rss
- except Exception as e:
- # logger.exception(e)
- logger.error("ERROR with DNS/Connection.")
+ self._req = request
def title_parser(self, title, fuzz_match=True):
episode = self._simple_analyser.analyse(title)
@@ -53,8 +43,8 @@ class RSSCollector:
return episode, data, title_official
def collect(self, bangumi_data):
- rss = self.get_rss_info(settings.rss_link)
- items = rss.find_all("item")
+ req = self._req.get_url(settings.rss_link)
+ items = req.find_all("item")
for item in items:
add = True
name = item.title.string
@@ -70,19 +60,19 @@ class RSSCollector:
logger.info(f"Adding {title_official} Season {episode.season_info.number}")
def collect_collection(self, rss_link):
- rss = self.get_rss_info(rss_link)
- item = rss.find("item")
+ req = self._req.get_url(rss_link)
+ item = req.find("item")
title = item.title.string
_, data, _ = self.title_parser(title, fuzz_match=False)
return data
if __name__ == "__main__":
- from const_dev import DEV_SETTINGS
+ from conf.const_dev import DEV_SETTINGS
from utils import json_config
settings.init(DEV_SETTINGS)
rss = RSSCollector()
- info = json_config.load("/Users/Estrella/Developer/Bangumi_Auto_Collector/config/bangumi.json")
+ info = json_config.load("/config/bangumi.json")
rss.collect(info)
print(info)
diff --git a/auto_bangumi/network/__init__.py b/auto_bangumi/network/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/auto_bangumi/network/request.py b/auto_bangumi/network/request.py
new file mode 100644
index 00000000..4d0edcef
--- /dev/null
+++ b/auto_bangumi/network/request.py
@@ -0,0 +1,46 @@
+import time
+
+import requests
+import logging
+
+from bs4 import BeautifulSoup
+
+from conf import settings
+
+logger = logging.getLogger(__name__)
+
+
+class RequestsURL:
+ def __init__(self):
+ self.session = requests.session()
+ if settings.http_proxy is not None:
+ self.proxy = {
+ "https": settings.http_proxy,
+ "http": settings.http_proxy
+ }
+ else:
+ self.proxy = None
+
+ def get_url(self, url):
+ times = 1
+ while times < 5:
+ try:
+ req = self.session.get(url, proxies=self.proxy)
+ return BeautifulSoup(req.text, "xml")
+ except Exception:
+ # logger.exception(e)
+ logger.error("ERROR with DNS/Connection.")
+ time.sleep(settings.connect_retry_interval)
+ times += 1
+
+ def close(self):
+ self.session.close()
+
+
+if __name__ == "__main__":
+ network_req = RequestsURL()
+ req = network_req.get_url("https://mikanani.me/RSS/Classic")
+ print(req.find_all("item"))
+ network_req.close()
+ req = network_req.get_url("https://mikanani.me/RSS/Classic")
+ print(req.find_all("item"))
\ No newline at end of file
diff --git a/auto_bangumi/web.py b/auto_bangumi/web.py
index 83964aaa..008f2a7f 100644
--- a/auto_bangumi/web.py
+++ b/auto_bangumi/web.py
@@ -1,5 +1,3 @@
-from typing import Union
-
import uvicorn
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
@@ -7,7 +5,7 @@ from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
import logging
-from core.rss_collector import RSSCollector
+from mikanani.rss_collector import RSSCollector
from core.download_client import DownloadClient
from conf import settings
from utils import json_config
@@ -68,7 +66,7 @@ class RSS(BaseModel):
@app.post("/api/v1/subscriptions")
async def receive(link: RSS):
data = RSSCollector().collect_collection(link.link)
- from const_dev import DEV_SETTINGS
+ from conf.const_dev import DEV_SETTINGS
settings.init(DEV_SETTINGS)
client = DownloadClient()
client.add_collection_feed(link.link, item_path=data["title"])
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 00000000..7bb7f8e4
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,162 @@
+
+
+
+
+
+ AutoBangumi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Configuration
+
+
+
+
+
基础配置
+
+
+
+
+
+
+
RSS link
+
+
+
+
+
+
+
+
+
+
+
+
+
+
HOST
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Username
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Password
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download Path
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
进阶配置
+
+
+
+
+
+
字幕组 TAG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
历史补全
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
坏种移除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/index.js b/templates/index.js
new file mode 100644
index 00000000..58e33404
--- /dev/null
+++ b/templates/index.js
@@ -0,0 +1,5 @@
+function postConfig(){
+ var httpRequest = new XMLHttpRequest();
+ httpRequest.open("POST", "autobangumi", ture)
+
+}
\ No newline at end of file