BGmi is a cli tool for subscribed bangumi.
Project description
BGmi is a cli tool for subscribed bangumi.
TODO
Empty as my wallet.
Update Log
Search / Download bangumi filter by regex
Download specified episode
Transmission-rpc support
Remove aria2 download method
Followed Bangumis Calendar for iOS / Android
Bugs fixed
Feature
Bangumi Script: Write your bangumi parser own!
Subscribe/unsubscribe bangumi
Bangumi calendar
Bangumi episode information
Download bangumi by subtitle group
Web page to view all subscribed bangumi
RSS feed for uTorrent
Play bangumi online with danmaku
Download bangumi by specified keywords (included and excluded).
BGmi have supported Windows now
Installation
For Mac OS X / Linux / Windows:
git clone https://github.com/RicterZ/BGmi
cd BGmi
python setup.py install
Or use pip:
pip install bgmi
Build Docker:
git clone https://github.com/RicterZ/BGmi
cd BGmi
docker build -t bgmi .
docker run -p8899:80 -d -v ~/.bgmi:/root/.bgmi bgmi
You can use bgmi command at client to add / remove bangumi, or get into the docker container to manage bangumi.
Or just:
docker pull ricterz/bgmi
Usage of bgmi
Supported data source:
change data source will lose all bangumi you have followed!!
bangumi you have downloaded will still store on the disk, but won’t show in website
change to mikan by doing this
bgmi source mikan_project
bgmi cal
or change back:
bgmi source bangumi_moe
bgmi cal
Show bangumi calendar:
bgmi cal
Subscribe bangumi:
bgmi add "Re:CREATORS" "夏目友人帐 陆" "进击的巨人 season 2"
bgmi add "樱花任务" --episode 0
Unsubscribe bangumi:
bgmi delete --name "Re:CREATORS"
Update bangumi database which locates at ~/.bgmi/bangumi.db defaultly:
bgmi update --download
bgmi update "从零开始的魔法书" --download 2 3
bgmi update "时钟机关之星" --download
Set up the bangumi subtitle group filter and fetch entries:
bgmi list
bgmi fetch "Re:CREATORS"
bgmi filter "Re:CREATORS" --subtitle "DHR動研字幕組,豌豆字幕组" --include 720P --exclude BIG5
bgmi fetch "Re:CREATORS"
# remove subtitle, include and exclude keyword filter and add regex filter
bgmi filter "Re:CREATORS" --subtitle "" --include "" --exclude "" --regex
bgmi filter "Re:CREATORS" --regex "(DHR動研字幕組|豌豆字幕组).*(720P)"
bgmi fetch "Re:CREATORS"
Search bangumi and download:
bgmi search '为美好的世界献上祝福!' --regex-filter '.*动漫国字幕组.*为美好的世界献上祝福!].*720P.*'
# download
bgmi search '为美好的世界献上祝福!' --regex-filter '.*合集.* --download
Modify bangumi episode:
bgmi list
bgmi mark "Re:CREATORS" 1
Manage download items:
bgmi download --list
bgmi download --list --status 0
bgmi download --mark 1 --status 2
Status code:
0 - Not downloaded items
1 - Downloading items
2 - Downloaded items
Show BGmi configure and modify it:
bgmi config
bgmi config ARIA2_RPC_TOKEN 'token:token233'
Fields of configure file:
BGmi configure:
BANGUMI_MOE_URL
: url of bangumi.moe mirrorBGMI_SAVE_PATH
: bangumi saving pathDOWNLOAD_DELEGATE
: the ways of downloading bangumi (aria2-rpc, transmission-rpc, xunlei)MAX_PAGE
: max page for fetching bangumi informationBGMI_TMP_PATH
: just a temporary pathDANMAKU_API_URL
: url of danmaku apiLANG
: language
Aria2-rpc configure:
ARIA2_RPC_URL
: aria2c deamon RPC urlARIA2_RPC_TOKEN
: aria2c deamon RPC token(“token:” for no token)
Xunlei configure:
XUNLEI_LX_PATH
: path of xunlei-lixian binary
Transmission-rpc configure:
TRANSMISSION_RPC_URL
: transmission rpc hostTRANSMISSION_RPC_PORT
: transmission rpc port
Bangumi Script
Bangumi Script is a script which you can write the bangumi parser own. BGmi will load the script and call the method you write before the native functionality.
Bangumi Script Runner will catch the data you returned, update the database, and download the bangumi. You only just write the parser and return the data.
Bangumi Script is located at BGMI_PATH/script
, inherited ScriptBase
class. There is a example:
# coding=utf-8
from __future__ import print_function, unicode_literals
import re
import json
import requests
import urllib
from bgmi.script import ScriptBase, parse_episode
from bgmi.utils import print_error
from bgmi.config import IS_PYTHON3
if IS_PYTHON3:
unquote = urllib.parse.unquote
else:
unquote = urllib.unquote
class Script(ScriptBase):
# 定义 Model, 此处 Model 为显示在 BGmi HTTP 以及其他地方的名称、封面及其它信息
class Model(ScriptBase.Model):
bangumi_name = '猜谜王(BGmi Script)' # 名称, 随意填写即可
cover = 'COVER URL' # 封面的 URL
update_time = 'Tue' # 每周几更新
def get_download_url(self):
"""Get the download url, and return a dict of episode and the url.
Download url also can be magnet link.
For example:
```
{
1: 'http://example.com/Bangumi/1/1.mp4'
2: 'http://example.com/Bangumi/1/2.mp4'
3: 'http://example.com/Bangumi/1/3.mp4'
}
```
The keys `1`, `2`, `3` is the episode, the value is the url of bangumi.
:return: dict
"""
# fetch and return dict
resp = requests.get('http://www.kirikiri.tv/?m=vod-play-id-4414-src-1-num-2.html').text
data = re.findall("mac_url=unescape\('(.*)?'\)", resp)
if not data:
print_error('No data found, maybe the script is out-of-date.', exit_=False)
return {}
data = unquote(json.loads('["{}"]'.format(data[0].replace('%u', '\\u')))[0])
ret = {}
for i in data.split('#'):
title, url = i.split('$')
# parse_episode 为内置的解析集数的方法, 可以应对大多数情况。如若不可用, 可以自己实现解析
ret[parse_episode(title)] = url
return ret
Another example:
# coding=utf-8
from __future__ import print_function, unicode_literals
import re
import requests
from bs4 import BeautifulSoup as bs
from bgmi.script import ScriptBase, parse_episode
from bgmi.utils import print_error
from bgmi.config import IS_PYTHON3
class Script(ScriptBase):
class Model(ScriptBase.Model):
bangumi_name = 'Rick and Morty Season 3'
cover = 'http://img.itvfans.com/wp-content/uploads/31346.jpg'
update_time = 'Mon'
def get_download_url(self):
# fetch and return dict
resp = requests.get('http://www.itvfans.com/fenji/313463.html').text
html = bs(resp, 'lxml')
data = html.find(attrs={'id': '31346-3-720p'})
if not data:
print_error('No data found, maybe the script is out-of-date.', exit_=False)
return {}
ret = {}
match_episode = re.compile('Rick\.and\.Morty\.S03E(\d+)\.720p')
for row in data.find_all('a', attrs={'type': 'magnet'}):
link = row.attrs['href']
episode = match_episode.findall(link)
if episode:
ret[int(episode[0])] = link
return ret
if __name__ == '__main__':
s = Script()
print(s.get_download_url())
The returned dict as follows.
{
1: 'http://example.com/Bangumi/1/1.mp4'
2: 'http://example.com/Bangumi/1/2.mp4'
3: 'http://example.com/Bangumi/1/3.mp4'
}
The keys 1, 2, 3 is the episode, the value is the url of bangumi.
Usage of bgmi_http
Start BGmi HTTP Service bind on 0.0.0.0:8888
:
bgmi_http --port=8888 --address=0.0.0.0
Configure tornado with nginx:
server {
listen 80;
root /var/www/html/bangumi;
autoindex on;
charset utf8;
server_name bangumi.example.com;
location /bangumi {
alias /var/www/html/bangumi;
}
location / {
# reverse proxy to tornado listened port.
proxy_pass http://127.0.0.1:8888;
}
}
Of cause you can use yaaw to manage download items if you use aria2c to download bangumi.
...
location /bgmi_admin {
auth_basic "BGmi admin (yaaw)";
auth_basic_user_file /etc/nginx/htpasswd;
alias /var/www/html/yaaw;
}
location /jsonrpc {
# aria2c listened port
proxy_pass http://127.0.0.1:6800;
}
...
DPlayer and Danmaku
BGmi use DPlayer to play bangumi.
First, setup nginx to access bangumi files. Second, choose one danmaku backend at DPlayer#related-projects.
Use bgmi config to setup the url of danmaku api.
bgmi config DANMAKU_API_URL http://127.0.0.1:1207/
… and enjoy :D
License
The MIT License (MIT)
Copyright (c) 2017 Ricter Zheng
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.