使用 BCFG 命令管理 UEFI 启动菜单

用于修改 UEFI NVRAM 条目,它能让用户改变启动条目或驱动器选项。 详见:“UEFI Shell Specification 2.0” PDF 文档的83页 (Section 5.3)命令介绍。

  1. 查看当前启动条目:
1
Shell> bcfg boot dump -v
  1. 为 Clover (作为例子) 添加一个启动菜单条目,并在 UEFI 启动菜单里设置为第1个 (从0开始计数) 选项:
1
Shell> bcfg boot add 0 fs0:\EFI\CLOVER\CLOVERX64.efi "Clover OS X Boot"

fs0: 映射到 EFI 系统分区,\EFI\CLOVER\CLOVERX64.efi 是要启动的文件。 配合mapls命令 确定路径。

  1. 删除第4个启动选项:
1
Shell> bcfg boot rm 3
  1. 把第3个启动选项移动到第0 (也就是说第1个是 UEFI 启动菜单的默认启动选项):
1
Shell> bcfg boot mv 3 0
  1. bcfg命令帮助文档:
1
Shell> help bcfg -v -b

1
Shell> bcfg -? -v -b

参考文献:

aria2 RPC 自带许多事件Hook机制,其中就有下载完成的事件 hook。

aria2 provides options to specify arbitrary command after specific event occurred. Currently following options are available: --on-bt-download-complete, --on-download-pause, --on-download-complete. --on-download-start, --on-download-error, --on-download-stop.

创建 hook 脚本

参考:

1
2
3
cd ~/.aria2/
touch download-complete-hook.sh
chmod +x download-complete-hook.sh

脚本内容添加如下:

1
2
3
4
5
6
#!/bin/sh
fname=`basename $3`
osascript <<EOF
display notification "$fname 已经下载完成!" with title "【下载完成】"
say "有个文件下载完成,请查收!"
EOF

最终效果:当下载完成会在屏幕右上角弹出一个提示框显示具体下载完成的文件名,同时中文语音播报:“有个文件下载完成,请查收!”

macOS 下aria2 提示框实例

  • 具体提示框设置可参考上面的教程。不支持设置自定义图标
  • 关于$3参数详见

aria2 passes 3 arguments to specified command when it is executed. These arguments are: GID, the number of files and file path. For HTTP, FTP, and SFTP downloads, usually the number of files is 1. BitTorrent download can contain multiple files. If number of files is more than one, file path is first one. In other words, this is the value of path key of first struct whose selected key is true in the response of aria2.getFiles() RPC method. If you want to get all file paths, consider to use JSON-RPC/XML-RPC. Please note that file path may change during download in HTTP because of redirection or Content-Disposition header.

添加 Hook 设置

在 aria2 设置文件.aria2.conf加入如下:

1
2
3
4
# BT下载完成(如有做种将包含做种,如需调用请务必确定设定完成做种条件)
on-bt-download-complete=${HOME}/.aria2/download-complete-hook.sh
# 下载完成
on-download-complete=${HOME}/.aria2/download-complete-hook.sh

某些网站的视频文件即使获取了下载链接也是无法使用第三方工具下载,主要原因是服务器端需对Cookie或者referer等验证,故使用第三方下载工具时需要提交该信息。

工具

  • chrome浏览器
  • aria2
  • AriaNG: 一个aria2 web UI

视频文件类型

一般使用 HTML5 技术在线加载的视频,有 2 种加载形式:

  • 单独文件加载:单独的一个完整视频文件(后缀名一般为*.mp4)
  • 多片段文件加载:一般使用后缀名为*.m3u8 的列表文件,分别按进度依次载入数个加密或未加密的*.ts文件

如何获取下载链接及验证信息

浏览器打开视频页面,按下F12进入开发者工具,刷新页面,可以在network标签页看到访问的元素请求。在 Fiter 筛选栏输入关键词如mp4m3u8

*.m3u8列表文件为例

获取下载链接

在左侧找到目标文件,鼠标选中,在右侧详情栏General–>Request URL便是下载链接。复制链接备用,对于 m3u8列表文件,右键转到直接通过浏览器下载备用。
获取下载链接

获取Request Headers参数

找到Request Headers部分,即可看到有RefererUser-AgentCookie等数据,一般只需复制以上 3 个数据即可(RefererCookie可能不会同时存在,User-Agent一般推荐使用)复制备用。如果Cookie信息比较大可以单独保存为一个文件,如cookie.txt
获取RequestHeaders 参数

获取ts文件下载链接

使用文本编辑器打开m3u8列表文件,删除#开头的行, 并补全ts文件下载链接复制备用,也可另存为列表文件**list.txt,原m3u8列表文件在后续的文件解密合并时还需用到,也可重命名为index.m3u8**。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:18
#EXT-X-KEY:METHOD=QINIU-PROTECTION-10,IV=0x613694b311fb436b16f58b8c8f741ca2
#EXTINF:16.733333,
/5t2z9mIR2ZKG20c7w5PeHsrDNjA=/lqn2o_WGxPIjDV_idXAR9c-q6DFM/000000.ts
#EXT-X-KEY:METHOD=QINIU-PROTECTION-10,IV=0x005825f743583155e78af94c6c364190
#EXTINF:3.666667,
/5t2z9mIR2ZKG20c7w5PeHsrDNjA=/lqn2o_WGxPIjDV_idXAR9c-q6DFM/000001.ts
#EXT-X-KEY:METHOD=QINIU-PROTECTION-10,IV=0xb8941ace1e79b5c0acf7d81ec3924226
#EXTINF:17.866667,
.
.
.

补全整理后

1
2
3
https://xxxx/xxxx/5t2z9mIR2ZKG20c7w5PeHsrDNjA=/lqn2o_WGxPIjDV_idXAR9c-q6DFM/000000.ts
https://xxxx/xxxx/5t2z9mIR2ZKG20c7w5PeHsrDNjA=/lqn2o_WGxPIjDV_idXAR9c-q6DFM/000001.ts
...

列表文件中存在类似信息

1
#EXT-X-KEY:METHOD=AES-128,URI="https://....."

则ts 文件的密钥文件为这个URI链接的文件中,如果后续使用 ffmpeg命令进行解密时能自动获取则不需要下载,否则请提前下载并将URI内容改成本地密钥文件路径

使用 Aria2c 命令行下载

命令参数格式如下:

1
aria2c -c -s10 -k1M -x16 --enable-rpc=false -o '要保存的文件名' --user-agent="<User-Agent内容>" --referer="<访问来源>" "文件的下载地址(支持多个链接)"

1
aria2c -c -s10 -k1M -x16 --enable-rpc=false -o '要保存的文件名' --user-agent="<User-Agent内容>"  --header="Cookie: <你的cookie内容>" "文件的下载地址(支持多个链接)"

替换如上命令里的要保存的文件名<User-Agent内容> <访问来源>你的cookie内容文件的下载地址即可。

提示:

  1. 对于同时下载多个文件,可以使用--dir "下载路径"代替 -o '要保存的文件名'
  2. 对于同时下载多个文件,可以指定包含多个文件下载链接的列表文件,如之前的**list.txt**。使用--input-file=list.txt代替"文件的下载地址(支持多个链接)"
  3. 对于同时下载多个文件且下载链接存在规则性,也可使用-Z -P http://host/XXXX[000-100].ts代替"文件的下载地址(支持多个链接)"。详见:aria2c:参数化 URI
  4. 对于使用 cookie 文件可使用--load-cookies=<cookie 文件>代替--header="Cookie: <你的cookie内容>"

使用 AriaNG 下载

打在AriaNG管理页面–>Aria2设置–> HTTP 设置
自定义 User Agent(user-agent)设置为:<User-Agent内容>

新建 --> 黏贴下载链接 --> 选项 --> 勾选 Http

  • 请求来源(referer)设置为:<访问来源>
  • 自定义请求头(header)设置为:Cookie: <你的cookie内容>。注意:此处**Cookie:**字样也需要填入。

附:FFmpeg解码M3U8合并解密TS到MP4

参考:https://luluit.top/archives/2070.html

FFmpeg安装

macOS/Win 下可以去这里下载单文件版。当然macOS也可以使用brew安装(依赖包较多)。

1
brew install ffmpeg

解密合并

将 m3u8 列表文件(如:index.m3u8)、离线密钥和 ts 文件放在同一目录下,使用ffmpeg命令进行解密合并成单个 mp4文件:

一般情况:

1
ffmpeg -i index.m3u8 -c copy XXXX.MP4

对于使用在线密钥时:

1
ffmpeg -allowed_extensions ALL -protocol_whitelist https,tls,tcp,file,crypto -i index.m3u8 -c copy XXXX.MP4

以前使用 Travis CI 自动部署Hexo博客,但是,Travis CI 免费账户的速度不算太快。这次,使用 Github 自带的Actions功能,实现自动部署。实测后部署速度的确更快。

GitHub Actions 由 GitHub 官方推出的工作流工具。典型的应用场景应该是 CI/CD,类似 Travis 的用法。

项目背景

我的博客源码和静态文件存放在一个 github 项目中的两个独立分支。

分支 说明
hexo 原始数据及配置
master 静态页面

项目设置

生成密钥对

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -N "" -f deploy_key

会生成 deploy_key私钥 和 deploy_key.pub公钥两个文件。

添加公钥

项目页 --> Settings --> Deploy keys --> Add deploy key

deploy_key.pub公钥内容复制上去,勾选:Allow write access

添加加密环境变量

项目页 --> Settings --> Secrets --> Add a new secret

环境变量名可以任意命名,但要和Actions里的设定$对应

环境变量 说明
DEPLOY_KEY 发布key 私钥,deploy_key私钥文件内容
EMAIL 发布用户邮箱账号
NAME 发布用户名

修改_config.yml

1
2
3
4
5
6
7
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: git@github.com:maboloshi/Blog.git
branch: master
message: "Github CI Auto Builder at {{ now('YYYY-MM-DD HH:mm:ss Z') }}"

repo链接必须使用 ssh 格式

编写 Action 脚本

此处使用成熟方案

在根目录下创建 GitHub Actions workflow 文件,.github/workflows/hexo.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: Hexo CICD

on: # 监视 `hexo`分支
push:
branches:
- hexo

jobs:
build:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]')"
steps:
- name: Checkout
uses: actions/checkout@v1
with:
submodules: true
- name: Cache node modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}
- uses: yrpang/github-actions-hexo@master
with:
deploykey: ${{secrets.DEPLOY_KEY}}
username: ${{secrets.NAME}}
email: ${{secrets.EMAIL}}

注意:

  1. 根目录下.gitignore中需要移除package-lock.json
  2. 静态页面是强制推送,覆盖历史数据

小结

GitHub Actions将自动监视hexo分支,并对任何除带[ci skip]的 push 触发执行。

参考

Relying on basic authentication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#
#依靠基本身份验证从github企业获取原始内容的单一代码。
#无需创建访问令牌并将其合并到url中。
#
#
#填空:
#
#USER 您用于验证的登录用户名(将在终端上提示您输入密码)
#GHE_DOMAIN github 企业自定义域
#REPO_OWNER 拥有存储库的用户/组织
#REPO_NAME 资料库的名称
#REF git ref,例如分支或提交(大多数情况下,您可能希望使用“ master”)
#FILE 要获取的文件的路径,包括文件扩展名。 也用作本地创建文件的名称
#OAUTH-TOKEN 二步验证码

curl -u "${USER}" -O https://${GHE_DOMAIN}/raw/${REPO_OWNER}/${REPO_NAME}/${REF}/${FILE}

参考:

Accessing GitHub using two-factor authentication

1
curl -u "${USER}" -H "X-GitHub-OTP: ${OTPCODE}" -O https://${GHE_DOMAIN}/raw/${REPO_OWNER}/${REPO_NAME}/${REF}/${FILE}

Relying on OAuth2 token authentication

You’ll need an access token as described in this GitHub Help article: https://help.github.com/articles/creating-an-access-token-for-command-line-use

作为url中的参数明文传输

1
curl -O https://${OAUTH-TOKEN}@${GHE_DOMAIN}/raw/${REPO_OWNER}/${REPO_NAME}/${REF}/${FILE}

作为header中的参数传输

1
curl -H "Authorization: token ${OAUTH-TOKEN}" -O https://${GHE_DOMAIN}/raw/${REPO_OWNER}/${REPO_NAME}/${REF}/${FILE}

Relying on SSH certificate authentication

1
scp [-i identity_file] ${USER}@${GHE_DOMAIN}:${REPO_OWNER}/${REPO_NAME}.git/${REF}/${FILE}  /path/to/local/file

identity_file: 验证私钥文件

  1. 确认当前使用的主题
    首选项 > 设置 > "theme"值, 比如Adaptive.sublime-theme

  2. 在用户设置目录(插件目录/User)下创建同名文件Adaptive.sublime-theme

原理:自定义设置覆盖默认设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"rules":
[
{ //侧边栏字体大小
"class": "sidebar_label",
"font.size": 14
},
// { //侧边栏行间距
// "class": "sidebar_tree",
// "row_padding": [16, 3, 4, 3],
// },
// { //修改文档标题字体大小
// "class": "tab_label",
// "font.size": 14
// },
]
}

更多设置,可参考原主题文件

0%