MCDFsteve / NipaPlay

Nipaplay 一款跨平台(Windows Linux macOS)本地弹幕视频播放器。弹弹play 的mac代餐。主要平台为macOS,也是基于macOS开发,其他平台仅做移植。
GNU General Public License v3.0
82 stars 2 forks source link

挂载网络媒体库 #14

Open jcfun opened 3 weeks ago

jcfun commented 3 weeks ago

请问是否有实现挂载网络媒体库的计划?最好能直接通过webdav或者ftp等协议挂载nas中的文件夹并播放视频

MCDFsteve commented 3 weeks ago

目前经过我的测试,webdav协议文件夹是可以直接播放视频的,ftp应该也差不多(提前挂载在访达)

jcfun commented 2 weeks ago

我在linux下使用kde桌面,默认打开的文件管理器不会显示挂载的文件夹(直接打开文件管理器会显示),我在强制让nipaplay使用系统自带的文件夹后可以正确显示挂载的文件夹,并添加到媒体库。但是有一个问题是,电脑每次重启已挂载的媒体库就会无法访问,日志中好像是因为挂载的路径发生了变化。有没有办法不依赖系统文件管理器,而是实现类似于弹弹play安卓版那样的挂载方式呢?

打开对应媒体库为空: image

报错: image

MCDFsteve commented 2 weeks ago

挂载路径发生变化? 你试试这些方法来固定挂载路径? 要在 Linux 下实现媒体库路径的持久挂载并避免路径变化,可以尝试以下方法。目标是让应用不依赖系统的文件管理器,同时确保每次启动系统时挂载的路径保持一致,以避免媒体库无法访问的问题。

解决方案 1:使用 fstab 配置持久挂载

在 Linux 系统中,可以通过编辑 /etc/fstab 文件,让外部驱动器或网络存储在系统启动时自动挂载到固定的路径。这样可以避免路径变化,确保媒体库每次启动都能访问。

步骤

1.  找到设备的 UUID:
•   运行以下命令来查看设备的 UUID:

lsblk -f

•   或者使用以下命令列出设备及其 UUID:

blkid

2.  编辑 /etc/fstab 文件:
•   打开 /etc/fstab 文件进行编辑(需要 root 权限):

sudo nano /etc/fstab

•   添加一行来挂载设备。示例格式如下(假设 UUID 为 1234-5678,挂载路径为 /mnt/waifu-video):

UUID=1234-5678 /mnt/waifu-video ext4 defaults 0 2

•   确保将 UUID 替换为你的设备 UUID,并将文件系统类型(如 ext4、ntfs 等)替换为你的驱动器格式类型。/mnt/waifu-video 是自定义的挂载点,可以根据需要选择。

3.  创建挂载目录(如果还没有):

sudo mkdir -p /mnt/waifu-video

4.  测试挂载:
•   使用以下命令测试是否能正常挂载:

sudo mount -a

•   如果没有报错,说明挂载配置成功,设备会在每次系统启动时挂载到固定的路径。

解决方案 2:使用 udev 规则实现自动挂载到固定路径

如果设备是在启动后动态连接的(例如 USB 驱动器),可以通过 udev 规则来确保每次插入时挂载到相同路径。

步骤

1.  获取设备信息:
•   运行以下命令,找到设备的 ID、UUID 或其他唯一标识符:

udevadm info --name=/dev/sdX --query=all

•   将 /dev/sdX 替换为你的设备路径(可以用 lsblk 确认)。

2.  创建 udev 规则:
•   创建一个新的 udev 规则文件,例如 /etc/udev/rules.d/99-usb-mount.rules。
•   在规则文件中写入类似以下内容(将 UUID 替换为实际值):

SUBSYSTEM=="block", ENV{ID_FS_UUID}=="1234-5678", ACTION=="add", RUN+="/bin/mount /dev/disk/by-uuid/1234-5678 /mnt/waifu-video"

•   这条规则会在设备添加时自动将其挂载到 /mnt/waifu-video。

3.  重启 udev:

sudo udevadm control --reload-rules sudo udevadm trigger

解决方案 3:使用系统服务脚本(systemd)

如果需要在系统启动时挂载媒体库并保持路径不变,可以编写一个 systemd 服务脚本,确保挂载在系统启动时进行。

步骤

1.  编写挂载脚本:
•   创建脚本文件,例如 /usr/local/bin/mount-waifu-video.sh:

!/bin/bash

mount /dev/disk/by-uuid/1234-5678 /mnt/waifu-video

•   为脚本添加执行权限:

sudo chmod +x /usr/local/bin/mount-waifu-video.sh

2.  创建 systemd 服务文件:
•   创建服务文件,例如 /etc/systemd/system/mount-waifu-video.service:

[Unit] Description=Mount Waifu Video Drive After=network.target

[Service] ExecStart=/usr/local/bin/mount-waifu-video.sh RemainAfterExit=yes

[Install] WantedBy=multi-user.target

3.  启用服务:

sudo systemctl enable mount-waifu-video.service sudo systemctl start mount-waifu-video.service

这样,每次系统启动时,systemd 服务会确保设备挂载到指定的路径。

总结

使用 fstab、udev 规则、或者 systemd 服务都可以确保挂载路径在重启后保持一致,从而避免媒体库路径变化的问题。您可以根据设备的连接方式(启动时挂载或动态插入)选择适合的方案。

jcfun commented 2 weeks ago

上面的方法是物理硬盘的挂载方法,网络挂载的存储设备本身并没有物理uuid,所以没办法使用上面的办法。kde下挂载的网络设备好像是在开机后会重新挂载,并分配到一个随机字符串作为名称,所以没办法固定

MCDFsteve commented 2 weeks ago

播放器本身基本很难实现跟踪一个会更改路径和文件夹名字的文件夹。要不你看看这个 对于网络挂载存储设备(如 SMB、NFS 或 WebDAV),在 KDE 或 Linux 系统下可以通过以下几种方法来确保挂载到固定的路径,即使设备名在重启后会变动。这些方法不依赖物理硬盘的 UUID,而是通过其他手段使网络存储在系统重启后依然挂载到指定的路径。

  1. 使用 fstab 配置网络挂载到固定路径

尽管网络存储没有物理 UUID,但可以在 /etc/fstab 中通过网络地址和共享路径配置网络驱动器的持久挂载。此方法适用于 SMB、NFS、CIFS 等网络协议。

步骤

1.  编辑 /etc/fstab 文件:
•   打开 /etc/fstab 文件进行编辑:

sudo nano /etc/fstab

2.  添加网络存储挂载配置:
•   根据网络协议和网络存储的路径,在 fstab 文件中添加一行,例如:
•   对于 NFS 网络文件系统:

nfs_server:/path/to/share /mnt/waifu-video nfs defaults,_netdev 0 0

•   对于 SMB/CIFS 文件共享(如 Windows 共享):

//smb_server/share_name /mnt/waifu-video cifs username=your_username,password=your_password,_netdev 0 0

•   对于 WebDAV(如 Nextcloud 等):

https://webdav_server/remote.php/dav/files/username /mnt/waifu-video davfs rw,user,noauto,_netdev 0 0

其中: • nfs_server、smb_server、webdav_server 分别替换为网络存储的实际 IP 地址或主机名。 • /mnt/waifu-video 是挂载点路径,可以根据需要更改。 • _netdev 选项确保挂载延迟到网络服务启动后进行,适用于网络文件系统。

3.  创建挂载目录(如果尚未存在):

sudo mkdir -p /mnt/waifu-video

4.  自动挂载测试:
•   通过以下命令挂载所有文件系统,检查挂载是否成功:

sudo mount -a

此方法会在每次系统启动后自动挂载网络存储到指定路径。

  1. 使用 systemd 自动挂载网络共享

如果 fstab 方法不适用,或者挂载过程较慢,也可以使用 systemd 的自动挂载服务,这对不稳定的网络连接尤其有帮助。

步骤

1.  创建挂载目录:

sudo mkdir -p /mnt/waifu-video

2.  创建 systemd 挂载单元文件:
•   创建单元文件 /etc/systemd/system/mnt-waifu\x2dvideo.mount(注意,路径中的 / 替换为 -,而 - 替换为 \x2d):

[Unit] Description=Mount Waifu Video Network Share After=network-online.target Wants=network-online.target

[Mount] What=//smb_server/share_name # 替换为网络存储的地址 Where=/mnt/waifu-video # 挂载的固定路径 Type=cifs # 文件系统类型,根据需要更改 Options=username=your_username,password=your_password

[Install] WantedBy=multi-user.target

3.  启用和启动挂载服务:
•   启用并启动 systemd 挂载服务:

sudo systemctl enable mnt-waifu\x2dvideo.mount sudo systemctl start mnt-waifu\x2dvideo.mount

这样,每次系统启动后,systemd 会自动将网络存储挂载到指定的路径 /mnt/waifu-video。

  1. 使用 autofs 自动挂载网络存储

autofs 是一个动态挂载工具,可以在设备被访问时自动挂载网络驱动器,减少不必要的挂载时间。这对于不经常访问的网络驱动器非常有效。

步骤

1.  安装 autofs(如果未安装):

sudo apt install autofs

2.  编辑 auto.master 文件:
•   打开 /etc/auto.master 文件进行编辑,并添加挂载配置:

/- /etc/auto.nfs

3.  创建 auto.nfs 文件:
•   创建 /etc/auto.nfs 文件,并添加网络驱动器的挂载信息:

/mnt/waifu-video -fstype=cifs,username=your_username,password=your_password ://smb_server/share_name

4.  重启 autofs 服务:

sudo systemctl restart autofs

现在,每当您访问 /mnt/waifu-video 目录时,autofs 会自动挂载网络驱动器。几分钟不活动后,驱动器会自动卸载。

  1. 在应用程序中指定固定挂载点

如果您有权修改 NipaPlay 应用程序代码,可以将应用程序设置为直接访问特定的挂载路径(如 /mnt/waifu-video),而不是依赖 KDE 的文件管理器。确保应用程序在启动时检查并挂载该路径,或者通过 systemd 或 autofs 配置网络存储自动挂载,这样就不会受到 KDE 随机路径的影响。

总结

•   持久挂载:使用 fstab 或 systemd 进行自动挂载,将网络存储固定到路径 /mnt/waifu-video。
•   动态挂载:使用 autofs 配置按需挂载,减少不必要的挂载和占用。
•   修改应用程序:如果可以修改应用代码,直接访问固定挂载路径而不是依赖系统文件管理器路径。

以上方法可以帮助确保网络存储每次启动时挂载到一致的路径,避免路径变化导致的媒体库无法访问问题。

MCDFsteve commented 2 weeks ago

我后面研究一下通过内置选项直接通过挂载地址的方法挂载网络文件夹

jcfun commented 2 weeks ago

我后面研究一下通过内置选项直接通过挂载地址的方法挂载网络文件夹

好的,我通过上面的方法将媒体库挂载到本地,然后我发现播放视频时无法流式传输,播放器会直接把视频从远端完整缓存下来再播放,我想观看比较大的视频时会直接把我的cpu和2.5G网卡都占满,缓存时间要超过1分钟,同时系统也可能会卡死。所以直接将媒体库挂载到本地这种方式也不太可行,因此我觉得还是软件本身集成这些网络协议比较好,但是我没有音视频开发的经验,因此不太能帮得上忙。