Skip to content

Izumiko/jellyfin-danmaku

 
 

Repository files navigation

jellyfin-danmaku

Jellyfin弹幕插件

image

界面

请注意Readme上方截图可能与最新版存在差异,请以实际版本与说明为准

左下方新增如下按钮,若按钮透明度与"暂停"等其他原始按钮存在差异,说明插件正在进行加载

  • 弹幕开关: 切换弹幕显示/隐藏状态
  • 搜索弹幕: 手动输入信息匹配弹幕
  • 增加弹幕源: 手动添加自定义弹幕源(用于番剧刚发布,弹弹Play还未收录弹幕源地址时使用,如果已经登录,则会提交给弹弹Play)
  • 弹幕设置:
    • 设置弹幕透明度 [0, 1]
    • 设置弹幕速度 [20, 600]
    • 设置弹幕字体大小 [8, 80]
    • 设置弹幕区域占屏幕的高度比例 [0, 1]
    • 弹幕密度: 依据水平和垂直密度过滤, 弹幕0级无限制*
    • 设置弹幕用户名过滤,支持选项: 哔哩哔哩, 巴哈姆特, 弹弹Play, 其他
    • 设置弹幕类型过滤,支持:底部,顶部,滚动
    • 简繁转换: 在原始弹幕/简体中文/繁体中文3种模式切换
    • 是否使用本地XML弹幕
    • 当前集数弹幕偏移时间
  • 日志开关: 开启/关闭调试日志输出
  • 发送弹幕: 登录弹弹Play,并在播放界面发送弹幕

*除0级外均带有每3秒6条的垂直方向弹幕密度限制,高于该限制密度的顶部/底部弹幕将会被转为普通弹幕

支持的客户端

  • Jellyfin Web
  • Jellyfin Android (播放器类型仅限网页播放器)
  • Jellyfin iOS

弹幕

弹幕来源为 弹弹 play ,已开启弹幕聚合(Acfun/Bili/Tucao/Baha/5DM/iQIYI等不知名网站弹幕融合)

在启用了使用本地xml弹幕后,会尝试调用cxfksword/jellyfin-plugin-danmu的API获取其预先下载好的xml弹幕,绕过弹弹play的弹幕查询和加载

数据

匹配完成后对应关系会保存在浏览器(或客户端)本地存储中,后续播放(包括同季的其他集)会优先按照保存的匹配记录载入弹幕

安装

任选以下一种方式安装即可,方式1-3可以持久化。

注: 安装完首次使用时,确保只有当前一个客户端访问服务器,以方便根据当前用户id获取Session时能唯一定位到当前客户端设备id。(主要是由于非Jellyfin Web客户端没有默认在localstorage中存储DeviceID)

1. 浏览器插件(推荐)

  1. 安装Tampermonkey插件
  2. 添加脚本

2. 反向代理处理(推荐)

2.1 Nginx

使用Nginx反向代理Jellyfin并在location块中插入:

proxy_set_header Accept-Encoding "";
sub_filter '</body>' '<script src="https://jellyfin-danmaku.pages.dev/ede.user.js?noCors=1" defer></script></body>';
sub_filter_once on;

若需要本地代理弹弹play API,不使用CF Worker代理,则加入新的 location 块,否则删除上面网址中的?noCors=1:

location /ddplay-api/ {
    proxy_pass https://api.dandanplay.net;
    proxy_set_header Host $host;

    # example.com 根据自己的域名设置,或直接设为*
    add_header Access-Control-Allow-Origin "example.com";
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept, Authorization";
}

location /ddplay-api/api/v2/login {
    rewrite ^/ddplay-api/api/v2/login(.*)$ /cors/https://api.dandanplay.net/api/v2/login$1 break;
    proxy_pass https://ddplay-api.930524.xyz;
    proxy_set_header Host $host;

    # example.com 根据自己的域名设置,或直接设为*
    add_header Access-Control-Allow-Origin "example.com";
    add_header Access-Control-Allow-Methods "POST, OPTIONS";
    add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept, Authorization";
}

2.2 Caddy

下载Caddy二进制文件时,增加第三方模块sjtug/caddy2-filter,之后,在Caddyfile中按如下内容修改

# 全局设置
{
    order filter after encode
}

# 网站设置
example.com {
    filter {
        path /web/.*
        search_pattern </body>
        replacement "<script src=\"https://jellyfin-danmaku.pages.dev/ede.user.js?noCors=1\" defer></script></body>"
        content_type text/html
    }
    reverse_proxy localhost:8096 {
        header_up Accept-Encoding identity
    }

    # 若需要本地代理弹弹play API,不使用CF Worker代理,则加入下面两个handle_path,否则删除上面网址中的 ?noCors=1
    handle_path /ddplay-api/* {
        reverse_proxy https://api.dandanplay.net {
            header_up Host {upstream_hostport}
            header_down Access-Control-Allow-Origin "example.com"
            header_down Access-Control-Allow-Methods "GET, POST, OPTIONS"
            header_down Access-Control-Allow-Headers "Origin, Content-Type, Accept, Authorization"
        }
    }
    handle_path /ddplay-api/api/v2/login* {
        rewrite * /cors/https://api.dandanplay.net/api/v2/login{http.request.uri.path}
        reverse_proxy https://ddplay-api.930524.xyz {
            header_up Host {upstream_hostport}
            header_down Access-Control-Allow-Origin "example.com"
            header_down Access-Control-Allow-Methods "POST, OPTIONS"
            header_down Access-Control-Allow-Headers "Origin, Content-Type, Accept, Authorization"
        }
    }
}

3. 修改服务端启动命令

思路来源

3.1 Docker模式启动的服务端

官方镜像的Entrypoint是/jellyfin/jellyfinhotio/jellyfin镜像的Entrypoint是/init,可在docker-compose.yml的jellyfin部分增加一行如下代码,用带sed的Entrypoint替换默认的Entrypoint。

官方镜像:

entrypoint: sed -i 's#</div></body>#</div><script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /jellyfin/jellyfin-web/index.html && /jellyfin/jellyfin

hotio/jellyfin镜像:

entrypoint: sed -i 's#</div></body>#</div><script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /usr/share/jellyfin/web/index.html && /init

3.2 直接用包管理器安装,并使用systemd管理的服务端

部分用户使用deb包或者Arch Linux的aur包安装Jellyfin,可以修改systemd service文件来实现启动时追加js脚本。 运行systemctl edit jellyfin.service,进入编辑界面,然后输入如下内容:

deb包安装的版本:

[Service]
ExecStartPre=-/usr/bin/sed -i 's#</div></body>#</div><script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /usr/share/jellyfin/web/index.html

aur安装的版本:

[Service]
ExecStartPre=-/usr/bin/sed -i 's#</div></body>#</div><script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /usr/lib/jellyfin/jellyfin-web/index.html

保存后,运行systemctl daemon-reload生效,systemctl restart jellyfin重启当前服务。

4. 修改服务端

修改文件 /usr/share/jellyfin/web/index.html (Default)

/jellyfin/jellyfin-web/index.html (Official Docker)

</body>前添加如下标签

<script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script>

Shell中的操作命令为:

Official Docker:

sed -i 's#</body>#<script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /jellyfin/jellyfin-web/index.html

Default:

sed -i 's#</body>#<script src="https://jellyfin-danmaku.pages.dev/ede.user.js" defer></script></body>#' /usr/share/jellyfin/web/index.html

该方式安装与浏览器插件安装可同时使用不冲突

常见弹幕加载错误/失败原因

  1. 译名导致的异常: 如『よふかしのうた』 Emby 识别为《彻夜之歌》后因为弹弹 play 中为《夜曲》导致无法匹配
  2. 存在多季/剧场版/OVA 等导致的异常: 如『OVERLORD』第四季若使用S[N]格式归档(如OVERLORD/S4E1.mkv或OVERLORD/S4/E1.mkv),可能出现匹配失败/错误等现象
  3. 其他加载BUG: 鉴定为后端程序猿不会前端还要硬写JS,有BUG麻烦 开个issue THX

首次播放时请检查当前弹幕信息是否正确匹配,若匹配错误请尝试手动匹配

鸣谢

感谢JetBrains OpenSourceSupport所提供的支持

JetBrains Logo (Main) logo

Stargazers over time

About

Jellyfin danmaku extension

Topics

Resources

License

Stars

Watchers

Forks

Languages

  • JavaScript 100.0%