* fix(seed): keep CAS hash matrix for 189 rapid upload CAS seeds only carry MD5 + slice MD5s, but the quick-save path rebuilt the rapid-upload request through a torrent container, which requires SHA-1 piece hashes. Every 189 秒传 therefore failed before any request was sent and reported 'target driver cannot reuse the available hashes'. - build the rapid-upload request directly from the seed file, keeping the whole MD5, slice MD5s, the drive's slice size and the legacy slice digest - let 189pc run initMultiUpload/checkTransSecond/commitMultiUploadFile when slice hashes are available, falling back to the legacy whole-MD5 upload - surface the real rapid-upload error instead of the generic message * fix(189pc): surface daily flow limit instead of generic rapid-upload error The CAS path now reaches 189's upload API, and the first real rejection is UserDayFlowOverLimited (account daily upload flow exhausted). Treat it as a terminal account state instead of retrying: - add errs.DailyFlowLimitExceeded and map UserDayFlowOverLimited / 'flow is out' onto it (189 returns it as a business code inside HTTP 200) - skip the legacy whole-MD5 fallback once the account is limited - report 'rapid upload failed: ...' with the real reason and mark the rest of the batch unavailable instead of one request per file * fix(seed): refuse to generate a seed from a seed container Generating a .cas seed from a .cas file produced an artifact with exactly the same name in the same folder, so PutDirectly overwrote the original seed with a seed-of-seed: the payload then described the few-hundred-byte metadata file instead of the video. Rapid upload of that seed 'succeeds' and only creates another .cas, which looks like CAS 秒传 doing nothing. - skip .oss/.torrent/.cas/.cas.torrent when expanding a directory - reject an explicit selection of a seed container with an actionable message - refuse to write an artifact over one of its own source files * refactor(cas): derive slice size from file size and store the final digest CAS 判重只比较最终分片摘要(逐片 MD5 汇总后再取 MD5),而切法由文件大小固定:10MiB / 20MiB / 更大文件按 1999 片上限向上取 10MiB 的整数倍。之前把 sliceMd5 当成「可变分片的哈希」、总是从逐片列表现算,切法一变就对不上云端。 - add torrent.CASSliceSize / CASPartCount / CASUniformSliceSize as the single source of truth; 189pc.partSize delegates to it - .cas writes the final digest in sliceMd5 and the per-slice list in partsMd5; slice_md5s stays readable for old files - rapid upload prefers the explicit sliceMd5 and only derives it from parts when absent - generation, recalculate and inline conversion hash CAS files at CASSliceSize per file and drop parts that do not match that slicing - piece_size no longer influences CAS hashing * fix(seed): refuse to rapid-upload a seed that describes itself A .cas generated from another .cas documents the metadata file itself (name ends with .cas, a few hundred bytes). Rapid-uploading it just creates another same-named .cas in the target folder, which looks like CAS 秒传 doing nothing. Reject that case with an actionable message instead. * test(seed): lock the rapid-upload name and the seed-of-seed guard - extract seedRapidUploadBlocker so the guard is testable - add an end-to-end test proving a legacy 5-field .cas resolves to the video name, size, slice size and final slice MD5 - add a test that seed containers are refused for rapid upload * refactor(seed): output seed and torrent messages in English Turn the error strings, task statuses and progress labels of the transfer-seed / torrent feature into English, including the 189 CAS rapid-upload path and the front-end facing guards. Comments and unrelated log lines are untouched. * refactor(cas): make the CAS slice rule a verbatim port of the 189 upload rule CAS slice size must be exactly what 189 uses when uploading, otherwise the sliceMd5 submitted for rapid upload can never match the digest the drive stored. - CASSliceSize now copies 189pc partSize expression by expression (same DEFAULT constant, same float expression, same 5x lower bound) - expectedCASPartCount mirrors fastUpload's count: one slice when size <= sliceSize, otherwise ceil(size/sliceSize) - add cross-package tests comparing CASSliceSize/CASPartCount against a verbatim copy of the 189 rule, and partSize against CASSliceSize * fix(seed): address CAS sidecar and digest review findings P1 FsStream hashed uploads with seedPieceSize() while the sidecar declared the CAS slice size; unknown-size CAS uploads now fail before writing the file instead of after. P1 buildCASFileEntry only compared piece counts, so 8MiB slices could be reused as 10MiB CAS slices; it now requires the slicing to match. P2 multi-slice payloads without sliceMd5 are rejected instead of falling back to the whole-file MD5, and oversized CAS slice sizes are clamped for the seed container only. --------- Co-authored-by: pikachuren <pikachuren@example.com>
OpenList is a resilient, long-term governance, community-driven fork of AList — built to defend open source against trust-based attacks.
Disclaimer
OpenList is an open-source project independently maintained by the OpenList Team, following the AGPL-3.0 license and committed to maintaining complete code openness and modification transparency.
We have noticed the emergence of some third-party projects in the community with names similar to this project, such as OpenListApp/OpenListApp, as well as some paid proprietary software using the same or similar naming. To avoid user confusion, we hereby declare:
-
OpenList has no official association with any third-party derivative projects.
-
All software, code, and services of this project are maintained by the OpenList Team and are freely available on GitHub.
-
Project documentation and API services primarily rely on charitable resources provided by Cloudflare. There are currently no paid plans or commercial deployments, and the use of existing features does not involve any costs.
We respect the community's rights to free use and derivative development, but we also strongly urge downstream projects:
-
Should not use the "OpenList" name for impersonation promotion or commercial gain;
-
Must not distribute OpenList-based code in a closed-source manner or violate AGPL license terms.
To better maintain healthy ecosystem development, we recommend:
-
Clearly indicate the project source and choose appropriate open-source licenses in accordance with the open-source spirit;
-
If involving commercial use, please avoid using "OpenList" or any confusing naming as the project name;
-
If you need to use materials located under OpenListTeam/Logo, you may modify and use them under compliance with the agreement.
Thank you for your support and understanding of the OpenList project.
Features
- Multiple storages
- Local storage
- Aliyundrive
- OneDrive / Sharepoint (Global, CN, DE, US)
- 189cloud (Personal, Family)
- GoogleDrive
- 123pan
- FTP / SFTP
- PikPak
- S3
- Seafile
- UPYUN Storage Service
- WebDAV
- Teambition(China, International)
- MediaFire
- Mediatrack
- ProtonDrive
- 139yun (Personal, Family, Group, Share)
- YandexDisk
- BaiduNetdisk
- Terabox
- UC
- Quark
- Thunder
- Lanzou
- ILanzou
- Google photo
- Mega.nz
- Baidu photo
- SMB
- 115
- Cloudreve
- Dropbox
- FeijiPan
- dogecloud
- Azure Blob Storage
- Chaoxing
- CNB
- Degoo
- Doubao
- Febbox
- GitHub
- OpenList
- Teldrive
- Weiyun
- DingTalk Docs
- Easy to deploy and out-of-the-box
- File preview (PDF, markdown, code, plain text, ...)
- Image preview in gallery mode
- Video and audio preview, support lyrics and subtitles
- Office documents preview (docx, pptx, xlsx, ...)
README.mdpreview rendering- File permalink copy and direct file download
- Dark mode
- I18n
- Protected routes (password protection and authentication)
- WebDAV
- Docker Deploy
- Cloudflare Workers proxy
- File/Folder package download
- Web upload(Can allow visitors to upload), delete, mkdir, rename, move and copy
- Offline download
- Copy files between two storage
- Multi-thread downloading acceleration for single-thread download/stream
Document
- 📘 Docs
- 🌏 CN Mirror
- ⚖️ Terms of Use
- 🔒 Privacy Policy
Demo
- 🌎 Global Demo
- 🇨🇳 CN Demo
Discussion
Please refer to Discussions for raising general questions, Issues is for bug reports and feature requests only.
Sponsor
Donors
Thanks to the following donors for their generous support:
- HisAtri
- 爱发电用户_7jTh
- suka
License
The OpenList is open-source software licensed under the AGPL-3.0 license.
Disclaimer
- This project is a free and open-source software designed to facilitate file sharing via net disks, primarily intended to support the downloading and learning of the Go programming language.
- Please comply with all applicable laws and regulations when using this software. Any form of misuse is strictly prohibited.
- The software is based on official SDKs or APIs without any modification, disruption, or interference with their behavior.
- It only performs HTTP 302 redirects or traffic forwarding, and does not intercept, store, or tamper with any user data.
- This project is not affiliated with any official platform or service provider.
- The software is provided "as is", without any warranties of any kind, either express or implied, including but not limited to warranties of merchantability or fitness for a particular purpose.
- The maintainers are not liable for any direct or indirect damages arising from the use of, or inability to use, this software.
- You are solely responsible for any risks associated with using this software, including but not limited to account bans or download speed limitations.
- This project is licensed under the AGPL-3.0 License. Please see the LICENSE file for details.
Contact Us
Contributors
We sincerely thank the author Xhofe of the original project AlistGo/alist and all other contributors.
Thanks goes to these wonderful people:
