Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通用 CSS Selector 数据源无法正确处理相对路径 #1117

Open
imlonghao opened this issue Oct 28, 2024 · 8 comments
Open

通用 CSS Selector 数据源无法正确处理相对路径 #1117

imlonghao opened this issue Oct 28, 2024 · 8 comments
Labels
M 重要优先级 s: media 子系统: 数据源基础
Milestone

Comments

@imlonghao
Copy link

问题描述

我有一个本地的资源库,通过「通用 CSS Selector 数据源」添加了一个自定义的数据源,后端分别尝试了 Caddy 的 file_server 以及 Python 的 http.server ,均因为相对路径的问题无法正常使用

复现步骤

  1. 有一个本地的资源库,文件结构如下
.
├── 结缘甘神神社 (2024) [tmdbid=234910]
│   ├── 结缘甘神神社 S01E01.mkv
│   ├── 结缘甘神神社 S01E02.mkv
│   ├── 结缘甘神神社 S01E03.mkv
│   └── 结缘甘神神社 S01E04.mkv
└── 青之箱 (2024) [tmdbid=207347]
    ├── 青之箱 S01E01.mp4
    ├── 青之箱 S01E02.mp4
    ├── 青之箱 S01E03.mp4
    ├── 青之箱 S01E04.mp4
    └── 青之箱 S01E05.mp4
  1. python -m http.server 起一个 http server
  2. 如下图进行软件的数据源配置


  1. 最后软件得到的路径是

http://192.168.2.1:8000/%E7%BB%93%E7%BC%98%E7%94%98%E7%A5%9E%E7%A5%9E%E7%A4%BE%20S01E01.mkv

而实际可播放的路径是

http://192.168.2.1:8000/%E7%BB%93%E7%BC%98%E7%94%98%E7%A5%9E%E7%A5%9E%E7%A4%BE%20%282024%29%20%5Btmdbid%3D234910%5D/%E7%BB%93%E7%BC%98%E7%94%98%E7%A5%9E%E7%A5%9E%E7%A4%BE%20S01E01.mkv


上面只描述了 搜索剧集->最终链接 的路径处理问题,在 搜索链接->搜索条目 这一步中的路径处理也是不对的。

Ani 版本号

3.12.0

操作系统

macOS (M 系列芯片)

应用日志

No response

@imlonghao imlonghao added N 一般优先级 t: bug 类型: bug labels Oct 28, 2024
@Him188
Copy link
Member

Him188 commented Oct 28, 2024

发一下网页源码(浏览器f12)

@imlonghao
Copy link
Author

我看了一下目前自带数据源订阅中的 css1.json 数据,里面所含站点的搜索页面都不是相对路径的链接,所以没有这个问题。

然后简单看了一下代码试图帮忙找到问题点,给我的感觉就是 baseUrl 的设计问题,修起来比较复杂(对我而言)

目前项目的设计看起来是先从输入的「搜索链接」中把协议、主机和端口部分出来当做 baseUrl,然后把在步骤 1、2 中拿到的 href 和 baseUrl 拼起来。但这样是不对的。

例如当前页面是 https://example.com/video/,页面里的 href 是 ./aaabbb/,这两个 join 起来应该是 https://example.com/video/aaabbb/ 而不是 https://example.com/aaabbb/

我提议把 baseUrl 这个输入框去掉(因为我想不到这有什么用),然后将这部分代码

fun computeAbsoluteUrl(baseUrl: String, relativeUrl: String): String {
@Suppress("NAME_SHADOWING")
var baseUrl = baseUrl
if (baseUrl.endsWith('/')) {
baseUrl = baseUrl.dropLast(1)
}
return when {
relativeUrl.startsWith("http") -> relativeUrl
relativeUrl.startsWith('/') -> baseUrl + relativeUrl
else -> "$baseUrl/$relativeUrl"
}
}

替换成

import java.net.URI

fun computeAbsoluteUrl(baseUrl: String, relativeUrl: String): String {
    return URI(baseUrl).resolve(relativeUrl).toString()
}

( testcase in https://pl.kotl.in/vXwuLnxuR )

然后现有需要进行 computeAbsoluteUrl 的地方,以当前页面的 window.location.href 作为 baseUrl, document a 标签中的 href 作为 relativeUrl 进行 join 就好了,理论上不会影响到现有的其他逻辑。

@Him188
Copy link
Member

Him188 commented Oct 29, 2024

我们需要一个 multiplatform 的解决方案, java URI 只支持 JVM 平台. 但应该就是去把对应逻辑抄过来就行了

@Him188 Him188 added M 重要优先级 s: media 子系统: 数据源基础 and removed N 一般优先级 labels Oct 29, 2024
@imlonghao
Copy link
Author

不用 java.net.URI 的话那就用 io.ktor.http 把,大概也是能用的

import io.ktor.http.*
 
fun main() {
    val u = Url("https://example.com/path1/path2/index.html)
    println(URLBuilder(
        protocol = u.protocol,
        host = u.host,
        port = u.port,
        pathSegments = u.rawSegments,
    ).takeFrom("another-page.html").toString())
}

@Him188
Copy link
Member

Him188 commented Oct 31, 2024

baseUrl 是有用的,不能删

@Him188 Him188 removed the t: bug 类型: bug label Nov 4, 2024
@Him188
Copy link
Member

Him188 commented Nov 15, 2024

问题实际上是应该采用条目页面的链接作为 base url, 而不是基于搜索.

computeAbsoluteUrl 问题不大.

@Him188
Copy link
Member

Him188 commented Nov 15, 2024

这会是一个重大 breaking change, 考虑兼容性, 可能不是很好改

Him188 added a commit that referenced this issue Nov 15, 2024
@Him188 Him188 added this to the 4.1.0 milestone Nov 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
M 重要优先级 s: media 子系统: 数据源基础
Projects
None yet
Development

No branches or pull requests

2 participants