Skip to content

Commit 159acbf

Browse files
authored
Merge pull request #41 from shininome/aio_test
0.1.1
2 parents 4fdf2ca + f800d33 commit 159acbf

31 files changed

Lines changed: 514 additions & 322 deletions

.github/workflows/build.yml

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
types:
66
- closed
77
branches:
8-
- main
8+
- aio_test
99
push:
1010

1111
jobs:
@@ -16,7 +16,7 @@ jobs:
1616
- name: Set up Python 3.11
1717
uses: actions/setup-python@v3
1818
with:
19-
python-version: '3.11'
19+
python-version: "3.11"
2020
- name: Install dependencies
2121
run: |
2222
python -m pip install --upgrade pip
@@ -121,12 +121,10 @@ jobs:
121121
steps:
122122
- name: Checkout
123123
uses: actions/checkout@v4
124-
125124
- name: Install Node.js
126125
uses: actions/setup-node@v4
127126
with:
128127
node-version: 20
129-
130128
- uses: pnpm/action-setup@v4
131129
name: Install pnpm
132130
with:
@@ -185,7 +183,7 @@ jobs:
185183
uses: docker/metadata-action@v4
186184
with:
187185
images: |
188-
estrellaxd/auto_bangumi
186+
shinonomeow/auto_bangumi
189187
ghcr.io/${{ github.repository }}
190188
tags: |
191189
type=raw,value=${{ needs.version-info.outputs.version }}
@@ -197,7 +195,7 @@ jobs:
197195
uses: docker/metadata-action@v4
198196
with:
199197
images: |
200-
estrellaxd/auto_bangumi
198+
shinonomeow/auto_bangumi
201199
ghcr.io/${{ github.repository }}
202200
tags: |
203201
type=raw,value=${{ needs.version-info.outputs.version }}
@@ -258,7 +256,7 @@ jobs:
258256
builder: ${{ steps.buildx.output.name }}
259257
platforms: linux/amd64,linux/arm64,linux/arm/v7
260258
push: false
261-
tags: estrellaxd/auto_bangumi:test
259+
tags: shinonomeow/auto_bangumi:test
262260
cache-from: type=gha, scope=${{ github.workflow }}
263261
cache-to: type=gha, scope=${{ github.workflow }}
264262

@@ -328,16 +326,3 @@ jobs:
328326
backend/app-v${{ needs.version-info.outputs.version }}.zip
329327
env:
330328
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
331-
332-
telegram:
333-
runs-on: ubuntu-latest
334-
needs: [release]
335-
steps:
336-
- name: send telegram message on push
337-
uses: appleboy/telegram-action@master
338-
with:
339-
to: ${{ secrets.TELEGRAM_TO }}
340-
token: ${{ secrets.TELEGRAM_TOKEN }}
341-
message: |
342-
New release: ${{ needs.release.outputs.version }}
343-
Link: ${{ needs.release.outputs.url }}

backend/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
anyio==3.7.0
2+
bencode.py ==4.0.0
23
bs4==0.0.1
34
certifi==2023.5.7
45
charset-normalizer==3.1.0

backend/src/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from module.conf import VERSION, settings, setup_logger
1212
from module.utils import load_image
1313

14-
setup_logger()
14+
setup_logger(reset=True)
1515
logger = logging.getLogger(__name__)
1616
uvicorn_logging_config = {
1717
"version": 1,
@@ -42,6 +42,7 @@ def create_app() -> FastAPI:
4242

4343
@app.get("/posters/{path:path}", tags=["posters"])
4444
async def posters(path: str):
45+
#FIX: windown path
4546
post_path = f"data/posters/{path}"
4647
if not os.path.exists(post_path):
4748
await load_image(path)

backend/src/module/api/rss.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from fastapi import APIRouter, Depends
22
from fastapi.responses import JSONResponse
33

4-
from module.downloader import DownloadClient
54
from module.manager import SeasonCollector
65
from module.models import (
76
APIResponse,

backend/src/module/conf/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
from .log import LOG_PATH, setup_logger
55
from .search_provider import SEARCH_CONFIG
66

7+
PLATFORM = "Windows" if "\\" in settings.downloader.path else "Unix"
78
TMDB_API = "291237f90b24267380d6176c98f7619f"
89
DATA_PATH = "sqlite:///data/data.db"
910
LEGACY_DATA_PATH = Path("data/data.json")
1011
VERSION_PATH = Path("config/version.info")
1112
POSTERS_PATH = Path("data/posters")
1213

13-
PLATFORM = "Windows" if "\\" in settings.downloader.path else "Unix"
14+
15+
if PLATFORM == "Windows":
16+
from pathlib import PureWindowsPath as Path
17+
else:
18+
from pathlib import Path
1419

1520
__all__ = [
1621
"VERSION",

backend/src/module/core/aiocore.py

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from abc import abstractmethod
44

55
from module.conf import settings
6+
from module.downloader import AsyncDownloadController
67
from module.manager import Renamer, eps_complete
78
from module.rss import RSSEngine
8-
from module.downloader import AsyncDownloadController
99

1010
logger = logging.getLogger(__name__)
1111

@@ -22,9 +22,15 @@ async def stop(self):
2222
for task in self.tasks:
2323
task.cancel()
2424
try:
25+
logger.debug(f"[AioCore]{task.get_name()} start cancel")
2526
await task
2627
except asyncio.CancelledError:
27-
logger.info(f"{task.get_name()} has canceled")
28+
logger.info(f"[AioCore]{task.get_name()} has canceled")
29+
except Exception as e:
30+
logger.debug(f"[AioCore] other Exception {e}")
31+
32+
# logger.info(f"[AioCore]{self.tasks}")
33+
self.tasks.clear()
2834

2935

3036
class AsyncRenamer(AsyncProgram):
@@ -34,15 +40,18 @@ def __init__(self):
3440

3541
async def run(self):
3642
await self.stop()
37-
task = asyncio.create_task(self.rename_task_loop(),name="renamer_loop")
43+
task = asyncio.create_task(
44+
self.rename_task_loop(),
45+
name="renamer_loop",
46+
)
3847
self.tasks.append(task)
3948

4049
async def rename_task(self):
41-
renamer = Renamer()
42-
task = asyncio.create_task(renamer.rename())
43-
self.tasks.append(task)
44-
await task
45-
self.tasks.remove(task)
50+
try:
51+
renamer = Renamer()
52+
await renamer.rename()
53+
except TimeoutError:
54+
logging.error("[Renamer Task] can not connect to downloader")
4655

4756
async def rename_task_loop(self):
4857
while True:
@@ -59,22 +68,25 @@ def __init__(self) -> None:
5968

6069
async def run(self):
6170
await self.stop()
62-
task = asyncio.create_task(self.rss_task_loop(),name="rss_loop"
63-
)
71+
task = asyncio.create_task(
72+
self.rss_task_loop(),
73+
name="rss_loop",
74+
)
6475
self.tasks.append(task)
6576

77+
async def rss_task(self):
78+
rss_engine = RSSEngine()
79+
await rss_engine.refresh_all_rss()
80+
if settings.bangumi_manage.eps_complete:
81+
await eps_complete()
82+
6683
async def rss_task_loop(self):
6784
while True:
6885
task = asyncio.create_task(self.rss_task())
6986
self.tasks.append(task)
7087
await asyncio.sleep(settings.program.rss_time)
7188
self.tasks.remove(task)
7289

73-
async def rss_task(self):
74-
rss_engine = RSSEngine()
75-
await rss_engine.refresh_all_rss()
76-
if settings.bangumi_manage.eps_complete:
77-
await eps_complete()
7890

7991
class AsyncDownload(AsyncProgram):
8092
def __init__(self) -> None:
@@ -83,31 +95,37 @@ def __init__(self) -> None:
8395

8496
async def run(self):
8597
await self.stop()
86-
task = asyncio.create_task(self.download_task_loop(),name="download_loop")
98+
task = asyncio.create_task(self.download_task_loop(), name="download_loop")
8799
self.tasks.append(task)
88100

89101
async def download_task_loop(self):
90102
while True:
91103
await self.download_task()
92104

93105
async def download_task(self):
94-
downloader = AsyncDownloadController()
95-
await downloader.download()
106+
try:
107+
downloader = AsyncDownloadController()
108+
await downloader.download()
109+
except TimeoutError:
110+
logging.error("[Renamer Task] can not connect to downloader")
111+
96112

97113
if __name__ == "__main__":
98114
import asyncio
99115

100116
from module.conf import setup_logger
101117

102-
logger = logging.getLogger(__name__)
103-
logger.setLevel(logging.DEBUG)
104-
logging.basicConfig(
105-
level=logging.INFO,
106-
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
107-
handlers=[logging.StreamHandler()],
108-
)
109-
110-
settings.log.debug_enable = True
111-
setup_logger()
112-
113-
asyncio.run(AsyncRenamer().rename_task_loop())
118+
if settings.bangumi_manage.eps_complete:
119+
print(1)
120+
# logger = logging.getLogger(__name__)
121+
# logger.setLevel(logging.DEBUG)
122+
# logging.basicConfig(
123+
# level=logging.INFO,
124+
# format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
125+
# handlers=[logging.StreamHandler()],
126+
# )
127+
#
128+
# settings.log.debug_enable = True
129+
# setup_logger()
130+
#
131+
# asyncio.run(AsyncRenamer().rename_task_loop())

backend/src/module/core/program.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async def startup(self):
5656
logger.info(
5757
"[Core] Legacy data detected, starting data migration, please wait patiently."
5858
)
59-
data_migration()
59+
await data_migration()
6060
elif self.program_status.version_update:
6161
# Update database
6262
await from_30_to_31()

backend/src/module/database/bangumi.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ def __init__(self, session: Session):
1414
self.session = session
1515

1616
def add(self, data: Bangumi):
17+
"""link 相同, official_title相同,就只补充,主要是为了
18+
一些会改名的
19+
20+
Args:
21+
data: [TODO:description]
22+
23+
Returns:
24+
[TODO:return]
25+
"""
1726
# 如果official_title 一致,将title_raw,group,更新
1827
statement = select(Bangumi).where(
1928
and_(
@@ -122,6 +131,7 @@ def search_url(self, rss_link: str) -> Bangumi | None:
122131
logger.debug(f"[Database] Find bangumi id: {rss_link}.")
123132
return self.session.exec(statement).first()
124133

134+
125135
def search_id(self, _id: int) -> Bangumi | None:
126136
statement = select(Bangumi).where(Bangumi.id == _id)
127137
bangumi = self.session.exec(statement).first()

backend/src/module/database/torrent.py

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import logging
22

3-
from sqlmodel import Session, false, select, true
3+
from sqlalchemy.sql import func
4+
from sqlmodel import Session, delete, false, select, true
45

5-
from module.models import Torrent, bangumi
6+
from module.models import Torrent
7+
from module.utils import get_hash
68

79
logger = logging.getLogger(__name__)
810

@@ -46,8 +48,27 @@ def update_one_user(self, data: Torrent):
4648
def search(self, _id: int) -> Torrent:
4749
return self.session.exec(select(Torrent).where(Torrent.id == _id)).first()
4850

49-
def search_bangumi(self,bangumi_id:int):
50-
return self.session.exec(select(Torrent).where(Torrent.bangumi_id == bangumi_id)).all()
51+
def search_hash(self, _hash: str) -> Torrent | None:
52+
statement = select(Torrent).where(func.instr(Torrent.url, _hash) > 0)
53+
return self.session.exec(statement).first()
54+
55+
def search_torrent(self, _hash, _name=None):
56+
if plain_hash := get_hash(_hash):
57+
_hash = plain_hash
58+
59+
torrent_item = self.search_hash(_hash)
60+
if not torrent_item and _name:
61+
torrent_item = self.search_name(_name)
62+
return torrent_item
63+
64+
def search_name(self, name: str):
65+
statement = select(Torrent).where(Torrent.name == name)
66+
return self.session.exec(statement).first()
67+
68+
def search_bangumi(self, bangumi_id: int):
69+
return self.session.exec(
70+
select(Torrent).where(Torrent.bangumi_id == bangumi_id)
71+
).all()
5172

5273
def search_all(self) -> list[Torrent]:
5374
return self.session.exec(select(Torrent)).all()
@@ -67,28 +88,32 @@ def search_rss(self, rss_id: int) -> list[Torrent]:
6788

6889
def check_new(self, torrents_list: list[Torrent]) -> list[Torrent]:
6990
new_torrents = []
70-
old_torrents = self.search_all_downloaded()
71-
old_urls = [t.url for t in old_torrents]
7291
for torrent in torrents_list:
73-
if torrent.url not in old_urls:
92+
torrent_item = self.search_torrent(torrent.url, torrent.name)
93+
if not torrent_item or not torrent_item.downloaded:
7494
new_torrents.append(torrent)
7595
return new_torrents
7696

97+
def delete(self, _id: int) -> bool:
98+
condition = delete(Torrent).where(Torrent.id == _id)
99+
try:
100+
self.session.exec(condition)
101+
self.session.commit()
102+
return True
103+
except Exception as e:
104+
logger.error(f"Delete RSS Item failed. Because: {e}")
105+
return False
77106

78107

79108
if __name__ == "__main__":
80-
from module.database import Database,engine
81-
109+
from module.database import Database, engine
82110
from module.models.bangumi import Bangumi
83111

112+
name = "[ANi] 物语系列 第外季&第怪季 - 06 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4"
113+
hash = "1ae27b047005e097b74b66e27c37610aa5a0f5a2"
84114
with Database() as db:
85-
test = TorrentDatabase(db)
86-
bangumis = test.search (2)
87-
bangumis.downloaded = True
88-
test = bangumis
89-
90-
print(bangumis)
91-
with Database() as db2:
92-
test2 = TorrentDatabase(db2)
93-
test2.add_all([bangumis])
94-
# test.delete_one()
115+
t_name = db.torrent.search_name(name)
116+
t_hash = db.torrent.search_hash(hash)
117+
db.torrent.delete(t_hash.id)
118+
# print(f"{t_name=}")
119+
# print(f"{t_hash=}")

0 commit comments

Comments
 (0)