8000 Add HookRunner by zeyugao · Pull Request #788 · BGmi/BGmi · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Add HookRunner #788

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Apr 17, 2024
Merged

Add HookRunner #788

merged 12 commits into from
Apr 17, 2024

Conversation

zeyugao
Copy link
Contributor
@zeyugao zeyugao commented Apr 7, 2024

#786 拆封出来

基于ScriptRunner改了一个HookRunner,这个hook runner可以在下载前和下载后执行一些东西

我用来直接在提交给qbit下载后根据文件名进行重命名,变成成 S01/xxx S01Exx.mkv 的形式,可以直接被emby、jellyfin更好地进行刮削。因为如果要在下载时就重命名好,好像需要对里面许多东西进行大量重构,不如单独针对特定的来一点点修,这个也不会针对每一个episode就新建一个文件夹

放在 ~/.bgmi/hooks 下面即可

给qbit用的重命名hook
from typing import List
import qbittorrentapi
import re
from os.path import join, exists
import time
import os
from loguru import logger
from bgmi.config import cfg
from bgmi.lib.models import POST_DOWNLOAD

import pathlib


hook_stage = POST_DOWNLOAD


def run():
    bgmi_save_path = str(cfg.save_path).rstrip('/')

    try:
        client = qbittorrentapi.Client(
            host=cfg.qbittorrent.rpc_host,
            port=cfg.qbittorrent.rpc_port,
            username=cfg.qbittorrent.rpc_username,
            password=cfg.qbittorrent.rpc_password,
        )
        client.auth_log_in()
    except Exception as e:
        logger.exception(e)
        return

    info = list(client.torrents_info(sort="added_on", category=cfg.qbittorrent.category))

    save_path_pattern = re.compile(rf'{bgmi_save_path}/(.*)/(\d+)')

    path_to_remove: List[pathlib.Path] = []

    for torrent in info:
        original_save_path = torrent.save_path

        if original_save_path.startswith(bgmi_save_path):
            m = save_path_pattern.search(original_save_path)

            if m is None:
                continue

            bangumi_name, episode = m.groups()
            episode = int(episode)

            torrent_hash = torrent.hash
            torrent_files = client.torrents_files(torrent_hash)

            assert len(
                torrent_files) == 1, f"Count: {len(torrent_files)}, items: {torrent_files}"
            file = torrent_files[0]

            client.torrents_rename_file(
                torrent_hash=torrent_hash,
                old_path=file.name,
                new_path=f'S01/{bangumi_name} - S01E{episode:02}{file.name[file.name.rfind("."):]}')

            client.torrents_setSavePath(
                join(bgmi_save_path, bangumi_name), torrent_hashes=torrent_hash)

            path_to_remove.append(original_save_path)

    while True:
        logger.info('Waiting for qBittorrent to finish renaming...')
        done = True
        info = list(client.torrents_info(sort="added_on"))
        for torrent in info:
            original_save_path = torrent.save_path

            if original_save_path.startswith(bgmi_save_path):
                m = save_path_pattern.search(original_save_path)

                if m is None:
                    continue
                done = False
        time.sleep(1)
        if done:
            break

    path_to_remove = [pathlib.Path(path) for path in path_to_remove]
    logger.info(f'Path to be removed: {path_to_remove}')

    for path in path_to_remove:
        if exists(path):
            logger.info(f'Removing: {path}')
            try:
                path.rmdir()
            except OSError as e:
                logger.exception(e)

    for path, _, _ in os.walk(bgmi_save_path, topdown=False):
        if len(os.listdir(path)) == 0:
            logger.info(f'Cleanning empty folder {path}')
            os.rmdir(path)

@trim21
Copy link
Member
trim21 commented Apr 7, 2024

改成PRE_ADD_DOWNLOADPOST_ADD_DOWNLOAD

Copy link
codecov bot commented Apr 7, 2024

Codecov Report

Attention: Patch coverage is 25.92593% with 20 lines in your changes are missing coverage. Please review.

Project coverage is 41.10%. Comparing base (3e377aa) to head (4011f86).
Report is 1 commits behind head on master.

❗ Current head 4011f86 differs from pull request most recent head 045d24f. Consider uploading reports for the commit 045d24f to get more accurate results

Files Patch % Lines
bgmi/script.py 16.66% 15 Missing ⚠️
bgmi/lib/controllers.py 16.66% 5 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #788      +/-   ##
==========================================
- Coverage   41.31%   41.10%   -0.21%     
==========================================
  Files          32       32              
  Lines        2246     2272      +26     
==========================================
+ Hits          928      934       +6     
- Misses       1318     1338      +20     
Flag Coverage Δ
downloader 41.10% <25.92%> (-0.21%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@trim21
Copy link
Member
trim21 commented Apr 7, 2024

感觉是不是提供个基类然后继承比较好。这样可以给hook传参数。比如这里可以给hook传一下刚刚添加了哪一集?

@zeyugao
Copy link
Contributor Author
zeyugao commented Apr 7, 2024

那hook的地方就要变得细粒度好多了,或者可以把 locals() 或者单独的updated_bangumi_obj传进去;写继承的话也无法做hook代码想要什么信息就能在hook点得到什么信息吧

明天起来再说()

@zeyugao
Copy link
Contributor Author
zeyugao commented Apr 8, 2024

没有想到什么特别好的设计,因为即使继承了的话,在hook的代码这边想要什么变量,怎么实现在hook点也自动传过去呢

@zeyugao
Copy link
Contributor Author
zeyugao commented Apr 9, 2024

有什么想法吗(

@trim21
Copy link
Member
trim21 commented Apr 10, 2024

运行的时候hook_runner.run(HOOK, *args, **kwargs)
然后hook这边

from typing import Protocol


class BaseHook(Protocol):
    def pre_add_download(self, *args, **kwargs):
        pass

    def post_add_download(self, *args, **kwargs):
        pass


class MyHook(BaseHook):
    def pre_add_download(self, *args, **kwargs):
        print("my pre-add-download hook")

*args, **kwargs 具体是什么取决于具体的hook

@zeyugao
Copy link
Contributor Author
zeyugao commented Apr 12, 2024

改成了继承基类的方式,但是现在感觉没有必要传什么参数,因为里面可以直接操作bgmi里面的数据库了,所以没有什么参数是必须要传的,可以直接拿db的类去query

bgmi/script.py Outdated
def __init__(self) -> None:
pass

def pre_add_download(self) -> None:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

*args**kwrags 呢。。。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改了

@trim21 trim21 merged commit 0e77e1c into BGmi:master Apr 17, 2024
@zeyugao zeyugao deleted the hook branch April 18, 2024 02:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants
0