tasi788 / aniGamerPlus

巴哈姆特動畫瘋自動下載工具,支援命令行

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

aniGamerPlus

GitHub GitHub release GitHub Release Date GitHub Releases

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

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

注意⚠️

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

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

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

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

源碼運行

Python 版本 3 以上

使用前確認已安裝好依賴

pip3 install requests beautifulsoup4 lxml termcolor chardet pysocks
pip3 install Flask Flask_BasicAuth Flask_Sockets gevent gevent_websocket

下載源碼

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

升級

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

第三方拓展工具

  • aniGamerPlus-swapHistorySnList
    • 將資料庫中的番劇導出到sn_list,可方便的與原來的sn_list相互切換,適用於你想檢查過往番劇是否有更新時。

目錄

特性

  • 支援多線程下載
  • 支援 cookie,支援下載 1080P
  • 下載模式有僅下載最新一集,下載最新上傳,下載全部可選。
  • 自定義檢查更新間隔時間
  • 自定義番劇下載目錄
  • 自定義下載檔名前綴後綴及是否添加解析度
  • 下載失敗,下載過慢自動重啟任務
  • 支援使用 FTP 上傳至伺服器,支援斷點續傳(配合 Pure-Ftpd ),掉線重傳,支援 FTP over TLS
  • 檢查程式更新功能
  • 支援新番分類
  • v6.0 開始支援 cookie 自動更新
  • v7.0 開始支援使用(鏈式)代理
  • v9.0 開始支援記錄日誌
  • v9.0 開始自動下載支援自定義番劇名
  • v16 支援向 酷Q 推送下載完成訊息
  • v16 支援將影片 metadata 前置,此功能會在線觀看時更快播放
  • v20 上線 Web 控制面板
  • v20.2 支援命令列下載時同時下載彈幕

任務列表

  • 下載使用代理
  • 使用 ftp 上傳至遠程伺服器
  • Web 控制臺(持續完善中)

設定説明

config.json

config-sample.json 為範例設定檔案,可以將其修改後改名為 config.json

若不存在 config.json,則程式在執行時將會使用預設設定建立。

{
    "bangumi_dir": "",  # 下載存放目錄,動畫將會以番劇為單位分資料夾存放
    "temp_dir": "",  # 臨時目錄位置,v9.0 開始下載中文件將會放在這裏,完成後再轉移至番劇目錄,留空默認在程式所在目錄的 temp 資料夾下
    "classify_bangumi": true,  # 控制是否建立番劇資料夾
    "check_frequency": 5,  # 檢查更新頻率,單位為分鐘
    "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"
        ]
    },
    "telebot_notify": false,  # 是否開啟 telegram 通知
    "telebot_token": "",  # telegram 機器人 token
    "discord_notify": true,  # 是否開啟 discord 通知
    "discord_token": "https://",  # discord webhook api 網址
    "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":3  # 使用移動端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開始支援)代理。

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

http://example.com:1000

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

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

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

socks5h://127.0.0.1:1483

如果想使用其他的代理協議或使用鏈式代理,需要下載 Gost 放置在系統 PATH,或本程式目錄下,並命名爲 gost,windows 平臺為gost.exe

若想使用鏈式代理,請使用整數作爲 key,代理出口將會是 key 最大的代理服務器。

Gost 支援 Shadowsocks 協議,其實現是基於 shadowsocks-go ,目前僅支援這幾種加密方式:aes-128-cfb aes-192-cfb aes-256-cfb bf-cfb cast5-cfb des-cfb rc4-md5 rc4-md5-6 chacha20 salsa20 rc4 table

注意:read_config_when_checking_update 設定對代理設定無效

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

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

下載模式説明

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

分段下載模式特點:

  • 分段下載模式速度更快
  • 個別分段下載失敗會自動重試,最多重試 8 次
  • aniGamerPlus 本身消耗的記憶體將略高於舊下載模式
  • aniGamerPlus 本身性能消耗將會略高
  • 短時間内(解密合併階段)將會占用2倍影片大小的磁盤空間
  • 命令列模式下下載單個影片時,實時顯示已下載分段數占總分段數百分比

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

ffmpeg下載模式特點:

  • 一個分段下載失敗即判斷爲下載失敗
  • 在下載過程中可能出現 ffmpeg 卡死的情況
  • 不會生成臨時資料夾
  • 命令列模式下下載單個影片時,實時顯示已下載的大小

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

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

cookie.txt

  1. 使用者 cookie 文件,將瀏覽器的 cookie 字段複製,以 cookie.txt 為檔名儲存在程式目錄下
  2. 將獲取 cookie 的瀏覽器 UA,寫入config.jsonua項目

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

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

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

⚠️ 登入時請勾選 "保持登入狀態"

使用Chrome舉例如何獲取 Cookie:

  • 開啟 Chrome的無痕模式,登入動畫瘋,記得勾選保持登入狀態

  • 按 F12 叫出開發者工具,前往動畫瘋首頁,切換到 Network 分頁,在下方選中 "ani.gamer.com.tw" 在右側即可看到 Cookie,如圖:

  • 在程式所在目錄新建一個名爲cookie.txt的文字檔案,打開將上面的 Cookie 複製貼上儲存即可

使用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 lastest # 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 等工具打開編輯

記錄影片下載狀態等相關訊息,一般無需更改

欄位設計:

  • sn sn 值(PK)
  • title 完整標題
  • anime_name 番劇名
  • episode 劇集名,一般爲數字,也可能是特別篇 電影
  • status 下載狀態,0 為未成功下載,1 為已成功下載
  • remote_status 上傳狀態,0 為未成功上傳,1 為已成功上傳
  • resolution 下載的影片檔解析度
  • file_size 影片檔大小,整數,單位 MB
  • local_file_path 影片檔路徑
  • CreatedTime 資料建立時間

截圖:

命令列使用

支援命令列使用,檔案默認將儲存在config.json中指定的目錄下

設定文件中的代理設定同樣適用於命令列模式!

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

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

參數:

>python3 aniGamerPlus.py -h
當前 aniGamerPlus版本:v21.0
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}]
                       [--thread_limit THREAD_LIMIT] [--current_path]
                       [--episodes EPISODES] [--no_classify]
                       [--information_only] [--user_command] [--danmu]

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}, -m {single,latest,largest-sn,multi,all,range,list,sn-list,sn-range}
                        下載模式
  --thread_limit THREAD_LIMIT, -t THREAD_LIMIT
                        最高併發下載數(數字)
  --current_path, -c    下載到當前工作目錄
  --episodes EPISODES, -e EPISODES
                        僅下載指定劇集
  --no_classify, -n     不建立番劇資料夾
  --information_only, -i
                        僅查詢資訊
  --user_command, -u    所有下載完成後執行用戶命令
  --danmu, -d           以 .ass 下載彈幕(beta)

  • -s 接要下載影片的 sn 碼,不可空

  • -r 接要下載的解析度,可空,空則讀取 config.json 中的定義,不存在則選取最近可用解析度

  • -m 接下載模式,可空,空則下載傳入 sn 碼的影片

    • single 下載此 sn 單集(默認)

    • multi 下載多個sn,啟用此模式時,透過-e傳入多個 sn,sn 之間使用英文,分割

    • all 下載此番劇所有劇集

    • latest 下載此番劇最後一集(即網頁上顯示排最後的一集)

    • largest-sn 下載此番劇最近上傳的一集(即 sn 最大的一集)

    • range 下載此番指定的劇集

    • list 讀取 sn_list 中的内容進行下載,並會將任務狀態記錄在資料庫中,重啟自動下載未完成的集數,該功能用於單次大量下載。 此模式無法通過-r參數指定解析度

    • sn-list 讀取 sn_list 中的指定sn進行下載,sn後面的模式設定會被忽略,僅下載單個sn,並會將任務狀態記錄在資料庫中。 此模式無法通過-r參數指定解析度

    • sn-range 下載此番據指定 sn 範圍的劇集,對於劇集名稱不是正整數的番劇,可以用此模式

  • -t 接最大併發下載數,可空,空則讀取config.json中的定義

  • -c 開關,指定時將會下載到當前工作路徑下

  • -n 不建立番劇資料夾

  • -i 僅顯示影片資訊,當爲list模式時,會獲取 sn_list 中的單個 sn 的資訊。

  • -u 所有任務完成後執行使用者命令(設定在config.jsonuser_command中),用於實現下載完成後關機等操作

  • -d 下載 .ass 彈幕,推薦使用 XySubFilter 進行字幕渲染

  • -e

    • range 模式下,下載此番劇指定劇集,支援範圍輸入,支援多個不連續聚集下載,僅支援整數命名的劇集

    • multi 模式下,用於指定多個 sn

    • -e 參數優先於 -m 參數,若使用 -e 參數時不指定模式,則默認為 range 模式

    • 若使用 -m range 則必須使用 -e 指定需要下載的劇集

    • range 模式下,若指定了不存在的劇集會警告並跳過,僅下載存在的劇集

    • 指定不連續劇集或 sn 時,請用英文逗號,分隔,中間無空格

    • range 模式下,指定連續劇集格式:起始劇集-終止劇集。舉例想下載第 5 到 9 集,則格式為 5-9

    • sn-range 模式下,格式同 range 模式,不過將劇集改成 sn 碼

    • 將會按 sn 順序下載

    • 舉例:

      • 想下載某番劇第 1 ,2 ,3 集 python3 aniGamerPlus.py -s 10218 -e 1,2,3

      • 想下載某番劇第 5 到 8 集 python3 aniGamerPlus.py -s 10218 -e 5-8

      • 想下載某番劇第 2 集,第 5 到 8 集,第 12 集 python3 aniGamerPlus.py -s 10218 -e 2,5-8,12

      • 想下載某番劇 sn 範圍 14440 到 14459 的劇集,外加 sn 為 14670 和 14746 的兩集 python3 aniGamerPlus.py -s 14440 -m sn-range -e 14670,14746,14440-14459

      • 想下載 sn 為 14479, 14518, 14511 的動畫 aniGamerPlus.py -m multi -e 14479,14518,14511

    • 截圖:

      在 Android 中使用(使用Termux)

Dashboard

在 v20 版本首次啟用了 Web 控制臺,相關設定在 config.jsondashboard 項目中。

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

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

支援使用 BasicAuth 進行認證,注意⚠️ 用戶密碼是明文傳輸的, 如有需要建議同時啟用 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 控制臺截圖:

  • 主界面:
  • 手動任務:
  • 在線編輯 sn_list
  • 控制臺輸出:

About

巴哈姆特動畫瘋自動下載工具,支援命令行

License:GNU General Public License v3.0


Languages

Language:Python 83.7%Language:HTML 11.2%Language:JavaScript 4.2%Language:CSS 0.7%Language:Dockerfile 0.1%