miyouzi / aniGamerPlus

巴哈姆特動畫瘋自動下載工具,支援命令行
GNU General Public License v3.0
692 stars 95 forks source link

aniGamerPlus

GitHub GitHub release GitHub Release Date GitHub Releases

巴哈姆特動畫瘋自動下載工具, 可隨著番劇更新自動下載, 適合部署在全天開機的伺服器或NAS上.

同時支援命令行, 也適用於需要大批量下載的使用者, 如: 下載整部番劇. 命令行模式支援顯示下載進度, 但要求 最大并發下載數 設置為 1 .

注意:warning:

本專案依賴ffmpeg, 請事先將ffmpeg放入系統PATH或者本程序目錄下!

ffmpeg 需要另外下載, 點擊這裡前往下載頁. 若不知道如何將 ffmpeg 放入 PATH 則直接將 ffmpeg.exe 放在和本程式同一個資料夾下即可.

:warning: 使用 Cookie 解析存在帳號被封鎖風險,不可解封,請三思后使用! :warning:

EXE 檔案運行(對於不熟悉Python的使用者)

windows 使用者可以點擊這裡下載exe文件使用.

源碼運行

Python 版本 3 以上

下載源碼

git clone https://github.com/miyouzi/aniGamerPlus.git

第一次使用前,進入原始碼所在資料夾,安裝依賴(重要)

cd aniGamerPlus
pip3 install -r requirements.txt

升級

git pull https://github.com/miyouzi/aniGamerPlus.git

使用

python3 aniGamerPlus.py

Docker 運行

(可選) 建構自己的 Image

下載原始碼

git clone https://github.com/miyouzi/aniGamerPlus.git

Build Image

docker build -t anigamerplus .

下載官方 Image

目前官方 Image 放在 tonypepe/anigamerplus

使用前需在本地先創建好 config.json,並綁定 config.json 和下載目錄至 Container 內。

注意:

  1. confg.json 中的 Dashboard Host 請設定成 0.0.0.0,切勿設定 127.0.0.1.
  2. config.json 勿設定下載目錄 bangumi_dir: "",請保持為空,以免目錄綁定失敗。
  3. 可綁定 cookie.txt 至 /app/cookie.txt

使用:

docker run -td --name anigamerplus \
    -v /path/to/config.json:/app/config.json \
    -v /path/to/download:/app/bangumi \
    -v /path/to/aniGamer.db:/app/aniGamer.db \
    -p 5000:5000 \
    tonypepe/anigamerplus

啟動後可至 localhost:5000 使用 Dashboard

鳴謝

本專案m3u8获取模塊參考自 BahamutAnimeDownloader

第三方拓展工具

目錄

特性

任務列表

配置説明

config.json

config-sample.json为范例配置文件, 可以将其修改后改名为config.json.

若不存在config.json, 则程序在运行时将会使用默认配置创建.

{
    "bangumi_dir": "",  // 下載存放目錄, 動畫將會以番劇為單位分資料夾存放
    "temp_dir": "",  // 臨時目錄位置, v9.0 開始下載中文件將會放在這裏, 完成後再轉移至番劇目錄, 留空默認在程序所在目錄的 temp 資料夾下
    "classify_bangumi": true,  // 控制是否建立番劇資料夾
    "classify_season": false,  // 控制是否建立季度子目錄
    "check_frequency": 5,  // 檢查更新頻率, 單位為分鐘
    "download_cd": 5,  // # 下載冷卻時間(秒)
    "parse_sn_cd": 3,  // sn 页面(即播放界面)解析冷却时间(秒)
    "download_resolution": "1080",  // 下載選取清晰度, 若該清晰度不存在將會選取最近可用清晰度, 可選 360 480 540 576 720 1080
    "lock_resolution": false,  // 鎖定清晰度, 如果指定清晰度不存在, 則放棄下載
    "only_use_vip": false,  // 锁定 VIP 账号下载
    "default_download_mode": "latest",  // 默認下載模式, 另一可選參數為 all 和 largest-sn. latest 為僅下載最後一集, all 下載番劇全部劇集, largest-sn 下載最近上傳的一集
    "use_copyfile_method": false,  // 轉移影片至番劇資料夾時使用複製方法, 適用於保存到 rclone 掛載盤的情況
    "multi-thread": 1,  // 最大并發下載數, 最高為 5, 超過將重置為 5
    "multi_upload": 3,  // 最大并發上傳數
    "segment_download_mode": true,  // 分段下載模式, 速度更快, 容錯率更高
    "segment_max_retry": 8,  // 在分段下載模式時有效, 每個分段最大重試次數, -1 為無限重試
    "multi_downloading_segment": 3,  // 每個影片最大并發下載分段數, 僅在 "segment_download_mode" 為 true 時有效, 最高為 5, 超過將重置為 5
    "add_bangumi_name_to_video_filename": true,  // 如果為 false, 則只有劇集名, 若劇集名為個位數字, 則補零
    "add_resolution_to_video_filename": true,  // 是否在影片檔名中添加清晰度, 格式舉例: [1080P]
    "customized_video_filename_prefix": "【動畫瘋】",  // 影片檔名前綴
    "customized_bangumi_name_suffix": "",  // 影片檔名中番劇名的后缀, 在劇集名之前
    "customized_video_filename_suffix": "",  // 影片檔名後綴
    "video_filename_extension": "mp4",  // 影片檔副檔名, ts, mov, mkv 經過測試可以使用, 但 flv 不支援, 非 mp4 副檔名 faststart_movflags 將强制為 false
    "zerofill": 1,  // 劇集名補零, 填寫補足位數, 例: 填寫 2 劇集名為 01, 填寫 3 劇集名為 001
    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36",  //  請求UA, 需要和獲取cookie的瀏覽器相同
    "use_proxy": false,  // 代理開關
    "proxy": {"http://user:passwd@example.com:1000"},  // 代理配置
    "upload_to_server": false,  // 上傳功能開關
    "ftp": {  // FTP配置
        "server": "",  // FTP Server IP
        "port": "",  // 端口
        "user": "",  // 使用者名
        "pwd": "",  // 密碼
        "tls": true,  // 是否是 FTP over TLS
        "cwd": "",  // 登陸後首先進入的目錄
        "show_error_detail": false,  // 是否顯示細節錯誤信息
        "max_retry_num": 15  // 最大重傳數, 支援續傳
    },
    "user_command": "shutdown -s -t 60"  // 命令行模式使用 -u 參數有效, 在命令行模式下完成所有任務后執行的命令
    "coolq_notify": false,  // 是否向酷Q推送下載完成訊息
    "coolq_settings": {
        "msg_argument_name": "message",
        "message_suffix": "追加的資訊",
        "query": [
            "http://127.0.0.1:5700/send_group_msg?access_token=abc&group_id=12345678",
            "http://127.0.0.1:5700/send_group_msg?access_token=abc&group_id=87654321"
        ]
    },
    "plex_naming": false, // 適配PLEX命名規則
    "faststart_movflags": false,  // 是否將影片 metadata 前置, 啓用此功能時在綫觀看會更快播放, 僅在 video_filename_extension 為 mp4 時有效
    "audio_language": false,  // 是否添加音軌標簽
    "use_mobile_api": false,  // 使用移動端API進行影片解析
    "danmu": false, // 是否下載彈幕(已包含動畫瘋內建的關鍵字過濾)
    "danmu_ban_words": [], // 額外過濾彈幕關鍵字(支援python的正規表示式、英文不區分大小寫)
    "check_latest_version": true,  // 是否檢查更新
    "read_sn_list_when_checking_update": true,  // 是否在檢查更新時讀取sn_list.txt, 開啓後對sn_list.txt的更改將會在下次檢查更新時生效而不用重啓程序
    "read_config_when_checking_update": true,  // 是否在檢查更新時讀取配置文件, 開啓後對配置文件的更改將會在下次檢查時更新生效而不用重啓程序
    "ads_time": 25,  // 非VIP廣告等待時間, 如果等待時間不足, 程式會自行追加時間 (最大20秒)
    "mobile_ads_time": 25  // 使用移動端API解析的廣告等待時間
    "use_dashboard": true  // Web 控制台開關
    "dashboard": {  // Web控制面板配置
        "host": "127.0.0.1",  // 監聽地址, 如果需要允許外部訪問, 請填寫 "0.0.0.0"
        "port": 5000,  // 監聽端口
        "SSL": false,  // 是否開啓SSL, 證書保存在 Dashboard\sslkey, 如果有需要可以自行替換證書
        "BasicAuth": false,  // 是否使用 BasicAuth 進行認證, 注意, 用戶密碼是明文傳輸的, 如有需要建議同時啓用 SSL
        "username": "admin",  // BasicAuth 用戶名
        "password": "admin"  // BasicAuth 密碼
    },
    "save_logs": true,  // 是否記錄日志, 一天一個日志
    "quantity_of_logs": 7,  // 日志保留數量, 正整數值, 必須大於等於 1, 默認為 7
    "config_version": 14.0,  // 配置文件版本
    "database_version": 2.0  // 資料庫版本
}

模式僅支援在 latest, all, largest-sn 三個中選一個, 錯詞及其他詞將會重置為latest模式

使用代理

aniGamerPlus本身支援使用單個httphttpssocks5(v12開始支援)代理.

你可以在 Web 控制臺設置代理, 如下圖所示:

或者手動編輯config.json檔案的proxy字段, 請按下方格式填入:

無密碼驗證的代理使用以下格式:

http://example.com:1000

有密碼驗證的代理使用以下格式:

http://user:passwd@example.com:1000

使用socks5代理支援遠端DNS, 配置時使用socks5h代替socks5, 如:

socks5h://127.0.0.1:1483

注意: read_config_when_checking_update 配置對代理配置無效

使用代理建議使用分段下載模式

如果代理網路不穩定, 建議multi-thread配置為1

下載模式説明

v8.0 影片下載模式新增分段下載, 其工作流程: 由 aniGamerPlus 讀取 m3u8 文件, 下載 key 及所有影片分段至臨時資料夾, 再使用 ffmpeg 解密合并.

分段下載模式特點:

舊下載模式, 即 ffmpeg 下載模式的工作流程: 直接將 m3u8 文件交給 ffmpeg, 下載解密合并全由 ffmpeg 完成.

ffmpeg下載模式特點:

除非你通往動畫瘋的網路足夠穩, 否則建議使用分段下載模式, 配置 segment_download_modetrue 開啓分段下載模式

儅開啓分段下載模式時, 配置 multi_downloading_segment 將有效, 這個值指定一個影片同時最多下載幾個分段, 一般設定在3左右速度就足夠快了

cookie.txt

  1. 使用者cookie文件, 將瀏覽器的cookie字段複製, 以cookie.txt為檔名保存在程序目錄下
  2. 將獲取cookie的瀏覽器UA, 写入config.jsonua項目 (重要:warning:)

v6.0版本開始支援自動刷新cookie, 爲了不與正常使用的cookie衝突, 請從使用瀏覽器的無痕模式取得僅供aniGamerPlus使用的cookie

取得cookie后, 登陸狀態會顯示在 https://home.gamer.com.tw/login_devices.php , 你可以從這裏點擊退出來失效你的cookie, 其顯示的信息來自與你取得cookie的瀏覽器(UA)

使用cookie后所抓取的影片記錄會記錄在你的觀看紀錄

:warning: 登陸時請勾選"保持登入狀態"

使用Chrome舉例如何獲取 Cookie:

(推薦自動獲取UA)通過獲取Web控制臺如何獲取 UA:

(手動方式獲取UA)使用Chrome舉例如何獲取 UA:

sn_list.txt

需要自動下載的番劇列表,一個番劇中選任一sn填入即可

可以對個別番劇配置下載模式, 未配置下載模式將會使用config.json定義的默認下載模式

支援注釋 # 後面的所有字符程序均不會讀取, 可以標記番劇名

模式僅支援在 latest, all, largest-sn 三個中選一個, 錯詞及其他詞將會重置為config.json中定義的默認下載模式

格式:

sn碼 下載模式(可空) #注釋(可空)

範例:

10147 all # 前進吧!登山少女 第三季 [1]
11285 # 關於我轉生變成史萊姆這檔事
11390 all #笑容的代價 01
11388 # BanG Dream!第二季
11317 latest # SSSS.GRIDMAN

自v6.0開始, 新增對番劇進行分類功能, 在一排番劇列表的上方 @ 開頭後面的字符將會作爲番劇的分類名, 番劇會歸類在此分類名的資料夾下

若單獨 @ 表示不分類

範例:

@2019一月番
11433 # ENDRO!
11392 # 笨拙之極的上野
@2019十月番
11354 latest # 刀劍神域 Alicization
@
11468 # 動物朋友

上面表示將會把ENDRO上野放在2019一月番資料夾裏, 將刀劍放在2019十月番資料夾裏, 動物朋友 不分類, 直接放在番劇目錄下

自 v9.0 開始, 支援重命名番劇, 在注釋之前, 模式之後, 用 <> 將自定義的番劇名框起來, 下載時將會使用這個名字作爲番劇目錄名

PS: 連續多個空格將會被替換爲單個空格, 和模式需要間隔一個空格

範例:

11415 <魔法少女特殊战明日香> # 魔法少女特殊戰明日香
11433 <えんどろ~!> # ENDRO!
11354 latest <刀剑神域3> # 刀劍神域 Alicization
11398 # 粉彩回憶

aniGamer.db

sqlite3資料庫, 可以使用 SQLite Expert 等工具打開編輯

記錄視頻下載狀態等相關信息, 一般無需改動

欄位設計:

截图:

命令行使用

支援命令行使用, 文件默認將保存在config.json中指定的目錄下

配置文件中的代理配置同樣適用於命令行模式!

除了使用 list 模式的情況, 命令行模式將不會和資料庫進行交互, 將會無視數據庫中下載狀態標記强制下載

EXE 檔的 aniGamerPlus.exe 也是支援命令行使用的, 將下方演示的 python3 aniGamerPlus.py 換成 aniGamerPlus 就行

參數:

>python3 aniGamerPlus.py -h
當前aniGamerPlus版本: v24.4
usage: aniGamerPlus.py [-h] [--sn SN] [--resolution {360,480,540,576,720,1080}] [--download_mode {single,latest,largest-sn,multi,all,range,list,sn-list,sn-range,db}]
                       [--thread_limit THREAD_LIMIT] [--current_path] [--episodes EPISODES] [--no_classify] [--user_command] [--information_only] [--danmu] [--my_anime]

optional arguments:
  -h, --help            show this help message and exit
  --sn SN, -s SN        視頻sn碼(數字)
  --resolution {360,480,540,576,720,1080}, -r {360,480,540,576,720,1080}
                        指定下載清晰度(數字)
  --download_mode {single,latest,largest-sn,multi,all,range,list,sn-list,sn-range,db}, -m {single,latest,largest-sn,multi,all,range,list,sn-list,sn-range,db}
                        下載模式
  --thread_limit THREAD_LIMIT, -t THREAD_LIMIT
                        最高并發下載數(數字)
  --current_path, -c    下載到當前工作目錄
  --episodes EPISODES, -e EPISODES
                        僅下載指定劇集
  --no_classify, -n     不建立番劇資料夾
  --user_command, -u    所有下載完成后執行用戶命令
  --information_only, -i
                        僅查詢資訊,可搭配 -d 更新彈幕
  --danmu, -d           以 .ass 下載彈幕
  --my_anime            匯出「我的動畫」至my_anime.txt

Dashboard

在 v20 版本首次啓用了 Web 控制臺, 相關配置在 config.jsondashboard 項目中.

Web 控制臺默認啓用, 默認端口 5000, 支援 SSL (https), 證書保存在 Dashboard\sslkey, 如果有需要可以自行替換證書.

如果想開放外部訪問, 可以將 dashboard 配置中的 host 設置成 0.0.0.0

支援使用 BasicAuth 進行認證, 注意:warning: 用戶密碼是明文傳輸的, 如有需要建議同時啓用 SSL.

支援在 Web 控制臺下達手動任務(即命令行模式啓動的任務), 爲了控制臺輸出工整, 控制臺不會顯示下載進度.

目前控制臺僅能配置部分主要配置, 另外Web任務進度顯示等其他擴展功能正在銳意製作中……

相關配置:

"use_dashboard": true  # Web 控制台開關
# Web控制面板配置
"dashboard": {
    "host": "127.0.0.1",  # 監聽地址, 如果需要允許外部訪問, 請填寫 "0.0.0.0"
    "port": 5000,  # 監聽端口
    "SSL": false,  # 是否開啓SSL
    "BasicAuth": false,  # 是否使用 BasicAuth 進行認證
    "username": "admin",  # BasicAuth 用戶名
    "password": "admin"  # BasicAuth 密碼
}

Web控制臺截圖: