Feat/dynamic frontend#8
Open
Ironboxplus wants to merge 89 commits into
Open
Conversation
|
如果跨多个组件,请使用主要组件作为前缀,并在标题中枚举、描述中说明。 如果是破坏性变更,请在类型后添加 |
3b720cc to
f0fc91a
Compare
66b9ff7 to
bc14381
Compare
bc14381 to
0bf12c5
Compare
…m#2471) * fix(driver): fix 189 & 189pc fastcopy form local storage * fix(driver): fix 189 & 189pc fastcopy form local storage * fix(driver): fix 189 & 189pc fastcopy form local storage
Optimize the 189pc driver to implement AccessToken login
02e4430 to
acad358
Compare
* add LinearMemory * replace mmap with LinearMemory * remove unused code * add GuardedMemory; add `min_free_memoryMB` conf * add HybridCache and StreamBuffer * log * rename SizedReadWriterAt to Section * 重构 FileStream,改用 HybridCache * 重构 HybridCache,更新方法名并添加回滚功能;优化请求和流处理逻辑 * 重构 StreamSectionReader 接口,使用HybridCache * 在 NewGuardedMemory 函数中添加了对 LinearMemory 的最终化处理,以确保内存释放 * . * 优化检查逻辑 * 重命名 * 改进、重命名 * 修复 * 添加测试 * 移除HybridCacheReader并引入DynamicReadAtSeeker * 重构缓存读取逻辑,简化代码并引入ReadFromN方法 * 优化缓存配置注释并修复下载器部分大小限制逻辑 * 优化中断逻辑 * 优化下载器代码 * 修复bug * HybridCache添加多文件缓存模式 * 优化下载器并发,添加测试 * 修复bug * 重命名+注释 * . * fix(net): always cleanup downloader on interrupt * fix(net): guard chunk enqueue with context cancel * fix(net): update interrupt logic and add download interrupt test * fix(test): update concurrency limit in high concurrency test * refactor(buffer): simplify ReadAt logic * refactor(config): update memory configuration logic * . --------- Co-authored-by: Suyunmeng <Susus0175@proton.me>
acad358 to
7995dbd
Compare
…#2478) fix(139): remove RFC8441-incompatible Connection header Agent-Logs-Url: https://github.com/OpenListTeam/OpenList/sessions/1c6b226d-02c4-4b43-80ad-5ab2861d30c3 Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jyxjjj <16695261+jyxjjj@users.noreply.github.com>
* refactor(HybridCache)!: extract hybrid_cache package and rename cache_threshold to auto_memory_limit * split HybridCache and stores into internal/hybrid_cache package * introduce BackingStore abstraction with BufferStore and FileStore * rename CacheThreshold to AutoMemoryLimit in config/env/bootstrap * update stream/request integration and related tests * rename singleFileCache and MultiFileCache to singleFileStore and MultiFileStore * refactor(HybridCache): improve memory management strategies in NewHybridCache * rename * alias hybrid_cache to hcache * omments
…returning HTTP 204 No Content on successful authentication (OpenListTeam#2476)
3c908da to
d569888
Compare
* Squashed commit of the following: commit f029df8 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 14:00:36 2025 +0800 Add Terms of Use and Privacy Policy links to READMEs Added links to the Terms of Use and Privacy Policy in the English, Chinese, Japanese, and Dutch README files to provide users with easy access to legal information. commit 00f825d Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:53:29 2025 +0800 Update documentation links in README files Replaced plain documentation URLs with labeled links and icons in English, Chinese, Japanese, and Dutch README files for improved clarity and user experience. commit 732dcfa Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:40:52 2025 +0800 fix format commit e2ad8ea Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:38:28 2025 +0800 Revert "test large name" This reverts commit affedc8. commit affedc8 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:37:43 2025 +0800 test large name commit 382cd64 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:34:42 2025 +0800 Add Dutch README and update language links Added a new Dutch translation (README_nl.md) and updated language navigation links in the English, Chinese, and Japanese README files to include Dutch. commit e880acb Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:29:51 2025 +0800 Add AGPL-3.0 license links to README files Updated the English, Chinese, and Japanese README files to include direct links to the AGPL-3.0 license text and the LICENSE file for clarity and easier access. commit a0d1ead Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:25:52 2025 +0800 Move language and links sections below logo in READMEs Repositioned the language selection and related links sections to appear after the logo and separator in README.md, README_cn.md, and README_ja.md for improved layout consistency. commit 70a0a32 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 13:23:36 2025 +0800 Revise and unify README files across languages Updated README.md, README_cn.md, and README_ja.md to improve structure, add navigation links, clarify project purpose, and unify feature lists. Enhanced formatting, added acknowledgments to original authors, and improved legal/disclaimer sections for consistency across English, Chinese, and Japanese documentation. commit 2f32120 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:56:26 2025 +0800 Update Go Report Card badge URL in README Changed the Go Report Card badge to reference v3 instead of v4. This ensures the badge displays the correct status for the intended version. commit 0fdfa2b Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:53:43 2025 +0800 Update README.md commit 8271361 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:53:22 2025 +0800 Update Go Report Card badge URL in README Changed the Go Report Card badge link to remove the '/v3' suffix, ensuring it points to the correct repository path. commit 41acb3e Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:52:46 2025 +0800 Update project description in README Revised the introductory paragraph to emphasize OpenList's resilience and community-driven nature as a fork of AList, highlighting its commitment to defending open source against trust-based attacks. commit 77aca66 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:50:45 2025 +0800 Update README.md commit 63a597f Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:49:57 2025 +0800 Improve README badge formatting and alignment Reformatted the badge section in the README for better readability and visual alignment. Updated the div to use 'align="center"' and placed each badge on its own line with proper indentation. commit fcf7530 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:46:38 2025 +0800 Update logo size and remove migration note in README Set explicit width and height for the logo image and removed the note about migration progress, reflecting project updates. commit 5f0645d Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:45:04 2025 +0800 Revert README header to HTML Replaces markdown-based center alignment and badge/image syntax with HTML tags for better visual formatting and consistency in the README header. commit 0f7ba95 Author: jyxjjj <773933146@qq.com> Date: Tue Jul 1 12:42:59 2025 +0800 Revise README formatting and update project info Refactored the README to use markdown badge/link syntax, improved formatting, and clarified the disclaimer section. Updated Docker Deploy status, added a Contact Us section, and reordered the Contributors section for better project transparency and communication. * chore(readme): fix sites * chore(readme): fix sites
…stTeam#2507) 优化 PR 模板结构和检查项 增加 PR 中 AI 辅助披露说明和工具范围 在 Issue 模板中增加 AI 辅助内容字段 补充贡献指南中的社区政策和 AI 披露要求 将 Go 版本要求改为以 go.mod 声明为准 修正文档链接和行为准则格式细节
…tTeam#2452) Add end-to-end offline download support for torrent files, magnet links, and ed2k links, including torrent parse and generate APIs, CAS-based rapid upload for Cloud189, and protocol-aware tool routing with transfer flow improvements. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: j2rong4cn <36783515+j2rong4cn@users.noreply.github.com> Co-authored-by: j2rong4cn <j2rong@qq.com> Co-authored-by: Suyunjing <suyunmeng@oplist.org.cn>
- Fix OpenListTeam#2343: update 115driver to v1.3.3 to handle float size values - Fix OpenListTeam#2349, OpenListTeam#2356, OpenListTeam#2502: use base.UserAgent as fallback when User-Agent header is empty The 115 CDN returns 403 "no cookie value" when the User-Agent header is empty or doesn't match the cookie. This fix ensures a consistent browser User-Agent is used for download link generation.
d569888 to
4525637
Compare
added 20 commits
June 21, 2026 01:23
…iter hash truncation
Three bugs fixed:
1. Upload callback was never validated — when 115 returned {"state":false},
the error was silently ignored. Added oss.CallbackResult capture and
checkUploadCallback() validation.
2. CacheFullAndWriter for known-size files > MaxBufferLimit only cached the
first ~48MB (via cache() truncation), producing a partial SHA1 hash.
115 then rejected the upload with code=10002 "校验文件失败". Fix: when
file size exceeds MaxBufferLimit, write to a temp file instead of the
in-memory peekBuff. This fixes all drivers using CacheFullAndHash with
large non-seekable streams (115, google_drive, aliyundrive, etc).
3. Frontend fetcher blocked startup on China servers where GitHub is
unreachable. Removed blocking download, use embedded dist immediately
and let Watcher fetch rolling release in background.
Overlap source-side I/O with hash/upload compute in both passes of an upload: - Pass 1 (hash): streamHashSeekableWithPrefetch keeps a background goroutine fetching the next ~10MB chunk via ReadFullWithRangeRead while the current chunk feeds the hash. Identical hash output, only the timing changes from `Tr + Th` per chunk to `max(Tr, Th)`. - Pass 2 (upload): hybridSectionReader.GetSectionReader schedules a background prefetch of the next block while the caller uploads the current one. takePrefetched / waitPrefetch handle hits, misses, DiscardSection, and clean shutdown via file.Add(closerFunc(...)). Effect: drivers that loop sequentially without their own Before/Do split (115_open with oss.Sequential(), baidu_netdisk, aliyundrive_open, etc.) see throughput close to single-side bandwidth instead of the sum of read+write latencies.
Removed preCreateDirTreeFn and its method wrapper. Directory creation
is no longer batched up-front via a one-level BFS walk; instead it
happens on demand:
- top-level dst MakeDir still runs once at line 198 (early failure
detection, active dir creation)
- sub-task RunWithNextTaskCallback creates each subdir as it
recurses into it
- op.Put internally calls MakeDir(parent) before uploading
- op.MakeDir walks the parent chain so deep trees work without
pre-creation, and our cache-sync retry handles cloud-storage
eventual consistency
The merge-mode existedObjs logic (the only invariant the BFS
precreate quietly protected, alongside OpenListTeam#1898's ObjectNotFound
tolerance) is extracted into a pure, injectable function:
existingDstFilesFn(ctx, listDst, dstPath) (map[string]bool, error)
12 unit tests pin down its contract: empty dst, mixed files/dirs,
raw and wrapped ObjectNotFound (regression for OpenListTeam#1898), other List
errors, ctx cancellation before/during iteration, duplicates,
large dst, single-call sanity. The old 11 TestPreCreateDirTreeFn_*
tests are removed with the code.
…te removal JOURNAL.md: new entry covering the three coordinated changes (commits fccab33 → 7995dbd → 6b3ce57) — rebase onto upstream HybridCache, Pass 2 prefetch on hybridSectionReader, and BFS precreate deletion. CLAUDE.md: replace the now-obsolete "MaxBufferLimit truncation pitfall" section with the current HybridCache story; add new sections for the hybridSectionReader prefetch and the merge-task ObjectNotFound tolerance contract (incl. the existingDstFilesFn extraction).
The merge skip rule at copy_move.go:221 has two halves whose
combination is load-bearing:
1. existingDstFilesFn must only include FILES (not dirs) from dst
2. the call-site guard `!obj.IsDir() && existedObjs[name]` must
keep the !obj.IsDir() clause
If either half drifts (e.g. dirs leak into existedObjs, or the
IsDir guard is removed), src subdirectories matching dst dirs of
the same name would be silently skipped — every file inside them
would never get copied. That bug is invisible to "did the task
complete?" checks; only shows up as quietly missing deep files.
New tests:
- TestMergeSkipDecision_DirsAreNeverSkipped: 7-case matrix
covering every src kind × dst state combo, including the
cross-type name collisions (src dir / dst file and vice versa)
- TestMergeSkipDecision_EmptyDst: nothing skipped against empty dst
- TestMergeSkipDecision_DeepTreeRecursionContract: 3-level src
tree against partial dst, asserts correct skip/spawn at each
level — the canonical "deep files missing" regression guard
115 CDN signed URLs carry a Unix-timestamp `t=...` query parameter that marks when the URL stops accepting requests — typically just a few minutes, well below OpenList's default link-cache TTL (30 min). When the cache outlives the URL, OP serves a stale URL and 115 responds with HTTP 200 + Content-Length: 0, which clients (mpv, ffmpeg, …) see as a corrupt or empty stream. Since 115's link cache is keyed per User-Agent (`LinkCacheMode: LinkCacheUA`), the failure is sticky and per-UA: the "libmpv" entry stays poisoned while other UAs keep working through the webpage, masking the bug as "only mpv fails". Parse the `t=` parameter and set `model.Link.Expiration` so OP refreshes the link before the CDN actually rejects. A 60-second safety margin covers clock skew and in-flight requests; any timestamp at-or-near expiry clamps to a 1-second minimum so the cache entry evicts on next lookup instead of being held indefinitely. 10 unit tests pin the helper contract (future / past / about-to-expire / missing / malformed / empty / negative / invalid-URL / real-world / safety-margin).
When a 115 CDN signed URL expires, the server answers any request with
HTTP 200 + Content-Length: 0 (a "soft success") rather than 4xx. The
existing selfHealingReadCloser catches this AFTER body read returns
(0, io.EOF) and triggers a refresh, but only when a Refresher is set
and ServeHTTP has already written response headers — the client gets
HTTP 206 + Content-Length: ${expected} headers immediately followed by
zero bytes, breaking range-aware clients that pre-allocate buffers.
Move the detection up to the request level: when the closure in
GetRangeReaderFromLink asks for ≥1 byte but the response promises 0,
return an "expired" error before ever exposing the empty body. The
RefreshableRangeReader path now refreshes one step earlier, and callers
without a Refresher fail loudly instead of streaming silence.
ContentLength == -1 (chunked transfer) is excluded so legitimately
chunked responses are not flagged.
4 tests cover:
- soft-expired + Refresher → refresh fires once, fresh body delivered
- soft-expired + no Refresher → IsLinkExpiredError-classified error
- healthy 206 → no false positive
- chunked transfer → no false positive
The libmpv "Failed to recognize file format" symptom came from one
underlying mistake: 115's GetFolderInfoByPath endpoint (yuque
rl8zrhe2nag21dfw, "Get folder details") is folder-oriented. Its struct
carries Count / FolderCount / PlayLong and the Size field is
byte-accurate only for directories; for FILE paths Size is empty or
"0". driver.Get nevertheless called it for every path. The resulting
Obj had FS = 0, op.Get returned it to ServeHTTP, and the empty-file +
Range branch in internal/net/serve.go answered with 200 OK +
Content-Length: 0. mpv couldn't recognize the empty stream.
Webpage playback masked the bug because op.List warmed dirCache with
GetFilesResp_File entries (FS arrives as int64 there and is always
correct). mpv direct access skipped op.List, hit driver.Get cold, and
broke.
Fix:
- Introduce fromFolderInfo gateway used by driver.Get:
* folder → return Obj from folderInfoToObj (fast path, single API call)
* file → return errs.NotImplement so op.Get falls through to its
list-based path, which pulls FS out of
GetFilesResp_File.FS (int64, reliable)
- folderInfoToObj extracts only the fields the gateway actually uses
(FileID, FileName, FileCategory, Sha1, PickCode). Size is not parsed —
files are rejected before any caller would read FS.
- log.Debugf in driver.Get prints the raw resp.Size / FileCategory so
future diagnoses don't need to theorize.
Trade-off: cold-cache file access costs 3 WaitLimit-gated SDK calls
(wasted GetFolderInfoByPath on the file + GetFolderInfoByPath on the
parent for its FileID + GetFiles to list the parent) plus the eventual
DownURL = 4 calls. With default limit_rate=1 req/s that's ~3s of pure
rate-limit wait. Steady-state access within dirCache TTL (5 min)
collapses back to a single DownURL. Bumping limit_rate to 5–10 in the
storage config keeps the worst case under 1s.
Verified in production with curl + libmpv UA + Range: bytes=0-1023 →
206 Partial Content / Content-Length: 1024 / Content-Range bytes
0-1023/36767958354 / Last-Modified populated (proving the Obj came
from the List path, not the bogus folderInfoToObj of an earlier
attempt).
5 unit tests pin the contract: folder fast path, file/folder gateway
behavior, and an existing TestGetReturnsObjForExistingFolder updated
to set file_category="0" so it actually exercises the folder branch.
… names Two changes that go together because the second was useless without the first. Push to feat/dynamic-frontend (the active branch) was not in the trigger list, so commits like Fix 3 b80688c never produced a fresh :front-rolling image -- the user kept pulling stale binaries and the mpv "Failed to recognize file format" symptom appeared unfixed when in fact CI had simply not run. - Replace push:main + pull_request:copy triggers with push:feat/dynamic-frontend so every commit on the active branch rebuilds the four docker variants. - Drop the shared IMAGE_NAME env and give each matrix row its own image_name: openlist, openlist-ffmpeg, openlist-aria2, openlist-aio. Tags collapse from openlist:front-rolling-{variant} to {image_name}:front-rolling, so the pull path matches the image intent (ghcr.io/.../openlist-aio:front-rolling, etc.). - :latest now applies to each image when its frontend_channel is "latest", rather than only openlist:latest. - Build cache key reuses the per-variant image_name so caches don't collide across variants.
Required by movi-player's FFmpeg WASM which uses SharedArrayBuffer for multi-threaded decoding. Without these headers, browsers block SharedArrayBuffer and the player fails to initialize.
The dynamic frontend cache in the data volume was overriding newer embedded dist from Docker images. On networks where GitHub API is unreachable, the stale cache persisted indefinitely. Now initStatic() always starts with the embedded dist. The watcher still runs in the background and hot-swaps to a newer version from GitHub when available. Also default FrontendRepo to Ironboxplus fork.
… key - All workflows now default to Ironboxplus/OpenList-Frontend instead of upstream, so builds embed the correct frontend without needing vars. - build.sh default also updated. - test_docker.yml: rolling cache key now includes the release asset name so cache is busted when a new rolling release is published.
Move JOURNAL.md, OVERVIEW.md, COMPATIBILITY_REPORT.md to parent E:\Go\Openlist\. Update CLAUDE.md to workspace-wide aggregated version covering backend, frontend, and movi-player.
Pulls in two auth fixes: - token refresh detached from caller context (WithoutCancel + 30s timeout) so a canceled streaming request can no longer kill an in-flight refresh and lose the rotated one-time refresh_token - 40140117 (refresh frequently) and 40140120 (refresh token error) no longer misclassified as stale-access-token errors that trigger another refresh attempt
The rebase merged upstream OpenListTeam#2596 (sdk.ErrObjectNotFound mapping) with our ErrDataEmpty handling into a union inside driver.Get. Extract it into a unit-testable helper so both not-found sentinels are covered directly: ErrObjectNotFound is shadowed by ErrDataEmpty for GetFolderInfoByPath (request.go collapses an empty/[] payload before folder-info unmarshal), so it is unreachable via an HTTP mock and an inline test could not exercise it. - isObjectNotFound(err): ErrObjectNotFound || ErrDataEmpty, both errors.Is-safe - TestIsObjectNotFound: both sentinels, wrapped forms, unrelated error, nil
aba56c7 to
98707ee
Compare
added 9 commits
June 21, 2026 23:24
…ding progress Backend plugin system: swap wazero/WASM runtime for an in-process yaegi (Go-source) interpreter so admins can author plugins in plain Go. - internal/plugin: interp.go (Runtime: Load/Unload/hot-reload, curated host symbols), registry.go (hook event bus), hooks.go (Hook* constants + SettingGetter/Setter injection), manager.go (file watcher), manage.go (user-plugin CRUD + enable/disable) - bootstrap/plugin.go bridges op StorageHook/ObjsUpdateHook into the registry and wires setting capabilities (no op import cycle) - fire HookFsListAfter / HookFsLinkAfter / HookUserLoginAfter from handles - admin API: /admin/plugin list/get/save/delete/enable Header: FsListResp.mount_details (cache + singleflight backed, 429-safe, guest/HideStorageDetails gated) powers a dynamic disk-usage widget. Also: favorites (db/model/handles), storage loading progress (op/loading), 115_open video play, doc restructure (INDEX/OVERVIEW + docs/*). Tests: internal/plugin, server/handles, internal/op, internal/model green.
Brings the VideoPlayResp fix: 115's /open/video/play returns file_size/duration/width/height as quoted strings; FlexInt64 now tolerates both string and number, fixing "cannot unmarshal string into Go struct field VideoPlayResp.file_size of type int64".
Cryptographically-authenticated, real-time storage-config sync between nodes using a distributed CRDT. Disabled by default; fully inert without config. - crypto: PSK->HKDF->AES-256-GCM AEAD envelope (membership auth + confidentiality for the secrets in storage configs), ed25519 per-node identity, node id == hash(pubkey) so records are self-authenticating and origin can't be forged. - state: per-mount LWW-CRDT keyed by content hash (idempotent: identical config => no churn, 'peers seeing the same token don't change'), Lamport versioning, signed records, tombstones. - config: file-backed (enable/key/peers/share filters/intervals/apply_remote/ share_deletes), admin API + status. - transport: sealed envelope, timestamp+nonce replay protection. - engine: push on healthy token refresh (health-gated, never propagates broken tokens), pull on token-invalid, periodic anti-entropy announce backstop; applies peer configs via op create/update/delete (loop-safe via content hash). - op: fire storage hook on saveDriverStorage (token-refresh path) + add NotifyStorageTokenInvalid signal. - wiring: bootstrap Init/Start + /api/cluster/sync peer endpoint and /admin/cluster config/status routes.
Replaces the stateless HTTP request/reply sync link with a stateful, persistent WebSocket so nodes behind NAT can participate: a NAT'd node dials OUT to its configured reachable peers and keeps the link open (it cannot be dialed itself), while a reachable node accepts inbound links at /api/cluster/ws and RELAYS newly-applied records between everyone it is connected to — so two NAT'd nodes converge through a common reachable peer. Same sealed AEAD envelope per frame (PSK auth + confidentiality), so crypto/CRDT layers are unchanged. Adds a dial supervisor (auto-reconnect/backoff), ping keepalive to hold NAT mappings, and relay-on-change so propagation terminates. Drops the old POST /cluster/sync in favour of GET /cluster/ws.
…registry Covers AEAD seal/open round-trip + wrong-key/tampered-aad rejection, ed25519 identity binding (node id == hash(pubkey)) and record self-authentication, LWW merge + content-hash idempotency + tombstones, envelope replay/stale rejection, config active/share-filter gating, and wsURL/conn registry.
…auto-discovery Redesign the cluster plugin around three user requirements: - Sync ONLY credentials. Instead of replicating whole storage configs, extract just the credential fields (token/cookie/secret/refresh/access/...) from a driver's Addition by name heuristic and overlay them onto peers, preserving every node-local field (mount path, root folder, cache, order, proxy). New creds.go isolates extraction/apply/hash; only changed fields are written, so identical credentials cause no churn or re-init. - Manual multipartite sync groups. A group links storages across nodes that share one account; the group set is cluster-shared (LWW doc, signed). Creds flow per-group, idempotent by cred-hash, health-gated (never push a broken token; pull from peers on token-invalid/non-WORK). - Auto-discovery. Any node that can open our AEAD envelope is admitted; public nodes advertise an addr and peers learn+dial the rest via inventory exchange (PEX). Manual peer lists are gone; an optional seed only bootstraps the first join. Node inventory (per-node storages) is gossiped to power the UI. state.go now holds groups + credential records + inventory CRDTs; status.go exposes a redaction-safe overview (nodes/liveness, per-group sync state, live connections, activity log, rollup stats) for the admin UI. Config drops the driver/mount filters and peers list in favour of key/label/addr/seeds. New POST /admin/cluster/groups endpoint. Unit tests cover credential extraction/overlay/idempotency, group + cred LWW, forgery rejection and inventory merge.
115 online-play returns HLS on 115's CDN; the browser fetching it directly fails CORS. Add /video_proxy: a signed (sign.Sign over the upstream URL, no open-relay) endpoint that streams an upstream media URL through OpenList, rewriting inner segment/key/sub-playlist URIs in HLS manifests so they also route back through the proxy. FsVideoPlay now wraps every transcoded source URL through it. Unit tests cover URL build/verify, m3u8 rewrite, isM3U8.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description / 描述
Motivation and Context / 背景
Closes #XXXX
Relates to #XXXX
How Has This Been Tested? / 测试
Checklist / 检查清单
我已阅读 CONTRIBUTING 文档。
go fmtor prettier.我已使用
go fmt或 prettier 格式化提交的代码。我已为此 PR 添加了适当的标签(如无权限或需要的标签不存在,请在描述中说明,管理员将后续处理)。
我已在适当情况下使用"Request review"功能请求相关代码作者进行审查。
我已相应更新了相关仓库(若适用)。