Compare commits
1 Commits
0ed904319d
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
22246060e6
|
@@ -1,3 +1,6 @@
|
|||||||
|
**/.git
|
||||||
|
.manager/*
|
||||||
|
!.manager/.gitkeep
|
||||||
cache/
|
cache/
|
||||||
|
|
||||||
files/*.log
|
files/*.log
|
||||||
|
|||||||
@@ -16,3 +16,18 @@
|
|||||||
| ---------- | ------------------------------------- | ---------------------------------------------- |
|
| ---------- | ------------------------------------- | ---------------------------------------------- |
|
||||||
| alass | 字幕自动同步(autosubsync 脚本) | `paru -S alass` |
|
| alass | 字幕自动同步(autosubsync 脚本) | `paru -S alass` |
|
||||||
| ffsubsync | 字幕自动同步(alass 的替代) | `pip install ffsubsync` |
|
| ffsubsync | 字幕自动同步(alass 的替代) | `pip install ffsubsync` |
|
||||||
|
|
||||||
|
## 字体
|
||||||
|
|
||||||
|
弹幕中可能出现 emoji, 因此需要使用支持的字体, 例如将 Symbola 加到 Noto Sans CJK SC 的末尾:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit mode="append" name="family">
|
||||||
|
<string>Symbola</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
```
|
||||||
|
|||||||
@@ -60,10 +60,21 @@ icc/ # ICC 色彩配置文件
|
|||||||
|
|
||||||
## 更新流程
|
## 更新流程
|
||||||
|
|
||||||
1. 在 mpv 中按 `M` 触发 manager.lua,观察控制台输出,确认无 `FAILED` 条目
|
1. 在 mpv 中按 `M` 触发 manager.lua,观察控制台输出,确认无 `FAILED` 条目。可能会有其他报错如 `[manager] Fehler: externes Repository manager existiert bereits.`,这是正常的。只需要确保不出现全大写的 `FAILED` 即可。
|
||||||
2. 更新完成后删除 manager 在子目录留下的嵌套 `.git`(否则 `git add` 会失败):
|
2. 将 manager.lua 在 dest 目录产生的嵌套 `.git` 目录迁移到仓库内的 `.manager/`(避免根仓库误判为 submodule,幂等可重复执行):
|
||||||
```bash
|
```bash
|
||||||
find ~/.config/mpv -mindepth 2 -name .git -type d | sort -r | xargs rm -rvf
|
REPO=$(git -C ~/.config/mpv rev-parse --show-toplevel)
|
||||||
|
GITSTORE="$REPO/.manager"
|
||||||
|
mkdir -p "$GITSTORE"
|
||||||
|
find -L ~/.config/mpv -mindepth 2 -name .git -type d | while read gitdir; do
|
||||||
|
dest="${gitdir%/.git}"
|
||||||
|
rel="${dest#$REPO/}"
|
||||||
|
name=$(echo "$rel" | tr '/' '-')
|
||||||
|
mv "$gitdir" "$GITSTORE/$name"
|
||||||
|
depth=$(echo "$rel" | tr -cd '/' | wc -c)
|
||||||
|
ups=$(printf '../%.0s' $(seq 1 $((depth + 1))))
|
||||||
|
echo "gitdir: ${ups}.manager/$name" > "$dest/.git"
|
||||||
|
done
|
||||||
```
|
```
|
||||||
3. 重启 mpv,检查控制台有无 `unknown key` 或脚本加载失败的警告
|
3. 重启 mpv,检查控制台有无 `unknown key` 或脚本加载失败的警告
|
||||||
4. 若有 `unknown key` 警告,说明对应脚本的配置项发生变化,找 `script-opts/` 下同名 `.conf` 对照脚本源码更新
|
4. 若有 `unknown key` 警告,说明对应脚本的配置项发生变化,找 `script-opts/` 下同名 `.conf` 对照脚本源码更新
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2
-2
@@ -70,8 +70,8 @@ UP no-osd add volume 5; script-message-to uosc flash-volume
|
|||||||
DOWN no-osd add volume -5; script-message-to uosc flash-volume #menu: 音频 > 音量 > 音量 -5
|
DOWN no-osd add volume -5; script-message-to uosc flash-volume #menu: 音频 > 音量 > 音量 -5
|
||||||
SHIFT+RIGHT seek 1 exact #menu: 导航 > 前进后退 > 精准前进 1 秒
|
SHIFT+RIGHT seek 1 exact #menu: 导航 > 前进后退 > 精准前进 1 秒
|
||||||
SHIFT+LEFT seek -1 exact #menu: 导航 > 前进后退 > 精准后退 1 秒
|
SHIFT+LEFT seek -1 exact #menu: 导航 > 前进后退 > 精准后退 1 秒
|
||||||
SHIFT+UP seek 80 exact #menu: 导航 > 前进后退 > 精准前进 80 秒
|
SHIFT+UP seek 85 exact #menu: 导航 > 前进后退 > 精准前进 80 秒
|
||||||
SHIFT+DOWN seek -80 exact #menu: 导航 > 前进后退 > 精准后退 80 秒
|
SHIFT+DOWN seek -85 exact #menu: 导航 > 前进后退 > 精准后退 80 秒
|
||||||
CTRL+z script-message-to undoredo undo #menu: 导航 > 跳转 > 撤消跳转
|
CTRL+z script-message-to undoredo undo #menu: 导航 > 跳转 > 撤消跳转
|
||||||
CTRL+x script-message-to undoredo redo #menu: 导航 > 跳转 > 重做跳转
|
CTRL+x script-message-to undoredo redo #menu: 导航 > 跳转 > 重做跳转
|
||||||
CTRL+ALT+z script-message-to undoredo undoLoop #menu: 导航 > 跳转 > 循环跳转
|
CTRL+ALT+z script-message-to undoredo undoLoop #menu: 导航 > 跳转 > 循环跳转
|
||||||
|
|||||||
+7
-1
@@ -1,4 +1,10 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"git": "https://github.com/po5/mpv_manager",
|
||||||
|
"branch": "master",
|
||||||
|
"whitelist": "manager%.lua$",
|
||||||
|
"dest": "~~/scripts"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"git": "https://github.com/po5/evafast",
|
"git": "https://github.com/po5/evafast",
|
||||||
"branch": "rewrite",
|
"branch": "rewrite",
|
||||||
@@ -60,7 +66,7 @@
|
|||||||
{
|
{
|
||||||
"git": "https://github.com/Tony15246/uosc_danmaku",
|
"git": "https://github.com/Tony15246/uosc_danmaku",
|
||||||
"branch": "main",
|
"branch": "main",
|
||||||
"blacklist": "^%.",
|
"blacklist": "^%.|^\"",
|
||||||
"dest": "~~/scripts/uosc_danmaku"
|
"dest": "~~/scripts/uosc_danmaku"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
|||||||
|
-- https://github.com/Seme4eg/mpv-scripts/blob/master/script-modules/extended-menu.lua
|
||||||
|
|
||||||
local mp = require 'mp'
|
local mp = require 'mp'
|
||||||
local utils = require 'mp.utils'
|
local utils = require 'mp.utils'
|
||||||
local assdraw = require 'mp.assdraw'
|
local assdraw = require 'mp.assdraw'
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ scrolltime=15
|
|||||||
## 固定弹幕的显示时间
|
## 固定弹幕的显示时间
|
||||||
fixtime=5
|
fixtime=5
|
||||||
## 字体
|
## 字体
|
||||||
fontname=Noto Sans CJK SC
|
fontname=danmaku
|
||||||
## 字体大小
|
## 字体大小
|
||||||
fontsize=30
|
fontsize=24
|
||||||
## 透明度
|
## 透明度
|
||||||
opacity=0.6
|
opacity=0.6
|
||||||
## 粗体
|
## 粗体
|
||||||
|
|||||||
+10
-55
@@ -1,4 +1,3 @@
|
|||||||
local msg = require "mp.msg"
|
|
||||||
local utils = require "mp.utils"
|
local utils = require "mp.utils"
|
||||||
local legacy = mp.command_native_async == nil
|
local legacy = mp.command_native_async == nil
|
||||||
local config = {}
|
local config = {}
|
||||||
@@ -45,55 +44,22 @@ function apply_defaults(info)
|
|||||||
return info
|
return info
|
||||||
end
|
end
|
||||||
|
|
||||||
local function build_directory_string(dir, repo)
|
|
||||||
local str = ""
|
|
||||||
local contents = utils.readdir(dir)
|
|
||||||
if not contents then return msg.error("could not access local repo:", repo) end
|
|
||||||
for _, item in ipairs(contents) do
|
|
||||||
local path = dir..'/'..item
|
|
||||||
if utils.file_info(path).is_dir then
|
|
||||||
if item ~= ".git" then str = str..'/'..build_directory_string(path, repo)..'\n' end
|
|
||||||
else
|
|
||||||
str = str..(path:sub(repo:len()+2))..'\n'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_file_list(info)
|
|
||||||
if not info.local_repo then
|
|
||||||
return run({"git", "-C", info.edist, "ls-tree", "-r", "--name-only", "remotes/manager/"..info.branch}).stdout
|
|
||||||
else
|
|
||||||
return build_directory_string(info.local_repo, info.local_repo)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function update(info)
|
function update(info)
|
||||||
info = apply_defaults(info)
|
info = apply_defaults(info)
|
||||||
if not info then return false end
|
if not info then return false end
|
||||||
|
|
||||||
local base = nil
|
local base = nil
|
||||||
|
|
||||||
info.edist = string.match(mp.command_native({"expand-path", info.dest}), "(.-)[/\\]?$")
|
local e_dest = string.match(mp.command_native({"expand-path", info.dest}), "(.-)[/\\]?$")
|
||||||
mkdir(info.edist)
|
mkdir(e_dest)
|
||||||
|
|
||||||
local files = {}
|
local files = {}
|
||||||
|
|
||||||
if info.local_repo then
|
run({"git", "-C", e_dest, "remote", "add", "manager", info.git})
|
||||||
info.local_repo = mp.command_native({"expand-path", info.local_repo})
|
run({"git", "-C", e_dest, "remote", "set-url", "manager", info.git})
|
||||||
if not utils.file_info(info.local_repo) then
|
run({"git", "-C", e_dest, "fetch", "manager", info.branch})
|
||||||
info.local_repo = false
|
|
||||||
msg.warn("local repo not found - falling back to git")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not info.local_repo then
|
for file in string.gmatch(run({"git", "-C", e_dest, "ls-tree", "-r", "--name-only", "remotes/manager/"..info.branch}).stdout, "[^\r\n]+") do
|
||||||
run({"git", "-C", info.edist, "remote", "add", "manager", info.git})
|
|
||||||
run({"git", "-C", info.edist, "remote", "set-url", "manager", info.git})
|
|
||||||
run({"git", "-C", info.edist, "fetch", "manager", info.branch})
|
|
||||||
end
|
|
||||||
|
|
||||||
for file in string.gmatch(get_file_list(info), "[^\r\n]+") do
|
|
||||||
local l_file = string.lower(file)
|
local l_file = string.lower(file)
|
||||||
if info.whitelist == "" or match(l_file, info.whitelist) then
|
if info.whitelist == "" or match(l_file, info.whitelist) then
|
||||||
if info.blacklist == "" or not match(l_file, info.blacklist) then
|
if info.blacklist == "" or not match(l_file, info.blacklist) then
|
||||||
@@ -118,18 +84,9 @@ function update(info)
|
|||||||
for _, file in ipairs(files) do
|
for _, file in ipairs(files) do
|
||||||
local based = string.sub(file, string.len(base)+1)
|
local based = string.sub(file, string.len(base)+1)
|
||||||
local p_based = parent(based)
|
local p_based = parent(based)
|
||||||
if p_based and not info.flatten_folders then mkdir(info.edist.."/"..p_based) end
|
if p_based and not info.flatten_folders then mkdir(e_dest.."/"..p_based) end
|
||||||
|
local c = string.match(run({"git", "-C", e_dest, "--no-pager", "show", "remotes/manager/"..info.branch..":"..file}).stdout, "(.-)[\r\n]?$")
|
||||||
local c = ""
|
local f = io.open(e_dest.."/"..(info.flatten_folders and file:match("[^/]+$") or based), "w")
|
||||||
if info.local_repo then
|
|
||||||
local source = io.open(info.local_repo..'/'..file)
|
|
||||||
c = source:read("*a")
|
|
||||||
source:close()
|
|
||||||
else
|
|
||||||
c = string.match(run({"git", "-C", info.edist, "--no-pager", "show", "remotes/manager/"..info.branch..":"..file}).stdout, "(.-)[\r\n]?$")
|
|
||||||
end
|
|
||||||
|
|
||||||
local f = io.open(info.edist.."/"..(info.flatten_folders and file:match("[^/]+$") or based), "w")
|
|
||||||
f:write(c)
|
f:write(c)
|
||||||
f:close()
|
f:close()
|
||||||
end
|
end
|
||||||
@@ -150,10 +107,8 @@ function update_all()
|
|||||||
end
|
end
|
||||||
|
|
||||||
for i, info in ipairs(config) do
|
for i, info in ipairs(config) do
|
||||||
print("updating", (info.git:match("([^/]+)%.git$") or info.git).."...")
|
print("update"..i, update(info))
|
||||||
if not update(info) then msg.error("FAILED") end
|
|
||||||
end
|
end
|
||||||
print("all files updated")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
mp.add_key_binding(nil, "manager-update-all", update_all)
|
mp.add_key_binding(nil, "manager-update-all", update_all)
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
-- Install [Torrserver](https://github.com/YouROK/TorrServer)
|
|
||||||
-- then add "script-opts-append=mpv_torrserver-server=http://[TorrServer ip]:[port]" to mpv.conf
|
|
||||||
local utils = require 'mp.utils'
|
|
||||||
|
|
||||||
local opts = {
|
|
||||||
server = "http://localhost:8090",
|
|
||||||
torrserver_init = false,
|
|
||||||
torrserver_path = "TorrServer",
|
|
||||||
search_for_external_tracks = true
|
|
||||||
}
|
|
||||||
|
|
||||||
(require 'mp.options').read_options(opts)
|
|
||||||
local luacurl_available, cURL = pcall(require, 'cURL')
|
|
||||||
|
|
||||||
local is_windows = package.config:sub(1, 1) == "\\" -- detect path separator, windows uses backslashes
|
|
||||||
|
|
||||||
local function find_executable(name)
|
|
||||||
local os_path = os.getenv("PATH") or ""
|
|
||||||
local fallback_path = utils.join_path("/usr/bin", name)
|
|
||||||
local exec_path
|
|
||||||
for path in os_path:gmatch("[^:]+") do
|
|
||||||
exec_path = utils.join_path(path, name)
|
|
||||||
local meta, meta_error = utils.file_info(exec_path)
|
|
||||||
if meta and meta.is_file then
|
|
||||||
return exec_path
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not is_windows then return fallback_path end
|
|
||||||
return name -- fallback to just the name, hoping it's in PATH
|
|
||||||
end
|
|
||||||
|
|
||||||
local function init()
|
|
||||||
local exec_path = find_executable(opts.torrserver_path)
|
|
||||||
local windows_args = { 'powershell', '-NoProfile', '-Command', exec_path }
|
|
||||||
local unix_args = { '/bin/bash', '-c', exec_path }
|
|
||||||
local args = is_windows and windows_args or unix_args
|
|
||||||
local res = mp.command_native_async({ name = "subprocess", capture_stdout = true, playback_only = false, args = args })
|
|
||||||
if res.status == 0 then
|
|
||||||
mp.msg.error("TorrServer failed to start: ")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local char_to_hex = function(c)
|
|
||||||
return string.format("%%%02X", string.byte(c))
|
|
||||||
end
|
|
||||||
|
|
||||||
local function urlencode(url)
|
|
||||||
if url == nil then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
url = url:gsub("\n", "\r\n")
|
|
||||||
url = url:gsub("([^%w ])", char_to_hex)
|
|
||||||
url = url:gsub(" ", "+")
|
|
||||||
return url
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_magnet_info(url)
|
|
||||||
local info_url = opts.server .. "/stream?stat&link=" .. urlencode(url)
|
|
||||||
local res
|
|
||||||
if not (luacurl_available) then
|
|
||||||
-- if Lua-cURL is not available on this system
|
|
||||||
local curl_cmd = {
|
|
||||||
"curl",
|
|
||||||
"-L",
|
|
||||||
"--silent",
|
|
||||||
"--max-time", "10",
|
|
||||||
info_url
|
|
||||||
}
|
|
||||||
local cmd = mp.command_native {
|
|
||||||
name = "subprocess",
|
|
||||||
capture_stdout = true,
|
|
||||||
playback_only = false,
|
|
||||||
args = curl_cmd
|
|
||||||
}
|
|
||||||
res = cmd.stdout
|
|
||||||
else
|
|
||||||
-- otherwise use Lua-cURL (binding to libcurl)
|
|
||||||
local buf = {}
|
|
||||||
local c = cURL.easy_init()
|
|
||||||
c:setopt_followlocation(1)
|
|
||||||
c:setopt_url(info_url)
|
|
||||||
c:setopt_writefunction(function(chunk)
|
|
||||||
table.insert(buf, chunk);
|
|
||||||
return true;
|
|
||||||
end)
|
|
||||||
c:perform()
|
|
||||||
res = table.concat(buf)
|
|
||||||
end
|
|
||||||
if res and res ~= "" then
|
|
||||||
return (require 'mp.utils').parse_json(res)
|
|
||||||
else
|
|
||||||
return nil, "no info response (timeout?)"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function edlencode(url)
|
|
||||||
return "%" .. string.len(url) .. "%" .. url
|
|
||||||
end
|
|
||||||
|
|
||||||
local function guess_type_by_extension(ext)
|
|
||||||
if ext == "mkv" or ext == "mp4" or ext == "avi" or ext == "wmv" or ext == "vob" or ext == "m2ts" or ext == "ogm" then
|
|
||||||
return "video"
|
|
||||||
end
|
|
||||||
if ext == "mka" or ext == "mp3" or ext == "aac" or ext == "flac" or ext == "ogg" or ext == "wma" or ext == "mpg"
|
|
||||||
or ext == "wav" or ext == "wv" or ext == "opus" or ext == "ac3" then
|
|
||||||
return "audio"
|
|
||||||
end
|
|
||||||
if ext == "ass" or ext == "srt" or ext == "vtt" then
|
|
||||||
return "sub"
|
|
||||||
end
|
|
||||||
return "other";
|
|
||||||
end
|
|
||||||
|
|
||||||
local function string_replace(str, match, replace)
|
|
||||||
local s, e = string.find(str, match, 1, true)
|
|
||||||
if s == nil or e == nil then
|
|
||||||
return str
|
|
||||||
end
|
|
||||||
return string.sub(str, 1, s - 1) .. replace .. string.sub(str, e + 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- https://github.com/mpv-player/mpv/blob/master/DOCS/edl-mpv.rst
|
|
||||||
local function generate_m3u(magnet_uri, files)
|
|
||||||
for _, fileinfo in ipairs(files) do
|
|
||||||
-- strip top directory
|
|
||||||
if fileinfo.path:find("/", 1, true) then
|
|
||||||
fileinfo.fullpath = string.sub(fileinfo.path, fileinfo.path:find("/", 1, true) + 1)
|
|
||||||
else
|
|
||||||
fileinfo.fullpath = fileinfo.path
|
|
||||||
end
|
|
||||||
fileinfo.path = {}
|
|
||||||
for w in fileinfo.fullpath:gmatch("([^/]+)") do table.insert(fileinfo.path, w) end
|
|
||||||
local ext = string.match(fileinfo.path[#fileinfo.path], "%.(%w+)$")
|
|
||||||
fileinfo.type = guess_type_by_extension(ext)
|
|
||||||
end
|
|
||||||
table.sort(files, function(a, b)
|
|
||||||
-- make top-level files appear first in the playlist
|
|
||||||
if (#a.path == 1 or #b.path == 1) and #a.path ~= #b.path then
|
|
||||||
return #a.path < #b.path
|
|
||||||
end
|
|
||||||
-- make videos first
|
|
||||||
if (a.type == "video" or b.type == "video") and a.type ~= b.type then
|
|
||||||
return a.type == "video"
|
|
||||||
end
|
|
||||||
-- otherwise sort by path
|
|
||||||
return a.fullpath < b.fullpath
|
|
||||||
end);
|
|
||||||
|
|
||||||
local infohash = magnet_uri:match("^magnet:%?xt=urn:bt[im]h:(%w+)") or urlencode(magnet_uri)
|
|
||||||
|
|
||||||
local playlist = { '#EXTM3U' }
|
|
||||||
|
|
||||||
for _, fileinfo in ipairs(files) do
|
|
||||||
if fileinfo.processed ~= true then
|
|
||||||
table.insert(playlist, '#EXTINF:0,' .. fileinfo.fullpath)
|
|
||||||
local basename = string.match(fileinfo.path[#fileinfo.path], '^(.+)%.%w+$')
|
|
||||||
|
|
||||||
local url = opts.server .. "/stream/" .. urlencode(fileinfo.fullpath) .."?play&index=" .. fileinfo.id .. "&link=" .. infohash
|
|
||||||
local hdr = { "!new_stream", "!no_clip",
|
|
||||||
--"!track_meta,title=" .. edlencode(basename),
|
|
||||||
edlencode(url)
|
|
||||||
}
|
|
||||||
local edl = "edl://" .. table.concat(hdr, ";") .. ";"
|
|
||||||
local external_tracks = 0
|
|
||||||
|
|
||||||
fileinfo.processed = true
|
|
||||||
if opts.search_for_external_tracks and basename ~= nil and fileinfo.type == "video" then
|
|
||||||
mp.msg.info("!" .. basename)
|
|
||||||
|
|
||||||
for _, fileinfo2 in ipairs(files) do
|
|
||||||
if #fileinfo2.path > 0 and
|
|
||||||
fileinfo2.type ~= "other" and
|
|
||||||
fileinfo2.processed ~= true and
|
|
||||||
string.find(fileinfo2.path[#fileinfo2.path], basename, 1, true) ~= nil
|
|
||||||
then
|
|
||||||
mp.msg.info("->" .. fileinfo2.fullpath)
|
|
||||||
local title = string_replace(fileinfo2.fullpath, basename, "%")
|
|
||||||
local url = opts.server .. "/stream/" .. urlencode(fileinfo2.fullpath).."?play&index=" .. fileinfo2.id .. "&link=" .. infohash
|
|
||||||
local hdr = { "!new_stream", "!no_clip", "!no_chapters",
|
|
||||||
"!delay_open,media_type=" .. fileinfo2.type,
|
|
||||||
"!track_meta,title=" .. edlencode(title),
|
|
||||||
edlencode(url)
|
|
||||||
}
|
|
||||||
edl = edl .. table.concat(hdr, ";") .. ";"
|
|
||||||
fileinfo2.processed = true
|
|
||||||
external_tracks = external_tracks + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if external_tracks == 0 then -- dont use edl
|
|
||||||
table.insert(playlist, url)
|
|
||||||
else
|
|
||||||
table.insert(playlist, edl)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return table.concat(playlist, '\n')
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_hook("on_load", 5, function()
|
|
||||||
local url = mp.get_property("stream-open-filename")
|
|
||||||
if url:find("^magnet:") == 1 or (url:find("^https?://") == 1 and url:find("%.torrent$") ~= nil) then
|
|
||||||
mp.set_property_bool("file-local-options/ytdl", false)
|
|
||||||
if opts.torrserver_init then init() end
|
|
||||||
local magnet_info, err = get_magnet_info(url)
|
|
||||||
if type(magnet_info) == "table" then
|
|
||||||
if magnet_info.file_stats then
|
|
||||||
-- torrent has multiple files. open as playlist
|
|
||||||
mp.set_property("stream-open-filename", "memory://" .. generate_m3u(url, magnet_info.file_stats))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
-- if not a playlist and has a name
|
|
||||||
if magnet_info.name then
|
|
||||||
mp.set_property("stream-open-filename", "memory://#EXTM3U\n" ..
|
|
||||||
"#EXTINF:0," .. magnet_info.name .. "\n" ..
|
|
||||||
opts.server .. "/stream?play&index=1&link=" .. urlencode(url))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
else
|
|
||||||
mp.msg.warn("error: " .. err)
|
|
||||||
end
|
|
||||||
mp.set_property("stream-open-filename", opts.server .. "/stream?m3u&link=" .. urlencode(url))
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
Reference in New Issue
Block a user