Compare commits

..

62 Commits

Author SHA1 Message Date
c0a8321461 Update release_docker.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:36:35 +08:00
680501a8a8 Update release_android.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:36:22 +08:00
83913a8031 Update release.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:36:11 +08:00
929d4e65b9 Update release_freebsd.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:35:51 +08:00
6717d02f94 Update release_linux_musl.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:35:34 +08:00
9d2a71e3eb Update release_linux_musl_arm.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:35:21 +08:00
62de731d37 Update release_freebsd.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:34:35 +08:00
7277163b0a Update release_linux_musl.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:34:04 +08:00
98f65d5478 Update release_linux_musl_arm.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:33:52 +08:00
312e04ea69 chore(ci):Fixed CI bugs 2025-06-20 20:13:40 +08:00
6ddb4359d3 Update release.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:07:56 +08:00
cf444c2f63 Update release.yml
Signed-off-by: Pikachu Ren <40362270+PIKACHUIM@users.noreply.github.com>
2025-06-20 20:05:04 +08:00
0176cfb0c9 chore:fixed ci build 2025-06-20 19:32:10 +08:00
ef0531ad40 feat(ci): add changelog content to release content (#233) 2025-06-20 19:24:29 +08:00
12540a8abc fix: http2 content-length (#224) 2025-06-20 17:57:14 +08:00
0f5ed14fe2 feat(fs): add cross-storage move support (#211)
* feat(fs): add cross-storage move support

* fix(fs): add check before moving files

* fix(fs): changed error detect method

---------

Co-authored-by: ShenLin <773933146@qq.com>
2025-06-20 17:54:24 +08:00
ca55b89322 remove alist from repo (#230)
* remove alist from repo

* remove alist from repo

* remove alist from repo
2025-06-20 17:41:16 +08:00
a3c7cb059d chore:Change Logo URL and fixed aliyundrive open bugs (#208)
* Fix Logo URL

* fixed aliyunpan_open

* fixed aliyundrive bugs

* fixed onlineapi bugs

* fixed onlineapi bugs

* Fixed Bugs

* Rollback

* fixed

* fixed onlineapi

* fixed driver

---------

Signed-off-by: Suyunmeng <sumengjing@outlook.com>
2025-06-19 21:20:29 +08:00
0f8545133b add text output for error message (#210)
* mod rank for AccessToken

* del alist_v2

* add error message from remote

---------

Co-authored-by: Suyunmeng <sumengjing@outlook.com>
2025-06-19 20:25:45 +08:00
72fad1be2e Delete Lark Drive (#201) 2025-06-19 16:38:51 +08:00
b7ce7f172b Dev pika (#202)
* mod rank for AccessToken

* del alist_v2

---------

Co-authored-by: Suyunmeng <sumengjing@outlook.com>
2025-06-19 16:25:07 +08:00
248c041711 fix(setting): update preview url (#198) 2025-06-19 15:05:29 +08:00
70b937e031 Revert "feat(log): add error logging middleware for improved error handling (#182)"
This reverts commit 5e8d8d070a.
2025-06-19 09:56:45 +08:00
79521db8e0 fix(ci): add workflow_dispatch for beta_release and build 2025-06-18 23:27:23 +08:00
015d3ecd00 fix(ci): add auth header when access GitHub CI 2025-06-18 23:27:23 +08:00
89451b6d98 fix(ci): use OpenListTeam/cgo-actions@v1.1.2 2025-06-18 23:27:23 +08:00
681cb6c8a4 fix(ci): freebsd 14.1 is deprecated (#187) 2025-06-18 22:17:21 +08:00
c2d1316f65 fix(115open) fixed rate_limit bugs (#161)
* fixed 115 bugs

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Fixed 115 open bugs

* fixed bugs

---------

Signed-off-by: Suyunmeng <sumengjing@outlook.com>
2025-06-18 21:32:23 +08:00
5e8d8d070a feat(log): add error logging middleware for improved error handling (#182) 2025-06-18 20:37:16 +08:00
c7c0bfe810 mod rank for AccessToken (#181) 2025-06-18 18:09:36 +08:00
e9c73b52db fix(Dockerfile): add jq package (#168) 2025-06-18 14:26:42 +08:00
7d24a5d45f feat: add file visibility checks for windows (#39)
* feat: add file visibility checks for windows

* fix: fix build error

* refactor: optimize thie ishidden

---------

Co-authored-by: Hantong Chen <70561268+cxw620@users.noreply.github.com>
2025-06-17 23:25:02 +08:00
3ab309e00e refactor: adjust CI process (#125)
* feat(cmd/lang): allow setting frontend path when generate lang files

* chore(ci): remove ci for auto_lang (done by frontend ci)
2025-06-17 22:35:02 +08:00
8822eef97e chore(api):Add online api refresh method (#143)
* Add Official API Refresh Interface(Baiduyun)

* add UseOnlineAPI & APIAddress
add _refreshToken using APIAddress

* fix return

* Modify the frontend display using the default API refresh method

* Fixed display and operation related issues

* fixed aliyundrive_open old refresh

---------

Co-authored-by: Suyunmeng <sumengjing@outlook.com>
2025-06-17 22:13:28 +08:00
7613f886d0 fix(123open): add rate limit (#144) 2025-06-17 18:49:32 +08:00
fe02a989bd feat(123pan): support 123Open (#93) 2025-06-17 18:38:25 +08:00
2bed40cfce chore(Dockerfile): add jq package (#142)
Add jq package

Signed-off-by: Suyunmeng <sumengjing@outlook.com>
2025-06-17 18:38:22 +08:00
87ca1b96ae fix(189pc): crashes when upload cancelled (#79)
* fix(189pc): crashes when upload cancelled

Signed-off-by: XZB-1248 <28593573+XZB-1248@users.noreply.github.com>

* fix(189pc): replace semaphore with errgroup.Group.SetLimit

---------

Signed-off-by: XZB-1248 <28593573+XZB-1248@users.noreply.github.com>
Co-authored-by: KirCute <951206789@qq.com>
2025-06-17 00:13:31 +08:00
5a4649c929 feat(alias): support parallel write (#69)
* feat(alias): support parallel write

* fix(alias): lack `err` in `errors.Join()`
2025-06-17 00:13:01 +08:00
2e2cec05fd fix(cloudreve): remove unnecessary finish increment in upload functions (#62)
* fix(cloudreve): remove unnecessary finish increment in upload functions

* fix(cloudreve_v4): remove unnecessary finish increment in upload functions
2025-06-17 00:12:45 +08:00
b1afadd129 chore: update project meta (#51)
* chore: update project meta (partial)

* chore: update README

* chore: update pdf preview

* revert: use old hash

* chore: update logo file url
2025-06-16 16:29:45 +08:00
a59ad9a84e fix(lanzou): fix removing JavaScript comments from response data (#37)
* 修复清理js中块注释的bug

移除块注释,目前只将开始“/*”和结束的“*/”移除,未将注释中内容移除

Signed-off-by: 410680876f1 <71364356+410680876f1@users.noreply.github.com>

* 修复清理js中注释的bug

移注释,目前只将注释标识符号清楚,注释中内容被遗留了下来
感谢大佬@Kuingsmile的代码审核

Signed-off-by: 410680876f1 <71364356+410680876f1@users.noreply.github.com>

* 代码格式化

Signed-off-by: 410680876f1 <71364356+410680876f1@users.noreply.github.com>

---------

Signed-off-by: 410680876f1 <71364356+410680876f1@users.noreply.github.com>
Co-authored-by: Hantong Chen <70561268+cxw620@users.noreply.github.com>
2025-06-16 16:28:08 +08:00
2e889fb07d chore(ci): fixed dockerhub ci process (#97)
* add DockerHub

* fixed dockerhub

* Update dockerhub CI

* Update DockerHub

* fixed bugs

* fixed CI Bugs

* Update auto_lang.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* fixed release

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update test_docker.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Delete hub

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Delete hub

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* test build

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Simplify actions

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Simplify actions test

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Simplify actions test Successful ,Rollback Environments

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update release_docker.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update test_docker.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update auto_lang.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update auto_lang.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update auto_lang.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update test_docker.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

* Update release_docker.yml

Signed-off-by: Suyunmeng <sumengjing@outlook.com>

---------

Signed-off-by: Suyunmeng <sumengjing@outlook.com>
2025-06-16 14:16:45 +08:00
d95c4f0127 chore: change the CDN link of the logo and modify the OCR port (#84)
* Change the CDN link of the logo and modify the OCR port

* Update

* Rollback OCR interface
2025-06-15 23:19:25 +08:00
1c58d11d62 chore: update build.sh & add loongarch64 support (#28)
* chore: update build.sh

* chore: update ci build

* chore: update ci build GitAuthor

* feat(build.sh): fix web release download & add loongarch64 build (#63)

chore(ci): fix web download & add loongarch64 & update cgo-actions to v1.1.1

* chore: temporary build test

* revert(build.sh): change to release used url

* feat(build.sh): add set -e for build script

* fix(build.sh): fix web release download logic

* fix(build.sh): remove TODO comment

* feat(build.sh): update GitAuthor to bot@openlist.team

* feat(build.sh): update GitAuthor

* fix: using fsSL in curl & add info of desktop client back

* chore: refine beta release workflow comments

---------

Co-authored-by: Yinan Qin <39023210+elysia-best@users.noreply.github.com>
2025-06-14 23:16:42 +08:00
e11c390c4d fix(cli): Fixed links to documentation in the CLI (#71)
Co-authored-by: reschen <reschen@126.com>
2025-06-14 20:21:14 +08:00
2965915bed chore(deps): switch the dependency from KirCute/sftpd-alist to OpenListTeam/sftpd-openlist (#64) 2025-06-14 16:04:13 +08:00
da1cfd1945 chore(deps): remove dependency KirCute/ftpserverlib-pasvportmap (#61) 2025-06-14 15:56:51 +08:00
8a29790327 chore(ci): using latest musl-compilers (#23)
* chore(ci): using `latest` musl-compilers

https://github.com/OpenListTeam/OpenList/pull/3#pullrequestreview-2921194381

Signed-off-by: YaoSiQian <admin@yaosiqian.cn>

* chore(ci): using `latest` musl-compilers in beta_release CI

---------

Signed-off-by: YaoSiQian <admin@yaosiqian.cn>
Co-authored-by: Hantong Chen <cxwdyx620@gmail.com>
2025-06-13 17:01:24 +08:00
7cd8f648c8 fix: change app name in cmd (#36) 2025-06-13 15:19:25 +08:00
b8e6083e19 chore: remove deprecated vtencent drive (#33) 2025-06-13 12:55:52 +08:00
3f821bdcd1 revert: using old salt value (#29)
Signed-off-by: Yinan Qin <39023210+elysia-best@users.noreply.github.com>
2025-06-13 12:47:51 +08:00
9e05c81d9c chore: update project logo (#26) 2025-06-12 23:29:35 +08:00
f1552b67a0 chore(setting): update repo name in default announcement (#27)
chore(SETTING)/update repo name in default announcement
2025-06-12 23:28:33 +08:00
20d1d5b479 chore(README): update README, add progress intro (#21)
* Update README_cn.md

* Update README_cn.md

* Update README.md

* Update README_ja.md

* Update README_ja.md

* Update README_ja.md

* Update README_ja.md

---------

Co-authored-by: Hantong Chen <70561268+cxw620@users.noreply.github.com>
2025-06-12 22:03:18 +08:00
fdcc2f136e chore: change module name to OpenListTeam/OpenList (#2)
* Enable blank issue

* chore(README.md): update docs (temporally)

* Update FUNDING.yml

* chore: purge README.md

* chore: change module name to OpenListTeam/OpenList

* fix: fix link errors

* chore: remove v3 in module name

* fix: resolve some conficts

* fix: resolve conficts

* docs: update with latest file

---------

Co-authored-by: ShenLin <773933146@qq.com>
Co-authored-by: Hantong Chen <cxwdyx620@gmail.com>
Co-authored-by: joshua <i@joshua.su>
Co-authored-by: Hantong Chen <70561268+cxw620@users.noreply.github.com>
2025-06-12 22:02:46 +08:00
5feb86ceee chore(docs&ci): change links in files & fix github ci and docker ci (#3)
* Enable blank issue

* chore(README.md): update docs (temporally)

* Update FUNDING.yml

* chore: purge README.md

* Update README.md

Alist改为OpenList

* Update README_cn.md

Alist改为OpenList

* Update README.md

漏了一处

* Update README_ja.md

Alist改为OpenList

* Update README_cn.md

漏了一处

* Update CODE_OF_CONDUCT.md

更改链接

* Update README.md

更新tg链接

* Update README_cn.md

更新tg链接

* Update README_ja.md

更新tg链接

* chore(build&docs): use new links in build and github templates

* Update README.md

更新团队名

* chore: disable translation update, change beta release into artifacts

* fix: disable docker build and name the uploaded artifacts

* fix typo

* Update README_cn.md

更新团队名称

* Update README_ja.md

更新

* Update project name in CONTRIBUTING.md

* Update README_cn.md

更新

* Update README.md

更新

* Update README_ja.md

* fix: fix artifact name

* chore(build.sh): use original musl.cc

* fix(ci): fix action artifacts upload

* Update CODE_OF_CONDUCT.md

TG更改为Telegram

* Update README_cn.md

更新论坛链接

* Update README.md

更新论坛链接

* Update README_ja.md

更新论坛链接

* feat: update community based call back for onedrive

* chore(ci): update musl.cc link

* chore: use openlist as name instead of default OpenList

* Update user.go

* chore: fix artifact name

* feat(ci): add docker build test

* fix: add more platforms

* fix: explicitly use docker.io

* fix: fix typo

* fix(docker): fix test build push platform

* chore: change to OpenListTeam

* Update CODE_OF_CONDUCT.md

* doc: update org name

* docs: change repo urls

* feat: release docker image to ghcr.io on tagging

* fix: fix the name of test_docker

* build: update the names in docker-compose and docker file

* chore: rename

---------

Co-authored-by: ShenLin <773933146@qq.com>
Co-authored-by: Hantong Chen <cxwdyx620@gmail.com>
Co-authored-by: joshua <i@joshua.su>
Co-authored-by: 绎泽 <yize@tencent.to>
Co-authored-by: zyk2507 <93830642+zyk2507@users.noreply.github.com>
2025-06-12 21:29:43 +08:00
ee783fa1be chore(CONTRIBUTING): update to new OpenList-Frontend 2025-06-12 17:58:55 +08:00
0bcb4fe16d chore(README): update project name
Update FUNDING.yml

chore: purge README.md

Update project name in CONTRIBUTING.md

Update README.md

Alist改为OpenList

Update README_cn.md

Alist改为OpenList

Update README.md

漏了一处

Update README_ja.md

Alist改为OpenList

Update README_cn.md

漏了一处

Update CODE_OF_CONDUCT.md

更改链接

Update README.md

更新tg链接

Update README_cn.md

更新tg链接

Update README_ja.md

更新tg链接

Update README.md

更新团队名

Update README_cn.md

更新团队名称

Update README_ja.md

更新

Update README_cn.md

更新

Update README.md

更新

Update README_ja.md

Update CODE_OF_CONDUCT.md

TG更改为Telegram

Update README_cn.md

更新论坛链接

Update README.md

更新论坛链接

Update README_ja.md

更新论坛链接
2025-06-12 16:56:22 +08:00
4f57bd3ae6 chore(README.md): update docs (temporally) 2025-06-12 16:56:22 +08:00
cf42fe6a40 chore: allow blank issue 2025-06-12 16:56:18 +08:00
c4775521c6 chore(README.md): reminder of fork
fix: remove `alistgo.com`
2025-06-11 16:14:44 +08:00
510 changed files with 3790 additions and 3866 deletions

4
.github/FUNDING.yml vendored
View File

@ -3,11 +3,11 @@
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username open_collective: # Replace with a single Open Collective username
ko_fi: xhofe # Replace with a single Ko-fi username ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: ['https://alist.nn.ci/guide/sponsor.html'] custom: []

View File

@ -12,18 +12,18 @@ body:
attributes: attributes:
label: Please make sure of the following things label: Please make sure of the following things
description: | description: |
You must check all the following, otherwise your issue may be closed directly. Or you can go to the [discussions](https://github.com/alist-org/alist/discussions) You must check all the following, otherwise your issue may be closed directly. Or you can go to the [discussions](https://github.com/OpenListTeam/OpenList/discussions)
您必须勾选以下所有内容否则您的issue可能会被直接关闭。或者您可以去[讨论区](https://github.com/alist-org/alist/discussions) 您必须勾选以下所有内容否则您的issue可能会被直接关闭。或者您可以去[讨论区](https://github.com/OpenListTeam/OpenList/discussions)
options: options:
- label: | - label: |
I have read the [documentation](https://alist.nn.ci). I have read the [documentation](https://openlistteam.github.io/docs).
我已经阅读了[文档](https://alist.nn.ci)。 我已经阅读了[文档](https://openlistteam.github.io/docs)。
- label: | - label: |
I'm sure there are no duplicate issues or discussions. I'm sure there are no duplicate issues or discussions.
我确定没有重复的issue或讨论。 我确定没有重复的issue或讨论。
- label: | - label: |
I'm sure it's due to `AList` and not something else(such as [Network](https://alist.nn.ci/faq/howto.html#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host) ,`Dependencies` or `Operational`). I'm sure it's due to `OpenList` and not something else(such as [Network](https://openlistteam.github.io/docs/faq/howto.html#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host) ,`Dependencies` or `Operational`).
我确定是`AList`的问题,而不是其他原因(例如[网络](https://alist.nn.ci/zh/faq/howto.html#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host)`依赖`或`操作`)。 我确定是`OpenList`的问题,而不是其他原因(例如[网络](https://openlistteam.github.io/docs/zh/faq/howto.html#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host)`依赖`或`操作`)。
- label: | - label: |
I'm sure this issue is not fixed in the latest version. I'm sure this issue is not fixed in the latest version.
我确定这个问题在最新版本中没有被修复。 我确定这个问题在最新版本中没有被修复。
@ -31,7 +31,7 @@ body:
- type: input - type: input
id: version id: version
attributes: attributes:
label: AList Version / AList 版本 label: OpenList Version / OpenList 版本
description: | description: |
What version of our software are you running? Do not use `latest` or `master` as an answer. What version of our software are you running? Do not use `latest` or `master` as an answer.
您使用的是哪个版本的软件?请不要使用`latest`或`master`作为答案。 您使用的是哪个版本的软件?请不要使用`latest`或`master`作为答案。
@ -68,8 +68,8 @@ body:
attributes: attributes:
label: Config / 配置 label: Config / 配置
description: | description: |
Please provide the configuration file of your `AList` application and take a screenshot of the relevant storage configuration. (hide privacy field) Please provide the configuration file of your `OpenList` application and take a screenshot of the relevant storage configuration. (hide privacy field)
请提供您的`AList`应用的配置文件,并截图相关存储配置。(隐藏隐私字段) 请提供您的`OpenList`应用的配置文件,并截图相关存储配置。(隐藏隐私字段)
validations: validations:
required: true required: true
- type: textarea - type: textarea

View File

@ -1,5 +1,5 @@
blank_issues_enabled: false blank_issues_enabled: true
contact_links: contact_links:
- name: Questions & Discussions - name: Questions & Discussions
url: https://github.com/alist-org/alist/discussions url: https://github.com/OpenListTeam/OpenList/discussions
about: Use GitHub discussions for message-board style questions and discussions. about: Use GitHub discussions for message-board style questions and discussions.

View File

@ -7,7 +7,7 @@ body:
label: Please make sure of the following things label: Please make sure of the following things
description: You may select more than one, even select all. description: You may select more than one, even select all.
options: options:
- label: I have read the [documentation](https://alist.nn.ci). - label: I have read the [documentation](https://openlistteam.github.io/docs).
- label: I'm sure there are no duplicate issues or discussions. - label: I'm sure there are no duplicate issues or discussions.
- label: I'm sure this feature is not implemented. - label: I'm sure this feature is not implemented.
- label: I'm sure it's a reasonable and popular requirement. - label: I'm sure it's a reasonable and popular requirement.

View File

@ -1,71 +0,0 @@
name: auto_lang
on:
push:
branches:
- 'main'
paths:
- 'drivers/**'
- 'internal/bootstrap/data/setting.go'
- 'internal/conf/const.go'
- 'cmd/lang.go'
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
auto_lang:
strategy:
matrix:
platform: [ ubuntu-latest ]
go-version: [ '1.21' ]
name: auto generate lang.json
runs-on: ${{ matrix.platform }}
steps:
- name: Setup go
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
- name: Checkout alist
uses: actions/checkout@v4
with:
path: alist
- name: Checkout alist-web
uses: actions/checkout@v4
with:
repository: 'alist-org/alist-web'
ref: main
persist-credentials: false
fetch-depth: 0
path: alist-web
- name: Generate lang
run: |
cd alist
go run ./main.go lang
cd ..
- name: Copy lang file
run: |
cp -f ./alist/lang/*.json ./alist-web/src/lang/en/ 2>/dev/null || :
- name: Commit git
run: |
cd alist-web
git add .
git config --local user.email "bot@nn.ci"
git config --local user.name "IlaBot"
git commit -m "chore: auto update i18n file" -a 2>/dev/null || :
cd ..
- name: Push lang files
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.MY_TOKEN }}
branch: main
directory: alist-web
repository: alist-org/alist-web

View File

@ -3,6 +3,7 @@ name: beta release
on: on:
push: push:
branches: [ 'main' ] branches: [ 'main' ]
workflow_dispatch:
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
@ -41,9 +42,8 @@ jobs:
run: | run: |
git tag -l git tag -l
npx changelogithub --output CHANGELOG.md npx changelogithub --output CHANGELOG.md
# npx changelogen@latest --output CHANGELOG.md
- name: Upload assets - name: Upload assets to beta release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
body_path: CHANGELOG.md body_path: CHANGELOG.md
@ -51,6 +51,14 @@ jobs:
prerelease: true prerelease: true
tag_name: beta tag_name: beta
- name: Upload assets to github artifact
uses: actions/upload-artifact@v4
with:
name: beta changelog
path: ${{ github.workspace }}/CHANGELOG.md
compression-level: 0
if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
release: release:
needs: needs:
- changelog - changelog
@ -85,54 +93,81 @@ jobs:
- name: Setup web - name: Setup web
run: bash build.sh dev web run: bash build.sh dev web
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build - name: Build
uses: go-cross/cgo-actions@v1 uses: OpenListTeam/cgo-actions@v1.1.2
with: with:
targets: ${{ matrix.target }} targets: ${{ matrix.target }}
musl-target-format: $os-$musl-$arch musl-target-format: $os-$musl-$arch
out-dir: build out-dir: build
output: openlist-$target$ext
musl-base-url: "https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
x-flags: | x-flags: |
github.com/alist-org/alist/v3/internal/conf.BuiltAt=$built_at github.com/OpenListTeam/OpenList/internal/conf.BuiltAt=$built_at
github.com/alist-org/alist/v3/internal/conf.GitAuthor=Xhofe github.com/OpenListTeam/OpenList/internal/conf.GitAuthor=OpenList
github.com/alist-org/alist/v3/internal/conf.GitCommit=$git_commit github.com/OpenListTeam/OpenList/internal/conf.GitCommit=$git_commit
github.com/alist-org/alist/v3/internal/conf.Version=$tag github.com/OpenListTeam/OpenList/internal/conf.Version=$tag
github.com/alist-org/alist/v3/internal/conf.WebVersion=dev github.com/OpenListTeam/OpenList/internal/conf.WebVersion=dev
- name: Compress - name: Compress
run: | run: |
bash build.sh zip ${{ matrix.hash }} bash build.sh zip ${{ matrix.hash }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets # See above
- name: Upload assets to beta release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
files: build/compress/* files: build/compress/*
prerelease: true prerelease: true
tag_name: beta tag_name: beta
desktop: - name: Clean illegal characters from matrix.target
needs: id: clean_target_name
- release
name: Beta Release Desktop
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
repository: alist-org/desktop-release
ref: main
persist-credentials: false
fetch-depth: 0
- name: Commit
run: | run: |
git config --local user.email "bot@nn.ci" ILLEGAL_CHARS_REGEX='[":<>|*?\\/\r\n]'
git config --local user.name "IlaBot" CLEANED_TARGET=$(echo "${{ matrix.target }}" | sed -E "s/$ILLEGAL_CHARS_REGEX//g")
git commit --allow-empty -m "Trigger build for ${{ github.sha }}" echo "Original target: ${{ matrix.target }}"
echo "Cleaned target: $CLEANED_TARGET"
echo "cleaned_target=$CLEANED_TARGET" >> $GITHUB_ENV
- name: Push commit - name: Upload assets to github artifact
uses: ad-m/github-push-action@master uses: actions/upload-artifact@v4
with: with:
github_token: ${{ secrets.MY_TOKEN }} name: beta builds for ${{ env.cleaned_target }}
branch: main path: ${{ github.workspace }}/build/compress/*
repository: alist-org/desktop-release compression-level: 0
if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
# TODO: We do not have desktop clients right now. We may need a better way to
# trigger the build of desktop client when we actually have it.
# desktop:
# needs:
# - release
# name: Beta Release Desktop
# runs-on: ubuntu-latest
# steps:
# - name: Checkout repo
# uses: actions/checkout@v4
# with:
# repository: openlistteam/desktop-release
# ref: main
# persist-credentials: false
# fetch-depth: 0
# - name: Commit
# run: |
# git config --local user.email "bot@nn.ci"
# git config --local user.name "IlaBot"
# git commit --allow-empty -m "Trigger build for ${{ github.sha }}"
# - name: Push commit
# uses: ad-m/github-push-action@master
# with:
# github_token: ${{ secrets.MY_TOKEN }}
# branch: main
# repository: openlistteam/desktop-release

View File

@ -5,6 +5,7 @@ on:
branches: [ 'main' ] branches: [ 'main' ]
pull_request: pull_request:
branches: [ 'main' ] branches: [ 'main' ]
workflow_dispatch:
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
@ -40,22 +41,24 @@ jobs:
- name: Setup web - name: Setup web
run: bash build.sh dev web run: bash build.sh dev web
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build - name: Build
uses: go-cross/cgo-actions@v1 uses: OpenListTeam/cgo-actions@v1.1.2
with: with:
targets: ${{ matrix.target }} targets: ${{ matrix.target }}
musl-target-format: $os-$musl-$arch musl-target-format: $os-$musl-$arch
out-dir: build out-dir: build
x-flags: | x-flags: |
github.com/alist-org/alist/v3/internal/conf.BuiltAt=$built_at github.com/OpenListTeam/OpenList/internal/conf.BuiltAt=$built_at
github.com/alist-org/alist/v3/internal/conf.GitAuthor=Xhofe github.com/OpenListTeam/OpenList/internal/conf.GitAuthor=OpenList
github.com/alist-org/alist/v3/internal/conf.GitCommit=$git_commit github.com/OpenListTeam/OpenList/internal/conf.GitCommit=$git_commit
github.com/alist-org/alist/v3/internal/conf.Version=$tag github.com/OpenListTeam/OpenList/internal/conf.Version=$tag
github.com/alist-org/alist/v3/internal/conf.WebVersion=dev github.com/OpenListTeam/OpenList/internal/conf.WebVersion=dev
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: alist_${{ env.SHA }}_${{ matrix.target }} name: openlist_${{ env.SHA }}_${{ matrix.target }}
path: build/* path: build/*

View File

@ -3,6 +3,7 @@ name: release
on: on:
release: release:
types: [ published ] types: [ published ]
permissions: write-all
jobs: jobs:
release: release:
@ -33,7 +34,7 @@ jobs:
- name: Prerelease - name: Prerelease
uses: irongut/EditRelease@v1.2.0 uses: irongut/EditRelease@v1.2.0
with: with:
token: ${{ secrets.MY_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
id: ${{ github.event.release.id }} id: ${{ github.event.release.id }}
prerelease: true prerelease: true
@ -57,6 +58,8 @@ jobs:
- name: Build - name: Build
run: | run: |
bash build.sh release bash build.sh release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
@ -64,29 +67,32 @@ jobs:
files: build/compress/* files: build/compress/*
prerelease: false prerelease: false
release_desktop:
needs: release
name: Release desktop
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
repository: alist-org/desktop-release
ref: main
persist-credentials: false
fetch-depth: 0
- name: Add tag # TODO: We do not have desktop clients right now. We may need a better way to
run: | # trigger the build of desktop client when we actually have it.
git config --local user.email "bot@nn.ci" # release_desktop:
git config --local user.name "IlaBot" # needs: release
version=$(wget -qO- -t1 -T2 "https://api.github.com/repos/alist-org/alist/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') # name: Release desktop
git tag -a $version -m "release $version" # runs-on: ubuntu-latest
# steps:
# - name: Checkout repo
# uses: actions/checkout@v4
# with:
# repository: openlistteam/desktop-release
# ref: main
# persist-credentials: false
# fetch-depth: 0
- name: Push tags # - name: Add tag
uses: ad-m/github-push-action@master # run: |
with: # git config --local user.email "bot@nn.ci"
github_token: ${{ secrets.MY_TOKEN }} # git config --local user.name "IlaBot"
branch: main # version=$(wget -qO- -t1 -T2 "https://api.github.com/repos/openlistteam/openlist/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
repository: alist-org/desktop-release # git tag -a $version -m "release $version"
# - name: Push tags
# uses: ad-m/github-push-action@master
# with:
# github_token: ${{ secrets.MY_TOKEN }}
# branch: main
# repository: openlistteam/desktop-release

View File

@ -4,6 +4,8 @@ on:
release: release:
types: [ published ] types: [ published ]
permissions: write-all
jobs: jobs:
release_android: release_android:
strategy: strategy:
@ -27,6 +29,8 @@ jobs:
- name: Build - name: Build
run: | run: |
bash build.sh release android bash build.sh release android
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

View File

@ -1,34 +1,29 @@
name: release_docker name: release_docker
on: on:
workflow_dispatch:
push: push:
tags: tags:
- 'v*' - 'v*'
branches:
- main
pull_request:
branches:
- main
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true cancel-in-progress: true
env: env:
REGISTRY: 'xhofe/alist' ORG_NAME: openlistteam
REGISTRY_USERNAME: 'xhofe' IMAGE_NAME: openlist-git
REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} IMAGE_NAME_DOCKERHUB: openlist
REGISTRY: ghcr.io
ARTIFACT_NAME: 'binaries_docker_release' ARTIFACT_NAME: 'binaries_docker_release'
RELEASE_PLATFORMS: 'linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/s390x,linux/ppc64le,linux/riscv64' RELEASE_PLATFORMS: 'linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/s390x,linux/ppc64le,linux/riscv64'
IMAGE_PUSH: ${{ github.event_name == 'push' }} IMAGE_PUSH: ${{ github.event_name == 'push' }}
IMAGE_IS_PROD: ${{ github.ref_type == 'tag' }} IMAGE_IS_PROD: ${{ github.ref_type == 'tag' }}
IMAGE_TAGS_BETA: | IMAGE_TAGS_BETA: |
type=schedule
type=ref,event=branch
type=ref,event=tag
type=ref,event=pr
type=raw,value=beta,enable={{is_default_branch}} type=raw,value=beta,enable={{is_default_branch}}
permissions: write-all
jobs: jobs:
build_binary: build_binary:
name: Build Binaries for Docker Release name: Build Binaries for Docker Release
@ -51,14 +46,20 @@ jobs:
- name: Download Musl Library - name: Download Musl Library
if: steps.cache-musl.outputs.cache-hit != 'true' if: steps.cache-musl.outputs.cache-hit != 'true'
run: bash build.sh prepare docker-multiplatform run: bash build.sh prepare docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build go binary (beta) - name: Build go binary (beta)
if: env.IMAGE_IS_PROD != 'true' if: env.IMAGE_IS_PROD != 'true'
run: bash build.sh beta docker-multiplatform run: bash build.sh beta docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build go binary (release) - name: Build go binary (release)
if: env.IMAGE_IS_PROD == 'true' if: env.IMAGE_IS_PROD == 'true'
run: bash build.sh release docker-multiplatform run: bash build.sh release docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
@ -106,19 +107,28 @@ jobs:
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Login to DockerHub - name: Login to GitHub Container Registry
if: env.IMAGE_PUSH == 'true' if: env.IMAGE_PUSH == 'true'
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
logout: true registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_USERNAME }} username: ${{ github.actor }}
password: ${{ env.REGISTRY_PASSWORD }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub Container Registry
if: env.IMAGE_PUSH == 'true'
uses: docker/login-action@v3
with:
username: ${{ env.ORG_NAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta - name: Docker meta
id: meta id: meta
uses: docker/metadata-action@v5 uses: docker/metadata-action@v5
with: with:
images: ${{ env.REGISTRY }} images: |
${{ env.REGISTRY }}/${{ env.ORG_NAME }}/${{ env.IMAGE_NAME }}
${{ env.ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }}
tags: ${{ env.IMAGE_IS_PROD == 'true' && '' || env.IMAGE_TAGS_BETA }} tags: ${{ env.IMAGE_IS_PROD == 'true' && '' || env.IMAGE_TAGS_BETA }}
flavor: | flavor: |
${{ env.IMAGE_IS_PROD == 'true' && 'latest=true' || '' }} ${{ env.IMAGE_IS_PROD == 'true' && 'latest=true' || '' }}

View File

@ -4,7 +4,9 @@ on:
release: release:
types: [ published ] types: [ published ]
permissions: write-all
jobs: jobs:
release_freebsd: release_freebsd:
strategy: strategy:
matrix: matrix:
@ -27,6 +29,8 @@ jobs:
- name: Build - name: Build
run: | run: |
bash build.sh release freebsd bash build.sh release freebsd
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

View File

@ -3,7 +3,7 @@ name: release_linux_musl
on: on:
release: release:
types: [ published ] types: [ published ]
permissions: write-all
jobs: jobs:
release_linux_musl: release_linux_musl:
strategy: strategy:
@ -27,6 +27,8 @@ jobs:
- name: Build - name: Build
run: | run: |
bash build.sh release linux_musl bash build.sh release linux_musl
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

View File

@ -4,6 +4,7 @@ on:
release: release:
types: [ published ] types: [ published ]
permissions: write-all
jobs: jobs:
release_linux_musl_arm: release_linux_musl_arm:
strategy: strategy:
@ -27,6 +28,8 @@ jobs:
- name: Build - name: Build
run: | run: |
bash build.sh release linux_musl_arm bash build.sh release linux_musl_arm
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload assets - name: Upload assets
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

143
.github/workflows/test_docker.yml vendored Normal file
View File

@ -0,0 +1,143 @@
name: test_docker
on:
workflow_dispatch:
push:
branches:
- main
pull_request:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
ORG_NAME: openlistteam
IMAGE_NAME: openlist-git
IMAGE_NAME_DOCKERHUB: openlist
REGISTRY: ghcr.io
ARTIFACT_NAME: 'binaries_docker_release'
RELEASE_PLATFORMS: 'linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/s390x,linux/ppc64le,linux/riscv64'
IMAGE_PUSH: ${{ github.event_name == 'push' }}
IMAGE_TAGS_BETA: |
type=ref,event=pr
type=raw,value=beta,enable={{is_default_branch}}
jobs:
build_binary:
name: Build Binaries for Docker Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 'stable'
- name: Cache Musl
id: cache-musl
uses: actions/cache@v4
with:
path: build/musl-libs
key: docker-musl-libs-v2
- name: Download Musl Library
if: steps.cache-musl.outputs.cache-hit != 'true'
run: bash build.sh prepare docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build go binary (beta)
run: bash build.sh beta docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
overwrite: true
path: |
build/
!build/*.tgz
!build/musl-libs/**
release_docker:
needs: build_binary
name: Release Docker image
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy:
matrix:
image: ["latest", "ffmpeg", "aria2", "aio"]
include:
- image: "latest"
build_arg: ""
tag_favor: ""
- image: "ffmpeg"
build_arg: INSTALL_FFMPEG=true
tag_favor: "suffix=-ffmpeg,onlatest=true"
- image: "aria2"
build_arg: INSTALL_ARIA2=true
tag_favor: "suffix=-aria2,onlatest=true"
- image: "aio"
build_arg: |
INSTALL_FFMPEG=true
INSTALL_ARIA2=true
tag_favor: "suffix=-aio,onlatest=true"
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: 'build/'
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
if: env.IMAGE_PUSH == 'true'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub Container Registry
if: env.IMAGE_PUSH == 'true'
uses: docker/login-action@v3
with:
username: ${{ env.ORG_NAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.ORG_NAME }}/${{ env.IMAGE_NAME }}
${{ env.ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }}
tags: ${{ env.IMAGE_TAGS_BETA }}
flavor: |
${{ matrix.tag_favor }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile.ci
push: ${{ env.IMAGE_PUSH == 'true' }}
build-args: ${{ matrix.build_arg }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: ${{ env.RELEASE_PLATFORMS }}

View File

@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at reported to the community leaders responsible for enforcement at
i@nn.ci. [Telegram Group](https://t.me/OpenListTeam).
All complaints will be reviewed and investigated promptly and fairly. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the All community leaders are obligated to respect the privacy and security of the

View File

@ -2,7 +2,7 @@
## Setup your machine ## Setup your machine
`alist` is written in [Go](https://golang.org/) and [React](https://reactjs.org/). `OpenList` is written in [Go](https://golang.org/) and [React](https://reactjs.org/).
Prerequisites: Prerequisites:
@ -11,11 +11,11 @@ Prerequisites:
- [gcc](https://gcc.gnu.org/) - [gcc](https://gcc.gnu.org/)
- [nodejs](https://nodejs.org/) - [nodejs](https://nodejs.org/)
Clone `alist` and `alist-web` anywhere: Clone `OpenList` and `OpenList-Frontend` anywhere:
```shell ```shell
$ git clone https://github.com/alist-org/alist.git $ git clone https://github.com/OpenListTeam/OpenList.git
$ git clone --recurse-submodules https://github.com/alist-org/alist-web.git $ git clone --recurse-submodules https://github.com/OpenListTeam/OpenList-Frontend.git
``` ```
You should switch to the `main` branch for development. You should switch to the `main` branch for development.
@ -103,5 +103,5 @@ The rest of the commit message is then used for this.
## Submit a pull request ## Submit a pull request
Push your branch to your `alist` fork and open a pull request against the Push your branch to your `openlist` fork and open a pull request against the
`main` branch. `main` branch.

View File

@ -1,7 +1,7 @@
FROM alpine:edge as builder FROM docker.io/library/alpine:edge AS builder
LABEL stage=go-builder LABEL stage=go-builder
WORKDIR /app/ WORKDIR /app/
RUN apk add --no-cache bash curl gcc git go musl-dev RUN apk add --no-cache bash curl jq gcc git go musl-dev
COPY go.mod go.sum ./ COPY go.mod go.sum ./
RUN go mod download RUN go mod download
COPY ./ ./ COPY ./ ./
@ -11,9 +11,9 @@ FROM alpine:edge
ARG INSTALL_FFMPEG=false ARG INSTALL_FFMPEG=false
ARG INSTALL_ARIA2=false ARG INSTALL_ARIA2=false
LABEL MAINTAINER="i@nn.ci" LABEL MAINTAINER="OpenList"
WORKDIR /opt/alist/ WORKDIR /opt/openlist/
RUN apk update && \ RUN apk update && \
apk upgrade --no-cache && \ apk upgrade --no-cache && \
@ -32,11 +32,11 @@ RUN apk update && \
/opt/aria2/.aria2/tracker.sh ; \ /opt/aria2/.aria2/tracker.sh ; \
rm -rf /var/cache/apk/* rm -rf /var/cache/apk/*
COPY --chmod=755 --from=builder /app/bin/alist ./ COPY --chmod=755 --from=builder /app/bin/openlist ./
COPY --chmod=755 entrypoint.sh /entrypoint.sh COPY --chmod=755 entrypoint.sh /entrypoint.sh
RUN /entrypoint.sh version RUN /entrypoint.sh version
ENV PUID=0 PGID=0 UMASK=022 RUN_ARIA2=${INSTALL_ARIA2} ENV PUID=0 PGID=0 UMASK=022 RUN_ARIA2=${INSTALL_ARIA2}
VOLUME /opt/alist/data/ VOLUME /opt/openlist/data/
EXPOSE 5244 5245 EXPOSE 5244 5245
CMD [ "/entrypoint.sh" ] CMD [ "/entrypoint.sh" ]

View File

@ -1,11 +1,11 @@
FROM alpine:edge FROM docker.io/library/alpine:edge
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG INSTALL_FFMPEG=false ARG INSTALL_FFMPEG=false
ARG INSTALL_ARIA2=false ARG INSTALL_ARIA2=false
LABEL MAINTAINER="i@nn.ci" LABEL MAINTAINER="OpenList"
WORKDIR /opt/alist/ WORKDIR /opt/openlist/
RUN apk update && \ RUN apk update && \
apk upgrade --no-cache && \ apk upgrade --no-cache && \
@ -24,11 +24,11 @@ RUN apk update && \
/opt/aria2/.aria2/tracker.sh ; \ /opt/aria2/.aria2/tracker.sh ; \
rm -rf /var/cache/apk/* rm -rf /var/cache/apk/*
COPY --chmod=755 /build/${TARGETPLATFORM}/alist ./ COPY --chmod=755 /build/${TARGETPLATFORM}/openlist ./
COPY --chmod=755 entrypoint.sh /entrypoint.sh COPY --chmod=755 entrypoint.sh /entrypoint.sh
RUN /entrypoint.sh version RUN /entrypoint.sh version
ENV PUID=0 PGID=0 UMASK=022 RUN_ARIA2=${INSTALL_ARIA2} ENV PUID=0 PGID=0 UMASK=022 RUN_ARIA2=${INSTALL_ARIA2}
VOLUME /opt/alist/data/ VOLUME /opt/openlist/data/
EXPOSE 5244 5245 EXPOSE 5244 5245
CMD [ "/entrypoint.sh" ] CMD [ "/entrypoint.sh" ]

View File

@ -1,45 +1,41 @@
<div align="center"> <div align="center">
<a href="https://alist.nn.ci"><img width="100px" alt="logo" src="https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg"/></a> <img width="100px" alt="logo" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg"/></a>
<p><em>🗂A file list program that supports multiple storages, powered by Gin and Solidjs.</em></p> <p><em>🗂A file list program that supports multiple storages, powered by Gin and SolidJS, fork of AList.</em></p>
<div> <div>
<a href="https://goreportcard.com/report/github.com/alist-org/alist/v3"> <a href="https://goreportcard.com/report/github.com/OpenListTeam/OpenList/v3">
<img src="https://goreportcard.com/badge/github.com/alist-org/alist/v3" alt="latest version" /> <img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
</a> </a>
<a href="https://github.com/alist-org/alist/blob/main/LICENSE"> <a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Xhofe/alist" alt="License" /> <img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" />
</a> </a>
<a href="https://github.com/alist-org/alist/actions?query=workflow%3ABuild"> <a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild">
<img src="https://img.shields.io/github/actions/workflow/status/Xhofe/alist/build.yml?branch=main" alt="Build status" /> <img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" />
</a> </a>
<a href="https://github.com/alist-org/alist/releases"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/github/release/Xhofe/alist" alt="latest version" /> <img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" />
</a>
<a title="Crowdin" target="_blank" href="https://crwd.in/alist">
<img src="https://badges.crowdin.net/alist/localized.svg">
</a> </a>
</div> </div>
<div> <div>
<a href="https://github.com/alist-org/alist/discussions"> <a href="https://github.com/OpenListTeam/OpenList/discussions">
<img src="https://img.shields.io/github/discussions/Xhofe/alist?color=%23ED8936" alt="discussions" /> <img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" />
</a> </a>
<a href="https://discord.gg/F4ymsH4xv2"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/discord/1018870125102895134?logo=discord" alt="discussions" /> <img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://github.com/alist-org/alist/releases">
<img src="https://img.shields.io/github/downloads/Xhofe/alist/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://hub.docker.com/r/xhofe/alist">
<img src="https://img.shields.io/docker/pulls/xhofe/alist?color=%2348BB78&logo=docker&label=pulls" alt="Downloads" />
</a>
<a href="https://alist.nn.ci/guide/sponsor.html">
<img src="https://img.shields.io/badge/%24-sponsor-F87171.svg" alt="sponsor" />
</a> </a>
</div> </div>
</div> </div>
--- ---
English | [中文](./README_cn.md) | [日本語](./README_ja.md) | [Contributing](./CONTRIBUTING.md) | [CODE_OF_CONDUCT](./CODE_OF_CONDUCT.md) > [!IMPORTANT]
>
> Drop-in replacement for AList with long-term governance, no hidden risks, and full transparency, built to defend open source against trust-based attacks.
>
> We sincerely thank the author [Xhofe](https://github.com/Xhofe) of the original project [AlistGo/alist](https://github.com/AlistGo/alist) and all other contributors.
>
> This fork is not yet stable, specific migration progress can be viewed in [OpenList Migration Work Summary](https://github.com/OpenListTeam/OpenList/issues/6).
English | [中文](./README_cn.md) | [日本語](./README_ja.md) | [Contributing](./CONTRIBUTING.md) | [CODE OF CONDUCT](./CODE_OF_CONDUCT.md)
## Features ## Features
@ -88,8 +84,8 @@ English | [中文](./README_cn.md) | [日本語](./README_ja.md) | [Contributing
- [x] Dark mode - [x] Dark mode
- [x] I18n - [x] I18n
- [x] Protected routes (password protection and authentication) - [x] Protected routes (password protection and authentication)
- [x] WebDav (see https://alist.nn.ci/guide/webdav.html for details) - [x] WebDav (waiting for detail documents)
- [x] [Docker Deploy](https://hub.docker.com/r/xhofe/alist) - [ ] Docker Deploy (rebuilding)
- [x] Cloudflare Workers proxy - [x] Cloudflare Workers proxy
- [x] File/Folder package download - [x] File/Folder package download
- [x] Web upload(Can allow visitors to upload), delete, mkdir, rename, move and copy - [x] Web upload(Can allow visitors to upload), delete, mkdir, rename, move and copy
@ -99,44 +95,34 @@ English | [中文](./README_cn.md) | [日本語](./README_ja.md) | [Contributing
## Document ## Document
<https://alistgo.com/> <https://docs.openlist.team>
## Demo ## Demo
<https://al.nn.ci> N/A (to be rebuilt)
## Discussion ## Discussion
Please go to our [discussion forum](https://github.com/alist-org/alist/discussions) for general questions, **issues are for bug reports and feature requests only.** Please refer to [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) for raising general questions, ***Issues* is for bug reports and feature requests only.**
## Sponsor
AList is an open-source software, if you happen to like this project and want me to keep going, please consider sponsoring me or providing a single donation! Thanks for all the love and support:
https://alist.nn.ci/guide/sponsor.html
### Special sponsors
- [VidHub](https://apps.apple.com/app/apple-store/id1659622164?pt=118612019&ct=alist&mt=8) - An elegant cloud video player within the Apple ecosystem. Support for iPhone, iPad, Mac, and Apple TV.
- [亚洲云](https://www.asiayun.com/aff/QQCOOQKZ) - 高防服务器|服务器租用|福州高防|广东电信|香港服务器|美国服务器|海外服务器 - 国内靠谱的企业级云计算服务提供商 (sponsored Chinese API server)
- [找资源](http://zhaoziyuan2.cc/) - 阿里云盘资源搜索引擎
## Contributors ## Contributors
Thanks goes to these wonderful people: Thanks goes to these wonderful people:
[![Contributors](http://contrib.nn.ci/api?repo=alist-org/alist&repo=alist-org/alist-web&repo=alist-org/docs)](https://github.com/alist-org/alist/graphs/contributors) [![Contributors](https://contrib.rocks/image?repo=OpenListTeam/OpenList)](https://github.com/OpenListTeam/OpenList/graphs/contributors)
## License ## License
The `AList` is open-source software licensed under the AGPL-3.0 license. The `OpenList` is open-source software licensed under the AGPL-3.0 license.
## Disclaimer ## Disclaimer
- This program is a free and open source project. It is designed to share files on the network disk, which is convenient for downloading and learning Golang. Please abide by relevant laws and regulations when using it, and do not abuse it; - This program is a free and open source project. It is designed to share files on the network disk, which is convenient for downloading and learning Golang. Please abide by relevant laws and regulations when using it, and do not abuse it;
- This program is implemented by calling the official sdk/interface, without destroying the official interface behavior; - This program is implemented by calling the official sdk/interface, without destroying the official interface behavior;
- This program only does 302 redirect/traffic forwarding, and does not intercept, store, or tamper with any user data; - This program only does 302 redirect/traffic forwarding, and does not intercept, store, or tamper with any user data;
- Before using this program, you should understand and bear the corresponding risks, including but not limited to account ban, download speed limit, etc., which is none of this program's business; - Before using this program, you should understand and bear the corresponding risks, including but not limited to account ban, download speed limit, etc., which is none of this program's business;
- If there is any infringement, please contact me by [email](mailto:i@nn.ci), and it will be dealt with in time. - If there is any infringement, please contact [OpenListTeam](https://github.com/OpenListTeam), and it will be dealt with in time.
--- ---
> [@GitHub](https://github.com/alist-org) · [@TelegramGroup](https://t.me/alist_chat) · [@Discord](https://discord.gg/F4ymsH4xv2) > [@GitHub](https://github.com/OpenListTeam) · [Telegram Group](https://t.me/OpenListTeam)

View File

@ -1,45 +1,41 @@
<div align="center"> <div align="center">
<a href="https://alist.nn.ci"><img width="100px" alt="logo" src="https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg"/></a> <img width="100px" alt="logo" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg"/></a>
<p><em>🗂一个支持多存储的文件列表程序,使用 Gin 和 Solidjs。</em></p> <p><em>🗂一个支持多存储的文件列表程序,使用 Gin 和 SolidJS基于 AList 项目 fork 开发</em></p>
<div> <div>
<a href="https://goreportcard.com/report/github.com/alist-org/alist/v3"> <a href="https://goreportcard.com/report/github.com/OpenListTeam/OpenList/v3">
<img src="https://goreportcard.com/badge/github.com/alist-org/alist/v3" alt="latest version" /> <img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
</a> </a>
<a href="https://github.com/alist-org/alist/blob/main/LICENSE"> <a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Xhofe/alist" alt="License" /> <img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" />
</a> </a>
<a href="https://github.com/alist-org/alist/actions?query=workflow%3ABuild"> <a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild">
<img src="https://img.shields.io/github/actions/workflow/status/Xhofe/alist/build.yml?branch=main" alt="Build status" /> <img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" />
</a> </a>
<a href="https://github.com/alist-org/alist/releases"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/github/release/Xhofe/alist" alt="latest version" /> <img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" />
</a>
<a title="Crowdin" target="_blank" href="https://crwd.in/alist">
<img src="https://badges.crowdin.net/alist/localized.svg">
</a> </a>
</div> </div>
<div> <div>
<a href="https://github.com/alist-org/alist/discussions"> <a href="https://github.com/OpenListTeam/OpenList/discussions">
<img src="https://img.shields.io/github/discussions/Xhofe/alist?color=%23ED8936" alt="discussions" /> <img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" />
</a> </a>
<a href="https://discord.gg/F4ymsH4xv2"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/discord/1018870125102895134?logo=discord" alt="discussions" /> <img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://github.com/alist-org/alist/releases">
<img src="https://img.shields.io/github/downloads/Xhofe/alist/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://hub.docker.com/r/xhofe/alist">
<img src="https://img.shields.io/docker/pulls/xhofe/alist?color=%2348BB78&logo=docker&label=pulls" alt="Downloads" />
</a>
<a href="https://alist.nn.ci/zh/guide/sponsor.html">
<img src="https://img.shields.io/badge/%24-sponsor-F87171.svg" alt="sponsor" />
</a> </a>
</div> </div>
</div> </div>
--- ---
[English](./README.md) | 中文 | [日本語](./README_ja.md) | [Contributing](./CONTRIBUTING.md) | [CODE_OF_CONDUCT](./CODE_OF_CONDUCT.md) > [!IMPORTANT]
>
> 一个更可信、可持续的 AList 开源替代方案,防范未来可能的闭源、黑箱或不可信变更。
>
> 我们诚挚地感谢原项目 [AlistGo/alist](https://github.com/AlistGo/alist) 的作者 [Xhofe](https://github.com/Xhofe) 以及其他所有贡献者。
>
> 本 Fork 尚未稳定, 具体迁移进度可在 [OpenList 迁移工作总结](https://github.com/OpenListTeam/OpenList/issues/6) 中查看。
[English](./README.md) | 中文 | [日本語](./README_ja.md) | [Contributing](./CONTRIBUTING.md) | [CODE OF CONDUCT](./CODE_OF_CONDUCT.md)
## 功能 ## 功能
@ -86,8 +82,8 @@
- [x] 黑暗模式 - [x] 黑暗模式
- [x] 国际化 - [x] 国际化
- [x] 受保护的路由(密码保护和身份验证) - [x] 受保护的路由(密码保护和身份验证)
- [x] WebDav (具体见 https://alist.nn.ci/zh/guide/webdav.html) - [x] WebDav (详细文档待补充)
- [x] [Docker 部署](https://hub.docker.com/r/xhofe/alist) - [ ] Docker 部署(重建中)
- [x] Cloudflare workers 中转 - [x] Cloudflare workers 中转
- [x] 文件/文件夹打包下载 - [x] 文件/文件夹打包下载
- [x] 网页上传(可以允许访客上传),删除,新建文件夹,重命名,移动,复制 - [x] 网页上传(可以允许访客上传),删除,新建文件夹,重命名,移动,复制
@ -97,43 +93,34 @@
## 文档 ## 文档
<https://alist.nn.ci/zh/> <https://docs.openlist.team>
## Demo ## Demo
<https://al.nn.ci> N/A重建中
## 讨论 ## 讨论
一般问题请到[讨论论坛](https://github.com/alist-org/alist/discussions) **issue仅针对错误报告和功能请求。** 一般问题请到 [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) 讨论***Issues* 仅针对错误报告和功能请求。**
## 赞助
AList 是一个开源软件如果你碰巧喜欢这个项目并希望我继续下去请考虑赞助我或提供一个单一的捐款感谢所有的爱和支持https://alist.nn.ci/zh/guide/sponsor.html
### 特别赞助
- [VidHub](https://apps.apple.com/app/apple-store/id1659622164?pt=118612019&ct=alist&mt=8) - 苹果生态下优雅的网盘视频播放器iPhoneiPadMacApple TV全平台支持。
- [亚洲云](https://www.asiayun.com/aff/QQCOOQKZ) - 高防服务器|服务器租用|福州高防|广东电信|香港服务器|美国服务器|海外服务器 - 国内靠谱的企业级云计算服务提供商 (国内API服务器赞助)
- [找资源](http://zhaoziyuan2.cc/) - 阿里云盘资源搜索引擎
## 贡献者 ## 贡献者
Thanks goes to these wonderful people: 感谢这些开源作者们:
[![Contributors](http://contrib.nn.ci/api?repo=alist-org/alist&repo=alist-org/alist-web&repo=alist-org/docs)](https://github.com/alist-org/alist/graphs/contributors) [![Contributors](https://contrib.rocks/image?repo=OpenListTeam/OpenList)](https://github.com/OpenListTeam/OpenList/graphs/contributors)
## 许可 ## 许可
`AList` AGPL-3.0 许可许可的开源软件。 `OpenList` AGPL-3.0 许可许可的开源软件。
## 免责声明 ## 免责声明
- 本程序为免费开源项目旨在分享网盘文件方便下载以及学习golang使用时请遵守相关法律法规请勿滥用 - 本程序为免费开源项目旨在分享网盘文件方便下载以及学习golang使用时请遵守相关法律法规请勿滥用
- 本程序通过调用官方sdk/接口实现,无破坏官方接口行为; - 本程序通过调用官方sdk/接口实现,无破坏官方接口行为;
- 本程序仅做302重定向/流量转发,不拦截、存储、篡改任何用户数据; - 本程序仅做302重定向/流量转发,不拦截、存储、篡改任何用户数据;
- 在使用本程序之前你应了解并承担相应的风险包括但不限于账号被ban下载限速等与本程序无关 - 在使用本程序之前你应了解并承担相应的风险包括但不限于账号被ban下载限速等与本程序无关
- 如有侵权,请通过[邮件](mailto:i@nn.ci)与我联系,会及时处理。 - 如有侵权,请联系[OpenListTeam](https://github.com/OpenListTeam),团队会及时处理。
--- ---
> [@博客](https://nn.ci/) · [@GitHub](https://github.com/alist-org) · [@Telegram群](https://t.me/alist_chat) · [@Discord](https://discord.gg/F4ymsH4xv2) > [@GitHub](https://github.com/OpenListTeam) · [Telegram 交流群](https://t.me/OpenListTeam)

View File

@ -1,45 +1,41 @@
<div align="center"> <div align="center">
<a href="https://alist.nn.ci"><img width="100px" alt="logo" src="https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg"/></a> <img width="100px" alt="logo" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg"/></a>
<p><em>🗂Gin と Solidjs による、複数のストレージをサポートするファイルリストプログラム。</em></p> <p><em>🗂複数のストレージをサポートするファイルリストプログラムで、Gin と SolidJS を使用し、AList プロジェクトをフォークして開発されました</em></p>
<div> <div>
<a href="https://goreportcard.com/report/github.com/alist-org/alist/v3"> <a href="https://goreportcard.com/report/github.com/OpenListTeam/OpenList/v3">
<img src="https://goreportcard.com/badge/github.com/alist-org/alist/v3" alt="latest version" /> <img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
</a> </a>
<a href="https://github.com/alist-org/alist/blob/main/LICENSE"> <a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Xhofe/alist" alt="License" /> <img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" />
</a> </a>
<a href="https://github.com/alist-org/alist/actions?query=workflow%3ABuild"> <a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild">
<img src="https://img.shields.io/github/actions/workflow/status/Xhofe/alist/build.yml?branch=main" alt="Build status" /> <img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" />
</a> </a>
<a href="https://github.com/alist-org/alist/releases"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/github/release/Xhofe/alist" alt="latest version" /> <img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" />
</a>
<a title="Crowdin" target="_blank" href="https://crwd.in/alist">
<img src="https://badges.crowdin.net/alist/localized.svg">
</a> </a>
</div> </div>
<div> <div>
<a href="https://github.com/alist-org/alist/discussions"> <a href="https://github.com/OpenListTeam/OpenList/discussions">
<img src="https://img.shields.io/github/discussions/Xhofe/alist?color=%23ED8936" alt="discussions" /> <img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" />
</a> </a>
<a href="https://discord.gg/F4ymsH4xv2"> <a href="https://github.com/OpenListTeam/OpenList/releases">
<img src="https://img.shields.io/discord/1018870125102895134?logo=discord" alt="discussions" /> <img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://github.com/alist-org/alist/releases">
<img src="https://img.shields.io/github/downloads/Xhofe/alist/total?color=%239F7AEA&logo=github" alt="Downloads" />
</a>
<a href="https://hub.docker.com/r/xhofe/alist">
<img src="https://img.shields.io/docker/pulls/xhofe/alist?color=%2348BB78&logo=docker&label=pulls" alt="Downloads" />
</a>
<a href="https://alist.nn.ci/guide/sponsor.html">
<img src="https://img.shields.io/badge/%24-sponsor-F87171.svg" alt="sponsor" />
</a> </a>
</div> </div>
</div> </div>
--- ---
[English](./README.md) | [中文](./README_cn.md) | 日本語 | [Contributing](./CONTRIBUTING.md) | [CODE_OF_CONDUCT](./CODE_OF_CONDUCT.md) > [!IMPORTANT]
>
> より信頼性が高く、持続可能なAListのオープンソース代替案で、将来起こりうる非公開化、ブラックボックス化、または信頼できない変更から保護します。
>
> 元のプロジェクト [AlistGo/alist](https://github.com/AlistGo/alist) の作者 [Xhofe](https://github.com/Xhofe) および他のすべての貢献者に心から感謝いたします。
>
> このForkはまだ安定していません。具体的な移行の進捗状況は [OpenList 移行作業のまとめ](https://github.com/OpenListTeam/OpenList/issues/6) でご確認いただけます。
[English](./README.md) | [中文](./README_cn.md) | 日本語 | [Contributing](./CONTRIBUTING.md) | [CODE OF CONDUCT](./CODE_OF_CONDUCT.md)
## 特徴 ## 特徴
@ -87,8 +83,8 @@
- [x] ダークモード - [x] ダークモード
- [x] 国際化 - [x] 国際化
- [x] 保護されたルート (パスワード保護と認証) - [x] 保護されたルート (パスワード保護と認証)
- [x] WebDav (詳細は https://alist.nn.ci/guide/webdav.html を参照) - [x] WebDav(詳細なドキュメントは今後追加予定)
- [x] [Docker デプロイ](https://hub.docker.com/r/xhofe/alist) - [ ] Docker デプロイ(再構築中)
- [x] Cloudflare ワーカープロキシ - [x] Cloudflare ワーカープロキシ
- [x] ファイル/フォルダパッケージのダウンロード - [x] ファイル/フォルダパッケージのダウンロード
- [x] ウェブアップロード(訪問者にアップロードを許可できる), 削除, mkdir, 名前変更, 移動, コピー - [x] ウェブアップロード(訪問者にアップロードを許可できる), 削除, mkdir, 名前変更, 移動, コピー
@ -98,44 +94,34 @@
## ドキュメント ## ドキュメント
<https://alist.nn.ci/> <https://docs.openlist.team>
## デモ ## デモ
<https://al.nn.ci> N/A (再構築中)
## ディスカッション ## ディスカッション
一般的なご質問は[ディスカッションフォーラム](https://github.com/alist-org/alist/discussions)をご利用ください。**問題はバグレポートと機能リクエストのみです。** 一般的なご質問は [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) をご利用ください。***Issues* はバグ報告と機能リクエストに限定されています。**
## スポンサー
AList はオープンソースのソフトウェアです。もしあなたがこのプロジェクトを気に入ってくださり、続けて欲しいと思ってくださるなら、ぜひスポンサーになってくださるか、1口でも寄付をしてくださるようご検討くださいすべての愛とサポートに感謝します:
https://alist.nn.ci/guide/sponsor.html
### スペシャルスポンサー
- [VidHub](https://apps.apple.com/app/apple-store/id1659622164?pt=118612019&ct=alist&mt=8) - An elegant cloud video player within the Apple ecosystem. Support for iPhone, iPad, Mac, and Apple TV.
- [亚洲云](https://www.asiayun.com/aff/QQCOOQKZ) - 高防服务器|服务器租用|福州高防|广东电信|香港服务器|美国服务器|海外服务器 - 国内靠谱的企业级云计算服务提供商 (sponsored Chinese API server)
- [找资源](http://zhaoziyuan2.cc/) - 阿里云盘资源搜索引擎
## コントリビューター ## コントリビューター
これらの素晴らしい人々に感謝します: これらの素晴らしい人々に感謝します:
[![Contributors](http://contrib.nn.ci/api?repo=alist-org/alist&repo=alist-org/alist-web&repo=alist-org/docs)](https://github.com/alist-org/alist/graphs/contributors) [![Contributors](https://contrib.rocks/image?repo=openlistteam/openlist)](https://github.com/OpenListTeam/OpenList/graphs/contributors)
## ライセンス ## ライセンス
`AList` は AGPL-3.0 ライセンスの下でライセンスされたオープンソースソフトウェアです。 `OpenList`は AGPL-3.0 ライセンスの下で公開されているオープンソースソフトウェアです。
## 免責事項 ## 免責事項
- このプログラムはフリーでオープンソースのプロジェクトです。ネットワークディスク上でファイルを共有するように設計されており、golang のダウンロードや学習に便利です。利用にあたっては関連法規を遵守し、悪用しないようお願いします; - このプログラムはフリーでオープンソースのプロジェクトです。ネットワークディスク上でファイルを共有するように設計されており、golang のダウンロードや学習に便利です。利用にあたっては関連法規を遵守し、悪用しないようお願いします;
- このプログラムは、公式インターフェースの動作を破壊することなく、公式 sdk/インターフェースを呼び出すことで実装されています; - このプログラムは、公式インターフェースの動作を破壊することなく、公式 sdk/インターフェースを呼び出すことで実装されています;
- このプログラムは、302リダイレクト/トラフィック転送のみを行い、いかなるユーザーデータも傍受、保存、改ざんしません; - このプログラムは、302リダイレクト/トラフィック転送のみを行い、いかなるユーザーデータも傍受、保存、改ざんしません;
- このプログラムを使用する前に、アカウントの禁止、ダウンロード速度の制限など、対応するリスクを理解し、負担する必要があります; - このプログラムを使用する前に、アカウントの禁止、ダウンロード速度の制限など、対応するリスクを理解し、負担する必要があります;
- もし侵害があれば、[メール](mailto:i@nn.ci)で私に連絡してください - 権利侵害がある場合は、[OpenListTeam](https://github.com/OpenListTeam) までご連絡ください。チームが迅速に対応いたします
--- ---
> [@Blog](https://nn.ci/) · [@GitHub](https://github.com/alist-org) · [@TelegramGroup](https://t.me/alist_chat) · [@Discord](https://discord.gg/F4ymsH4xv2) > [@GitHub](https://github.com/OpenListTeam) · [Telegram Group](https://t.me/OpenListTeam)

159
build.sh
View File

@ -1,8 +1,16 @@
appName="alist" set -e
appName="openlist"
builtAt="$(date +'%F %T %z')" builtAt="$(date +'%F %T %z')"
gitAuthor="Xhofe <i@nn.ci>" gitAuthor="The OpenList Projects Contributors <noreply@openlist.team>"
gitCommit=$(git log --pretty=format:"%h" -1) gitCommit=$(git log --pretty=format:"%h" -1)
githubAuthHeader=""
githubAuthValue=""
if [ -n "$GITHUB_TOKEN" ]; then
githubAuthHeader="--header"
githubAuthValue="Authorization: Bearer $GITHUB_TOKEN"
fi
if [ "$1" = "dev" ]; then if [ "$1" = "dev" ]; then
version="dev" version="dev"
webVersion="dev" webVersion="dev"
@ -10,9 +18,10 @@ elif [ "$1" = "beta" ]; then
version="beta" version="beta"
webVersion="dev" webVersion="dev"
else else
git tag -d beta git tag -d beta || true
version=$(git describe --abbrev=0 --tags) # Always true if there's no tag
webVersion=$(wget -qO- -t1 -T2 "https://api.github.com/repos/alist-org/alist-web/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g') version=$(git describe --abbrev=0 --tags 2>/dev/null || echo "v0.0.0")
webVersion=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue "https://api.github.com/repos/OpenListTeam/OpenList-Frontend/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
fi fi
echo "backend version: $version" echo "backend version: $version"
@ -20,26 +29,36 @@ echo "frontend version: $webVersion"
ldflags="\ ldflags="\
-w -s \ -w -s \
-X 'github.com/alist-org/alist/v3/internal/conf.BuiltAt=$builtAt' \ -X 'github.com/OpenListTeam/OpenList/internal/conf.BuiltAt=$builtAt' \
-X 'github.com/alist-org/alist/v3/internal/conf.GitAuthor=$gitAuthor' \ -X 'github.com/OpenListTeam/OpenList/internal/conf.GitAuthor=$gitAuthor' \
-X 'github.com/alist-org/alist/v3/internal/conf.GitCommit=$gitCommit' \ -X 'github.com/OpenListTeam/OpenList/internal/conf.GitCommit=$gitCommit' \
-X 'github.com/alist-org/alist/v3/internal/conf.Version=$version' \ -X 'github.com/OpenListTeam/OpenList/internal/conf.Version=$version' \
-X 'github.com/alist-org/alist/v3/internal/conf.WebVersion=$webVersion' \ -X 'github.com/OpenListTeam/OpenList/internal/conf.WebVersion=$webVersion' \
" "
FetchWebDev() { FetchWebDev() {
curl -L https://codeload.github.com/alist-org/web-dist/tar.gz/refs/heads/dev -o web-dist-dev.tar.gz pre_release_tag=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue https://api.github.com/repos/OpenListTeam/OpenList-Frontend/releases | jq -r 'map(select(.prerelease)) | first | .tag_name')
tar -zxvf web-dist-dev.tar.gz if [ -z "$pre_release_tag" ] || [ "$pre_release_tag" == "null" ]; then
rm -rf public/dist # fall back to latest release
mv -f web-dist-dev/dist public pre_release_json=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/OpenListTeam/OpenList-Frontend/releases/latest")
rm -rf web-dist-dev web-dist-dev.tar.gz else
pre_release_json=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/OpenListTeam/OpenList-Frontend/releases/tags/$pre_release_tag")
fi
pre_release_assets=$(echo "$pre_release_json" | jq -r '.assets[].browser_download_url')
pre_release_tar_url=$(echo "$pre_release_assets" | grep "openlist-frontend-dist" | grep "\.tar\.gz$")
curl -fsSL "$pre_release_tar_url" -o web-dist-dev.tar.gz
rm -rf public/dist && mkdir -p public/dist
tar -zxvf web-dist-dev.tar.gz -C public/dist
rm -rf web-dist-dev.tar.gz
} }
FetchWebRelease() { FetchWebRelease() {
curl -L https://github.com/alist-org/alist-web/releases/latest/download/dist.tar.gz -o dist.tar.gz release_json=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/OpenListTeam/OpenList-Frontend/releases/latest")
tar -zxvf dist.tar.gz release_assets=$(echo "$release_json" | jq -r '.assets[].browser_download_url')
rm -rf public/dist release_tar_url=$(echo "$release_assets" | grep "openlist-frontend-dist" | grep "\.tar\.gz$")
mv -f dist public curl -fsSL "$release_tar_url" -o dist.tar.gz
rm -rf public/dist && mkdir -p public/dist
tar -zxvf dist.tar.gz -C public/dist
rm -rf dist.tar.gz rm -rf dist.tar.gz
} }
@ -59,11 +78,11 @@ BuildDev() {
rm -rf .git/ rm -rf .git/
mkdir -p "dist" mkdir -p "dist"
muslflags="--extldflags '-static -fpic' $ldflags" muslflags="--extldflags '-static -fpic' $ldflags"
BASE="https://musl.nn.ci/" BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross) FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross)
for i in "${FILES[@]}"; do for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz" url="${BASE}${i}.tgz"
curl -L -o "${i}.tgz" "${url}" curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
done done
OS_ARCHES=(linux-musl-amd64 linux-musl-arm64) OS_ARCHES=(linux-musl-amd64 linux-musl-arm64)
@ -79,26 +98,26 @@ BuildDev() {
go build -o ./dist/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter . go build -o ./dist/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
done done
xgo -targets=windows/amd64,darwin/amd64,darwin/arm64 -out "$appName" -ldflags="$ldflags" -tags=jsoniter . xgo -targets=windows/amd64,darwin/amd64,darwin/arm64 -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
mv alist-* dist mv "$appName"-* dist
cd dist cd dist
cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe cp ./"$appName"-windows-amd64.exe ./"$appName"-windows-amd64-upx.exe
upx -9 ./alist-windows-amd64-upx.exe upx -9 ./"$appName"-windows-amd64-upx.exe
find . -type f -print0 | xargs -0 md5sum >md5.txt find . -type f -print0 | xargs -0 md5sum >md5.txt
cat md5.txt cat md5.txt
} }
BuildDocker() { BuildDocker() {
go build -o ./bin/alist -ldflags="$ldflags" -tags=jsoniter . go build -o ./bin/"$appName" -ldflags="$ldflags" -tags=jsoniter .
} }
PrepareBuildDockerMusl() { PrepareBuildDockerMusl() {
mkdir -p build/musl-libs mkdir -p build/musl-libs
BASE="https://musl.cc/" BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross i486-linux-musl-cross s390x-linux-musl-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross riscv64-linux-musl-cross powerpc64le-linux-musl-cross) FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross i486-linux-musl-cross s390x-linux-musl-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross riscv64-linux-musl-cross powerpc64le-linux-musl-cross)
for i in "${FILES[@]}"; do for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz" url="${BASE}${i}.tgz"
lib_tgz="build/${i}.tgz" lib_tgz="build/${i}.tgz"
curl -L -o "${lib_tgz}" "${url}" curl -fsSL -o "${lib_tgz}" "${url}"
tar xf "${lib_tgz}" --strip-components 1 -C build/musl-libs tar xf "${lib_tgz}" --strip-components 1 -C build/musl-libs
rm -f "${lib_tgz}" rm -f "${lib_tgz}"
done done
@ -124,7 +143,7 @@ BuildDockerMultiplatform() {
export GOARCH=$arch export GOARCH=$arch
export CC=${cgo_cc} export CC=${cgo_cc}
echo "building for $os_arch" echo "building for $os_arch"
go build -o build/$os/$arch/alist -ldflags="$docker_lflags" -tags=jsoniter . go build -o build/$os/$arch/"$appName" -ldflags="$docker_lflags" -tags=jsoniter .
done done
DOCKER_ARM_ARCHES=(linux-arm/v6 linux-arm/v7) DOCKER_ARM_ARCHES=(linux-arm/v6 linux-arm/v7)
@ -138,36 +157,36 @@ BuildDockerMultiplatform() {
export GOARM=${GO_ARM[$i]} export GOARM=${GO_ARM[$i]}
export CC=${cgo_cc} export CC=${cgo_cc}
echo "building for $docker_arch" echo "building for $docker_arch"
go build -o build/${docker_arch%%-*}/${docker_arch##*-}/alist -ldflags="$docker_lflags" -tags=jsoniter . go build -o build/${docker_arch%%-*}/${docker_arch##*-}/"$appName" -ldflags="$docker_lflags" -tags=jsoniter .
done done
} }
BuildRelease() { BuildRelease() {
rm -rf .git/ rm -rf .git/
mkdir -p "build" mkdir -p "build"
BuildWinArm64 ./build/alist-windows-arm64.exe BuildWinArm64 ./build/"$appName"-windows-arm64.exe
xgo -out "$appName" -ldflags="$ldflags" -tags=jsoniter . xgo -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
# why? Because some target platforms seem to have issues with upx compression # why? Because some target platforms seem to have issues with upx compression
upx -9 ./alist-linux-amd64 upx -9 ./"$appName"-linux-amd64
cp ./alist-windows-amd64.exe ./alist-windows-amd64-upx.exe cp ./"$appName"-windows-amd64.exe ./"$appName"-windows-amd64-upx.exe
upx -9 ./alist-windows-amd64-upx.exe upx -9 ./"$appName"-windows-amd64-upx.exe
mv alist-* build mv "$appName"-* build
} }
BuildReleaseLinuxMusl() { BuildReleaseLinuxMusl() {
rm -rf .git/ rm -rf .git/
mkdir -p "build" mkdir -p "build"
muslflags="--extldflags '-static -fpic' $ldflags" muslflags="--extldflags '-static -fpic' $ldflags"
BASE="https://musl.nn.ci/" BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross mips-linux-musl-cross mips64-linux-musl-cross mips64el-linux-musl-cross mipsel-linux-musl-cross powerpc64le-linux-musl-cross s390x-linux-musl-cross) FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross mips-linux-musl-cross mips64-linux-musl-cross mips64el-linux-musl-cross mipsel-linux-musl-cross powerpc64le-linux-musl-cross s390x-linux-musl-cross loongarch64-linux-musl-cross)
for i in "${FILES[@]}"; do for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz" url="${BASE}${i}.tgz"
curl -L -o "${i}.tgz" "${url}" curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
rm -f "${i}.tgz" rm -f "${i}.tgz"
done done
OS_ARCHES=(linux-musl-amd64 linux-musl-arm64 linux-musl-mips linux-musl-mips64 linux-musl-mips64le linux-musl-mipsle linux-musl-ppc64le linux-musl-s390x) OS_ARCHES=(linux-musl-amd64 linux-musl-arm64 linux-musl-mips linux-musl-mips64 linux-musl-mips64le linux-musl-mipsle linux-musl-ppc64le linux-musl-s390x linux-musl-loong64)
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc mips-linux-musl-gcc mips64-linux-musl-gcc mips64el-linux-musl-gcc mipsel-linux-musl-gcc powerpc64le-linux-musl-gcc s390x-linux-musl-gcc) CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc mips-linux-musl-gcc mips64-linux-musl-gcc mips64el-linux-musl-gcc mipsel-linux-musl-gcc powerpc64le-linux-musl-gcc s390x-linux-musl-gcc loongarch64-linux-musl-gcc)
for i in "${!OS_ARCHES[@]}"; do for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]} os_arch=${OS_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]} cgo_cc=${CGO_ARGS[$i]}
@ -184,18 +203,14 @@ BuildReleaseLinuxMuslArm() {
rm -rf .git/ rm -rf .git/
mkdir -p "build" mkdir -p "build"
muslflags="--extldflags '-static -fpic' $ldflags" muslflags="--extldflags '-static -fpic' $ldflags"
BASE="https://musl.nn.ci/" BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
# FILES=(arm-linux-musleabi-cross arm-linux-musleabihf-cross armeb-linux-musleabi-cross armeb-linux-musleabihf-cross armel-linux-musleabi-cross armel-linux-musleabihf-cross armv5l-linux-musleabi-cross armv5l-linux-musleabihf-cross armv6-linux-musleabi-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross armv7m-linux-musleabi-cross armv7r-linux-musleabihf-cross)
FILES=(arm-linux-musleabi-cross arm-linux-musleabihf-cross armel-linux-musleabi-cross armel-linux-musleabihf-cross armv5l-linux-musleabi-cross armv5l-linux-musleabihf-cross armv6-linux-musleabi-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross armv7m-linux-musleabi-cross armv7r-linux-musleabihf-cross) FILES=(arm-linux-musleabi-cross arm-linux-musleabihf-cross armel-linux-musleabi-cross armel-linux-musleabihf-cross armv5l-linux-musleabi-cross armv5l-linux-musleabihf-cross armv6-linux-musleabi-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross armv7m-linux-musleabi-cross armv7r-linux-musleabihf-cross)
for i in "${FILES[@]}"; do for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz" url="${BASE}${i}.tgz"
curl -L -o "${i}.tgz" "${url}" curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
rm -f "${i}.tgz" rm -f "${i}.tgz"
done done
# OS_ARCHES=(linux-musleabi-arm linux-musleabihf-arm linux-musleabi-armeb linux-musleabihf-armeb linux-musleabi-armel linux-musleabihf-armel linux-musleabi-armv5l linux-musleabihf-armv5l linux-musleabi-armv6 linux-musleabihf-armv6 linux-musleabihf-armv7l linux-musleabi-armv7m linux-musleabihf-armv7r)
# CGO_ARGS=(arm-linux-musleabi-gcc arm-linux-musleabihf-gcc armeb-linux-musleabi-gcc armeb-linux-musleabihf-gcc armel-linux-musleabi-gcc armel-linux-musleabihf-gcc armv5l-linux-musleabi-gcc armv5l-linux-musleabihf-gcc armv6-linux-musleabi-gcc armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc armv7m-linux-musleabi-gcc armv7r-linux-musleabihf-gcc)
# GOARMS=('' '' '' '' '' '' '5' '5' '6' '6' '7' '7' '7')
OS_ARCHES=(linux-musleabi-arm linux-musleabihf-arm linux-musleabi-armel linux-musleabihf-armel linux-musleabi-armv5l linux-musleabihf-armv5l linux-musleabi-armv6 linux-musleabihf-armv6 linux-musleabihf-armv7l linux-musleabi-armv7m linux-musleabihf-armv7r) OS_ARCHES=(linux-musleabi-arm linux-musleabihf-arm linux-musleabi-armel linux-musleabihf-armel linux-musleabi-armv5l linux-musleabihf-armv5l linux-musleabi-armv6 linux-musleabihf-armv6 linux-musleabihf-armv7l linux-musleabi-armv7m linux-musleabihf-armv7r)
CGO_ARGS=(arm-linux-musleabi-gcc arm-linux-musleabihf-gcc armel-linux-musleabi-gcc armel-linux-musleabihf-gcc armv5l-linux-musleabi-gcc armv5l-linux-musleabihf-gcc armv6-linux-musleabi-gcc armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc armv7m-linux-musleabi-gcc armv7r-linux-musleabihf-gcc) CGO_ARGS=(arm-linux-musleabi-gcc arm-linux-musleabihf-gcc armel-linux-musleabi-gcc armel-linux-musleabihf-gcc armv5l-linux-musleabi-gcc armv5l-linux-musleabihf-gcc armv6-linux-musleabi-gcc armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc armv7m-linux-musleabi-gcc armv7r-linux-musleabihf-gcc)
GOARMS=('' '' '' '' '5' '5' '6' '6' '7' '7' '7') GOARMS=('' '' '' '' '5' '5' '6' '6' '7' '7' '7')
@ -237,15 +252,32 @@ BuildReleaseAndroid() {
BuildReleaseFreeBSD() { BuildReleaseFreeBSD() {
rm -rf .git/ rm -rf .git/
mkdir -p "build/freebsd" mkdir -p "build/freebsd"
# Get latest FreeBSD 14.x release version from GitHub
freebsd_version=$(curl -fsSL --max-time 2 $githubAuthHeader $githubAuthValue "https://api.github.com/repos/freebsd/freebsd-src/tags" | \
jq -r '.[].name' | \
grep '^release/14\.' | \
sort -V | \
tail -1 | \
sed 's/release\///' | \
sed 's/\.0$//')
if [ -z "$freebsd_version" ]; then
echo "Failed to get FreeBSD version, falling back to 14.3"
freebsd_version="14.3"
fi
echo "Using FreeBSD version: $freebsd_version"
OS_ARCHES=(amd64 arm64 i386) OS_ARCHES=(amd64 arm64 i386)
GO_ARCHES=(amd64 arm64 386) GO_ARCHES=(amd64 arm64 386)
CGO_ARGS=(x86_64-unknown-freebsd14.1 aarch64-unknown-freebsd14.1 i386-unknown-freebsd14.1) CGO_ARGS=(x86_64-unknown-freebsd${freebsd_version} aarch64-unknown-freebsd${freebsd_version} i386-unknown-freebsd${freebsd_version})
for i in "${!OS_ARCHES[@]}"; do for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]} os_arch=${OS_ARCHES[$i]}
cgo_cc="clang --target=${CGO_ARGS[$i]} --sysroot=/opt/freebsd/${os_arch}" cgo_cc="clang --target=${CGO_ARGS[$i]} --sysroot=/opt/freebsd/${os_arch}"
echo building for freebsd-${os_arch} echo building for freebsd-${os_arch}
sudo mkdir -p "/opt/freebsd/${os_arch}" sudo mkdir -p "/opt/freebsd/${os_arch}"
wget -q https://download.freebsd.org/releases/${os_arch}/14.1-RELEASE/base.txz wget -q https://download.freebsd.org/releases/${os_arch}/${freebsd_version}-RELEASE/base.txz
sudo tar -xf ./base.txz -C /opt/freebsd/${os_arch} sudo tar -xf ./base.txz -C /opt/freebsd/${os_arch}
rm base.txz rm base.txz
export GOOS=freebsd export GOOS=freebsd
@ -259,31 +291,34 @@ BuildReleaseFreeBSD() {
MakeRelease() { MakeRelease() {
cd build cd build
if [ -d compress ]; then
rm -rv compress
fi
mkdir compress mkdir compress
for i in $(find . -type f -name "$appName-linux-*"); do for i in $(find . -type f -name "$appName-linux-*"); do
cp "$i" alist cp "$i" "$appName"
tar -czvf compress/"$i".tar.gz alist tar -czvf compress/"$i".tar.gz "$appName"
rm -f alist rm -f "$appName"
done done
for i in $(find . -type f -name "$appName-android-*"); do for i in $(find . -type f -name "$appName-android-*"); do
cp "$i" alist cp "$i" "$appName"
tar -czvf compress/"$i".tar.gz alist tar -czvf compress/"$i".tar.gz "$appName"
rm -f alist rm -f "$appName"
done done
for i in $(find . -type f -name "$appName-darwin-*"); do for i in $(find . -type f -name "$appName-darwin-*"); do
cp "$i" alist cp "$i" "$appName"
tar -czvf compress/"$i".tar.gz alist tar -czvf compress/"$i".tar.gz "$appName"
rm -f alist rm -f "$appName"
done done
for i in $(find . -type f -name "$appName-freebsd-*"); do for i in $(find . -type f -name "$appName-freebsd-*"); do
cp "$i" alist cp "$i" "$appName"
tar -czvf compress/"$i".tar.gz alist tar -czvf compress/"$i".tar.gz "$appName"
rm -f alist rm -f "$appName"
done done
for i in $(find . -type f -name "$appName-windows-*"); do for i in $(find . -type f -name "$appName-windows-*"); do
cp "$i" alist.exe cp "$i" "$appName".exe
zip compress/$(echo $i | sed 's/\.[^.]*$//').zip alist.exe zip compress/$(echo $i | sed 's/\.[^.]*$//').zip "$appName".exe
rm -f alist.exe rm -f "$appName".exe
done done
cd compress cd compress
find . -type f -print0 | xargs -0 md5sum >"$1" find . -type f -print0 | xargs -0 md5sum >"$1"

View File

@ -4,11 +4,11 @@ Copyright © 2022 NAME HERE <EMAIL ADDRESS>
package cmd package cmd
import ( import (
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/internal/setting" "github.com/OpenListTeam/OpenList/internal/setting"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/pkg/utils/random" "github.com/OpenListTeam/OpenList/pkg/utils/random"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -26,8 +26,8 @@ var AdminCmd = &cobra.Command{
} else { } else {
utils.Log.Infof("Admin user's username: %s", admin.Username) utils.Log.Infof("Admin user's username: %s", admin.Username)
utils.Log.Infof("The password can only be output at the first startup, and then stored as a hash value, which cannot be reversed") utils.Log.Infof("The password can only be output at the first startup, and then stored as a hash value, which cannot be reversed")
utils.Log.Infof("You can reset the password with a random string by running [alist admin random]") utils.Log.Infof("You can reset the password with a random string by running [openlist admin random]")
utils.Log.Infof("You can also set a new password by running [alist admin set NEW_PASSWORD]") utils.Log.Infof("You can also set a new password by running [openlist admin set NEW_PASSWORD]")
} }
}, },
} }

View File

@ -4,8 +4,8 @@ Copyright © 2022 NAME HERE <EMAIL ADDRESS>
package cmd package cmd
import ( import (
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )

View File

@ -5,10 +5,10 @@ import (
"path/filepath" "path/filepath"
"strconv" "strconv"
"github.com/alist-org/alist/v3/internal/bootstrap" "github.com/OpenListTeam/OpenList/internal/bootstrap"
"github.com/alist-org/alist/v3/internal/bootstrap/data" "github.com/OpenListTeam/OpenList/internal/bootstrap/data"
"github.com/alist-org/alist/v3/internal/db" "github.com/OpenListTeam/OpenList/internal/db"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,15 +1,16 @@
package cmd package cmd
import ( import (
"os"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os"
) )
// KillCmd represents the kill command // KillCmd represents the kill command
var KillCmd = &cobra.Command{ var KillCmd = &cobra.Command{
Use: "kill", Use: "kill",
Short: "Force kill alist server process by daemon/pid file", Short: "Force kill openlist server process by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
kill() kill()
}, },
@ -18,7 +19,7 @@ var KillCmd = &cobra.Command{
func kill() { func kill() {
initDaemon() initDaemon()
if pid == -1 { if pid == -1 {
log.Info("Seems not have been started. Try use `alist start` to start server.") log.Info("Seems not have been started. Try use `openlist start` to start server.")
return return
} }
process, err := os.FindProcess(pid) process, err := os.FindProcess(pid)

View File

@ -11,12 +11,12 @@ import (
"reflect" "reflect"
"strings" "strings"
_ "github.com/alist-org/alist/v3/drivers" _ "github.com/OpenListTeam/OpenList/drivers"
"github.com/alist-org/alist/v3/internal/bootstrap" "github.com/OpenListTeam/OpenList/internal/bootstrap"
"github.com/alist-org/alist/v3/internal/bootstrap/data" "github.com/OpenListTeam/OpenList/internal/bootstrap/data"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -25,6 +25,8 @@ type KV[V any] map[string]V
type Drivers KV[KV[interface{}]] type Drivers KV[KV[interface{}]]
var frontendPath string
func firstUpper(s string) string { func firstUpper(s string) string {
if s == "" { if s == "" {
return "" return ""
@ -39,7 +41,7 @@ func convert(s string) string {
} }
func writeFile(name string, data interface{}) { func writeFile(name string, data interface{}) {
f, err := os.Open(fmt.Sprintf("../alist-web/src/lang/en/%s.json", name)) f, err := os.Open(fmt.Sprintf("%s/src/lang/en/%s.json", frontendPath, name))
if err != nil { if err != nil {
log.Errorf("failed to open %s.json: %+v", name, err) log.Errorf("failed to open %s.json: %+v", name, err)
return return
@ -138,6 +140,7 @@ var LangCmd = &cobra.Command{
Use: "lang", Use: "lang",
Short: "Generate language json file", Short: "Generate language json file",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
frontendPath, _ = cmd.Flags().GetString("frontend-path")
bootstrap.InitConfig() bootstrap.InitConfig()
err := os.MkdirAll("lang", 0777) err := os.MkdirAll("lang", 0777)
if err != nil { if err != nil {
@ -151,6 +154,9 @@ var LangCmd = &cobra.Command{
func init() { func init() {
RootCmd.AddCommand(LangCmd) RootCmd.AddCommand(LangCmd)
// Add frontend-path flag
LangCmd.Flags().String("frontend-path", "../OpenList-Frontend", "Path to the frontend project directory")
// Here you will define your flags and configuration settings. // Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command // Cobra supports Persistent Flags which will work for this command

View File

@ -10,7 +10,7 @@ import (
// RestartCmd represents the restart command // RestartCmd represents the restart command
var RestartCmd = &cobra.Command{ var RestartCmd = &cobra.Command{
Use: "restart", Use: "restart",
Short: "Restart alist server by daemon/pid file", Short: "Restart openlist server by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
stop() stop()
start() start()

View File

@ -4,19 +4,19 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/alist-org/alist/v3/cmd/flags" "github.com/OpenListTeam/OpenList/cmd/flags"
_ "github.com/alist-org/alist/v3/drivers" _ "github.com/OpenListTeam/OpenList/drivers"
_ "github.com/alist-org/alist/v3/internal/archive" _ "github.com/OpenListTeam/OpenList/internal/archive"
_ "github.com/alist-org/alist/v3/internal/offline_download" _ "github.com/OpenListTeam/OpenList/internal/offline_download"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var RootCmd = &cobra.Command{ var RootCmd = &cobra.Command{
Use: "alist", Use: "openlist",
Short: "A file list program that supports multiple storage.", Short: "A file list program that supports multiple storage.",
Long: `A file list program that supports multiple storage, Long: `A file list program that supports multiple storage,
built with love by Xhofe and friends in Go/Solid.js. built with love by Xhofe and friends in Go/Solid.js.
Complete documentation is available at https://alist.nn.ci/`, Complete documentation is available at https://docs.openlist.team/`,
} }
func Execute() { func Execute() {

View File

@ -13,14 +13,14 @@ import (
"syscall" "syscall"
"time" "time"
ftpserver "github.com/KirCute/ftpserverlib-pasvportmap" "github.com/OpenListTeam/OpenList/cmd/flags"
"github.com/KirCute/sftpd-alist" "github.com/OpenListTeam/OpenList/internal/bootstrap"
"github.com/alist-org/alist/v3/cmd/flags" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/bootstrap" "github.com/OpenListTeam/OpenList/internal/fs"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/internal/fs" "github.com/OpenListTeam/OpenList/server"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/sftpd-openlist"
"github.com/alist-org/alist/v3/server" ftpserver "github.com/fclairamb/ftpserverlib"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -236,8 +236,8 @@ func init() {
// serverCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") // serverCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
} }
// OutAlistInit 暴露用于外部启动server的函数 // OutOpenListInit 暴露用于外部启动server的函数
func OutAlistInit() { func OutOpenListInit() {
var ( var (
cmd *cobra.Command cmd *cobra.Command
args []string args []string

View File

@ -16,7 +16,7 @@ import (
// StartCmd represents the start command // StartCmd represents the start command
var StartCmd = &cobra.Command{ var StartCmd = &cobra.Command{
Use: "start", Use: "start",
Short: "Silent start alist server with `--force-bin-dir`", Short: "Silent start openlist server with `--force-bin-dir`",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
start() start()
}, },
@ -27,7 +27,7 @@ func start() {
if pid != -1 { if pid != -1 {
_, err := os.FindProcess(pid) _, err := os.FindProcess(pid)
if err == nil { if err == nil {
log.Info("alist already started, pid ", pid) log.Info("openlist already started, pid ", pid)
return return
} }
} }
@ -52,7 +52,7 @@ func start() {
log.Infof("success start pid: %d", cmd.Process.Pid) log.Infof("success start pid: %d", cmd.Process.Pid)
err = os.WriteFile(pidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0666) err = os.WriteFile(pidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0666)
if err != nil { if err != nil {
log.Warn("failed to record pid, you may not be able to stop the program with `./alist stop`") log.Warn("failed to record pid, you may not be able to stop the program with `./openlist stop`")
} }
} }

View File

@ -13,7 +13,7 @@ import (
// StopCmd represents the stop command // StopCmd represents the stop command
var StopCmd = &cobra.Command{ var StopCmd = &cobra.Command{
Use: "stop", Use: "stop",
Short: "Stop alist server by daemon/pid file", Short: "Stop openlist server by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
stop() stop()
}, },
@ -22,7 +22,7 @@ var StopCmd = &cobra.Command{
func stop() { func stop() {
initDaemon() initDaemon()
if pid == -1 { if pid == -1 {
log.Info("Seems not have been started. Try use `alist start` to start server.") log.Info("Seems not have been started. Try use `openlist start` to start server.")
return return
} }
process, err := os.FindProcess(pid) process, err := os.FindProcess(pid)

View File

@ -7,8 +7,8 @@ import (
"os" "os"
"strconv" "strconv"
"github.com/alist-org/alist/v3/internal/db" "github.com/OpenListTeam/OpenList/internal/db"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/charmbracelet/bubbles/table" "github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss"

View File

@ -5,10 +5,10 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/internal/setting" "github.com/OpenListTeam/OpenList/internal/setting"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
) )

View File

@ -8,14 +8,14 @@ import (
"os" "os"
"runtime" "runtime"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
// VersionCmd represents the version command // VersionCmd represents the version command
var VersionCmd = &cobra.Command{ var VersionCmd = &cobra.Command{
Use: "version", Use: "version",
Short: "Show current version of AList", Short: "Show current version of OpenList",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
goVersion := fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH) goVersion := fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH)

View File

@ -1,9 +1,9 @@
version: '3.3' version: '3.3'
services: services:
alist: openlist:
restart: always restart: always
volumes: volumes:
- '/etc/alist:/opt/alist/data' - '/etc/openlist:/opt/openlist/data'
ports: ports:
- '5244:5244' - '5244:5244'
- '5245:5245' - '5245:5245'
@ -12,5 +12,5 @@ services:
- PGID=0 - PGID=0
- UMASK=022 - UMASK=022
- TZ=UTC - TZ=UTC
container_name: alist container_name: openlist
image: 'xhofe/alist:latest' image: 'ghcr.io/openlistteam/openlist:latest'

View File

@ -1,8 +1,8 @@
package _115 package _115
import ( import (
"github.com/OpenListTeam/OpenList/drivers/base"
driver115 "github.com/SheltonZhu/115driver/pkg/driver" driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/drivers/base"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -5,11 +5,11 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/http_range"
"github.com/OpenListTeam/OpenList/pkg/utils"
driver115 "github.com/SheltonZhu/115driver/pkg/driver" driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/http_range"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/pkg/errors" "github.com/pkg/errors"
"golang.org/x/time/rate" "golang.org/x/time/rate"
) )

View File

@ -1,8 +1,8 @@
package _115 package _115
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -3,9 +3,9 @@ package _115
import ( import (
"time" "time"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/SheltonZhu/115driver/pkg/driver" "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils"
) )
var _ model.Obj = (*FileObj)(nil) var _ model.Obj = (*FileObj)(nil)

View File

@ -17,11 +17,11 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/http_range" "github.com/OpenListTeam/OpenList/pkg/http_range"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-oss-go-sdk/oss"
cipher "github.com/SheltonZhu/115driver/pkg/crypto/ec115" cipher "github.com/SheltonZhu/115driver/pkg/crypto/ec115"

View File

@ -9,12 +9,12 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/cmd/flags" "github.com/OpenListTeam/OpenList/cmd/flags"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
sdk "github.com/xhofe/115-sdk-go" sdk "github.com/xhofe/115-sdk-go"
"golang.org/x/time/rate" "golang.org/x/time/rate"
) )

View File

@ -1,19 +1,19 @@
package _115_open package _115_open
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {
// Usually one of two // Usually one of two
driver.RootID driver.RootID
// define other // define other
RefreshToken string `json:"refresh_token" required:"true"`
OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"` OrderBy string `json:"order_by" type:"select" options:"file_name,file_size,user_utime,file_type"`
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"` OrderDirection string `json:"order_direction" type:"select" options:"asc,desc"`
LimitRate float64 `json:"limit_rate" type:"float" default:"1" help:"limit all api request rate ([limit]r/1s)"` LimitRate float64 `json:"limit_rate,string" type:"float" default:"1" help:"limit all api request rate ([limit]r/1s)"`
AccessToken string AccessToken string `json:"access_token" required:"true"`
RefreshToken string `json:"refresh_token" required:"true"`
} }
var config = driver.Config{ var config = driver.Config{

View File

@ -3,8 +3,8 @@ package _115_open
import ( import (
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
sdk "github.com/xhofe/115-sdk-go" sdk "github.com/xhofe/115-sdk-go"
) )

View File

@ -6,9 +6,9 @@ import (
"io" "io"
"time" "time"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-oss-go-sdk/oss"
"github.com/avast/retry-go" "github.com/avast/retry-go"
sdk "github.com/xhofe/115-sdk-go" sdk "github.com/xhofe/115-sdk-go"

View File

@ -3,11 +3,11 @@ package _115_share
import ( import (
"context" "context"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/errs"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/utils"
driver115 "github.com/SheltonZhu/115driver/pkg/driver" driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils"
"golang.org/x/time/rate" "golang.org/x/time/rate"
) )

View File

@ -1,8 +1,8 @@
package _115_share package _115_share
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -5,9 +5,9 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/utils"
driver115 "github.com/SheltonZhu/115driver/pkg/driver" driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/pkg/errors" "github.com/pkg/errors"
) )

View File

@ -11,12 +11,12 @@ import (
"golang.org/x/time/rate" "golang.org/x/time/rate"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/stream" "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"

View File

@ -1,8 +1,8 @@
package _123 package _123
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -1,14 +1,15 @@
package _123 package _123
import ( import (
"github.com/alist-org/alist/v3/pkg/utils"
"net/url" "net/url"
"path" "path"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/OpenListTeam/OpenList/internal/model"
) )
type File struct { type File struct {

View File

@ -7,10 +7,10 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
) )

View File

@ -13,8 +13,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -163,7 +163,7 @@ func (d *Pan123) login() error {
SetHeaders(map[string]string{ SetHeaders(map[string]string{
"origin": "https://www.123pan.com", "origin": "https://www.123pan.com",
"referer": "https://www.123pan.com/", "referer": "https://www.123pan.com/",
"user-agent": "Dart/2.19(dart:io)-alist", "user-agent": "Dart/2.19(dart:io)-openlist",
"platform": "web", "platform": "web",
"app-version": "3", "app-version": "3",
//"user-agent": base.UserAgent, //"user-agent": base.UserAgent,
@ -202,7 +202,7 @@ do:
"origin": "https://www.123pan.com", "origin": "https://www.123pan.com",
"referer": "https://www.123pan.com/", "referer": "https://www.123pan.com/",
"authorization": "Bearer " + d.AccessToken, "authorization": "Bearer " + d.AccessToken,
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) alist-client", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) openlist-client",
"platform": "web", "platform": "web",
"app-version": "3", "app-version": "3",
//"user-agent": base.UserAgent, //"user-agent": base.UserAgent,

View File

@ -5,10 +5,10 @@ import (
stdpath "path" stdpath "path"
"time" "time"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
) )
type Pan123Link struct { type Pan123Link struct {

View File

@ -1,8 +1,8 @@
package _123Link package _123Link
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -3,8 +3,8 @@ package _123Link
import ( import (
"time" "time"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
) )
// Node is a node in the folder tree // Node is a node in the folder tree

129
drivers/123_open/driver.go Normal file
View File

@ -0,0 +1,129 @@
package _123_open
import (
"context"
"strconv"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/errs"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/internal/op"
"github.com/OpenListTeam/OpenList/internal/stream"
"github.com/OpenListTeam/OpenList/pkg/utils"
)
type Open123 struct {
model.Storage
Addition
}
func (d *Open123) Config() driver.Config {
return config
}
func (d *Open123) GetAddition() driver.Additional {
return &d.Addition
}
func (d *Open123) Init(ctx context.Context) error {
if d.UploadThread < 1 || d.UploadThread > 32 {
d.UploadThread = 3
}
return nil
}
func (d *Open123) Drop(ctx context.Context) error {
op.MustSaveDriverStorage(d)
return nil
}
func (d *Open123) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
fileLastId := int64(0)
parentFileId, err := strconv.ParseInt(dir.GetID(), 10, 64)
if err != nil {
return nil, err
}
res := make([]File, 0)
for fileLastId != -1 {
files, err := d.getFiles(parentFileId, 100, fileLastId)
if err != nil {
return nil, err
}
// 目前123panAPI请求trashed失效只能通过遍历过滤
for i := range files.Data.FileList {
if files.Data.FileList[i].Trashed == 0 {
res = append(res, files.Data.FileList[i])
}
}
fileLastId = files.Data.LastFileId
}
return utils.SliceConvert(res, func(src File) (model.Obj, error) {
return src, nil
})
}
func (d *Open123) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
fileId, _ := strconv.ParseInt(file.GetID(), 10, 64)
res, err := d.getDownloadInfo(fileId)
if err != nil {
return nil, err
}
link := model.Link{URL: res.Data.DownloadUrl}
return &link, nil
}
func (d *Open123) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
parentFileId, _ := strconv.ParseInt(parentDir.GetID(), 10, 64)
return d.mkdir(parentFileId, dirName)
}
func (d *Open123) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
toParentFileID, _ := strconv.ParseInt(dstDir.GetID(), 10, 64)
return d.move(srcObj.(File).FileId, toParentFileID)
}
func (d *Open123) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
fileId, _ := strconv.ParseInt(srcObj.GetID(), 10, 64)
return d.rename(fileId, newName)
}
func (d *Open123) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
return errs.NotSupport
}
func (d *Open123) Remove(ctx context.Context, obj model.Obj) error {
fileId, _ := strconv.ParseInt(obj.GetID(), 10, 64)
return d.trash(fileId)
}
func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file model.FileStreamer, up driver.UpdateProgress) error {
parentFileId, err := strconv.ParseInt(dstDir.GetID(), 10, 64)
etag := file.GetHash().GetHash(utils.MD5)
if len(etag) < utils.MD5.Width {
_, etag, err = stream.CacheFullInTempFileAndHash(file, utils.MD5)
if err != nil {
return err
}
}
createResp, err := d.create(parentFileId, file.GetName(), etag, file.GetSize(), 2, false)
if err != nil {
return err
}
if createResp.Data.Reuse {
return nil
}
up(10)
return d.Upload(ctx, file, createResp, up)
}
var _ driver.Driver = (*Open123)(nil)

39
drivers/123_open/meta.go Normal file
View File

@ -0,0 +1,39 @@
package _123_open
import (
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/op"
)
type Addition struct {
// refresh_token方式的AccessToken 【对个人开发者暂未开放】
RefreshToken string `json:"RefreshToken" required:"false"`
// 通过 https://www.123pan.com/developer 申请
ClientID string `json:"ClientID" required:"false"`
ClientSecret string `json:"ClientSecret" required:"false"`
// 直接写入AccessToken
AccessToken string `json:"AccessToken" required:"false"`
// 用户名+密码方式登录的AccessToken可以兼容
//Username string `json:"username" required:"false"`
//Password string `json:"password" required:"false"`
// 上传线程数
UploadThread int `json:"UploadThread" type:"number" default:"3" help:"the threads of upload"`
driver.RootID
}
var config = driver.Config{
Name: "123 Open",
DefaultRoot: "0",
LocalSort: true,
}
func init() {
op.RegisterDriver(func() driver.Driver {
return &Open123{}
})
}

205
drivers/123_open/types.go Normal file
View File

@ -0,0 +1,205 @@
package _123_open
import (
"strconv"
"time"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/utils"
)
type ApiInfo struct {
url string
qps int
token chan struct{}
}
func (a *ApiInfo) Require() {
if a.qps > 0 {
a.token <- struct{}{}
}
}
func (a *ApiInfo) Release() {
if a.qps > 0 {
time.AfterFunc(time.Second, func() {
<-a.token
})
}
}
func (a *ApiInfo) SetQPS(qps int) {
a.qps = qps
a.token = make(chan struct{}, qps)
}
func (a *ApiInfo) NowLen() int {
return len(a.token)
}
func InitApiInfo(url string, qps int) *ApiInfo {
return &ApiInfo{
url: url,
qps: qps,
token: make(chan struct{}, qps),
}
}
type File struct {
FileName string `json:"filename"`
Size int64 `json:"size"`
CreateAt string `json:"createAt"`
UpdateAt string `json:"updateAt"`
FileId int64 `json:"fileId"`
Type int `json:"type"`
Etag string `json:"etag"`
S3KeyFlag string `json:"s3KeyFlag"`
ParentFileId int `json:"parentFileId"`
Category int `json:"category"`
Status int `json:"status"`
Trashed int `json:"trashed"`
}
func (f File) GetHash() utils.HashInfo {
return utils.NewHashInfo(utils.MD5, f.Etag)
}
func (f File) GetPath() string {
return ""
}
func (f File) GetSize() int64 {
return f.Size
}
func (f File) GetName() string {
return f.FileName
}
func (f File) CreateTime() time.Time {
parsedTime, err := time.Parse("2006-01-02 15:04:05", f.CreateAt)
if err != nil {
return time.Now()
}
return parsedTime
}
func (f File) ModTime() time.Time {
parsedTime, err := time.Parse("2006-01-02 15:04:05", f.UpdateAt)
if err != nil {
return time.Now()
}
return parsedTime
}
func (f File) IsDir() bool {
return f.Type == 1
}
func (f File) GetID() string {
return strconv.FormatInt(f.FileId, 10)
}
var _ model.Obj = (*File)(nil)
type BaseResp struct {
Code int `json:"code"`
Message string `json:"message"`
XTraceID string `json:"x-traceID"`
}
type AccessTokenResp struct {
BaseResp
Data struct {
AccessToken string `json:"accessToken"`
ExpiredAt string `json:"expiredAt"`
} `json:"data"`
}
type RefreshTokenResp struct {
AccessToken string `json:"access_token"`
ExpiresIn int `json:"expires_in"`
RefreshToken string `json:"refresh_token"`
Scope string `json:"scope"`
TokenType string `json:"token_type"`
}
type UserInfoResp struct {
BaseResp
Data struct {
UID int64 `json:"uid"`
Username string `json:"username"`
DisplayName string `json:"displayName"`
HeadImage string `json:"headImage"`
Passport string `json:"passport"`
Mail string `json:"mail"`
SpaceUsed int64 `json:"spaceUsed"`
SpacePermanent int64 `json:"spacePermanent"`
SpaceTemp int64 `json:"spaceTemp"`
SpaceTempExpr string `json:"spaceTempExpr"`
Vip bool `json:"vip"`
DirectTraffic int64 `json:"directTraffic"`
IsHideUID bool `json:"isHideUID"`
} `json:"data"`
}
type FileListResp struct {
BaseResp
Data struct {
LastFileId int64 `json:"lastFileId"`
FileList []File `json:"fileList"`
} `json:"data"`
}
type DownloadInfoResp struct {
BaseResp
Data struct {
DownloadUrl string `json:"downloadUrl"`
} `json:"data"`
}
type UploadCreateResp struct {
BaseResp
Data struct {
FileID int64 `json:"fileID"`
PreuploadID string `json:"preuploadID"`
Reuse bool `json:"reuse"`
SliceSize int64 `json:"sliceSize"`
} `json:"data"`
}
type UploadUrlResp struct {
BaseResp
Data struct {
PresignedURL string `json:"presignedURL"`
}
}
type UploadCompleteResp struct {
BaseResp
Data struct {
Async bool `json:"async"`
Completed bool `json:"completed"`
FileID int64 `json:"fileID"`
} `json:"data"`
}
type UploadAsyncResp struct {
BaseResp
Data struct {
Completed bool `json:"completed"`
FileID int64 `json:"fileID"`
} `json:"data"`
}
type UploadResp struct {
BaseResp
Data struct {
AccessKeyId string `json:"AccessKeyId"`
Bucket string `json:"Bucket"`
Key string `json:"Key"`
SecretAccessKey string `json:"SecretAccessKey"`
SessionToken string `json:"SessionToken"`
FileId int64 `json:"FileId"`
Reuse bool `json:"Reuse"`
EndPoint string `json:"EndPoint"`
StorageNode string `json:"StorageNode"`
UploadId string `json:"UploadId"`
} `json:"data"`
}

151
drivers/123_open/upload.go Normal file
View File

@ -0,0 +1,151 @@
package _123_open
import (
"context"
"net/http"
"time"
"github.com/OpenListTeam/OpenList/drivers/base"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/errgroup"
"github.com/OpenListTeam/OpenList/pkg/http_range"
"github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/avast/retry-go"
"github.com/go-resty/resty/v2"
)
func (d *Open123) create(parentFileID int64, filename string, etag string, size int64, duplicate int, containDir bool) (*UploadCreateResp, error) {
var resp UploadCreateResp
_, err := d.Request(UploadCreate, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"parentFileId": parentFileID,
"filename": filename,
"etag": etag,
"size": size,
"duplicate": duplicate,
"containDir": containDir,
})
}, &resp)
if err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) url(preuploadID string, sliceNo int64) (string, error) {
// get upload url
var resp UploadUrlResp
_, err := d.Request(UploadUrl, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"preuploadId": preuploadID,
"sliceNo": sliceNo,
})
}, &resp)
if err != nil {
return "", err
}
return resp.Data.PresignedURL, nil
}
func (d *Open123) complete(preuploadID string) (*UploadCompleteResp, error) {
var resp UploadCompleteResp
_, err := d.Request(UploadComplete, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"preuploadID": preuploadID,
})
}, &resp)
if err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) async(preuploadID string) (*UploadAsyncResp, error) {
var resp UploadAsyncResp
_, err := d.Request(UploadAsync, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"preuploadID": preuploadID,
})
}, &resp)
if err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) Upload(ctx context.Context, file model.FileStreamer, createResp *UploadCreateResp, up driver.UpdateProgress) error {
size := file.GetSize()
chunkSize := createResp.Data.SliceSize
uploadNums := (size + chunkSize - 1) / chunkSize
threadG, uploadCtx := errgroup.NewGroupWithContext(ctx, d.UploadThread,
retry.Attempts(3),
retry.Delay(time.Second),
retry.DelayType(retry.BackOffDelay))
threadG.SetLimit(3)
for partIndex := int64(0); partIndex < uploadNums; partIndex++ {
if utils.IsCanceled(uploadCtx) {
return ctx.Err()
}
partIndex := partIndex
partNumber := partIndex + 1 // 分片号从1开始
offset := partIndex * chunkSize
size := min(chunkSize, size-offset)
limitedReader, err := file.RangeRead(http_range.Range{
Start: offset,
Length: size})
if err != nil {
return err
}
limitedReader = driver.NewLimitedUploadStream(ctx, limitedReader)
threadG.Go(func(ctx context.Context) error {
uploadPartUrl, err := d.url(createResp.Data.PreuploadID, partNumber)
if err != nil {
return err
}
req, err := http.NewRequestWithContext(ctx, "PUT", uploadPartUrl, limitedReader)
if err != nil {
return err
}
req = req.WithContext(ctx)
req.ContentLength = size
res, err := base.HttpClient.Do(req)
if err != nil {
return err
}
_ = res.Body.Close()
progress := 10.0 + 85.0*float64(threadG.Success())/float64(uploadNums)
up(progress)
return nil
})
}
if err := threadG.Wait(); err != nil {
return err
}
uploadCompleteResp, err := d.complete(createResp.Data.PreuploadID)
if err != nil {
return err
}
if uploadCompleteResp.Data.Async == false || uploadCompleteResp.Data.Completed {
return nil
}
for {
uploadAsyncResp, err := d.async(createResp.Data.PreuploadID)
if err != nil {
return err
}
if uploadAsyncResp.Data.Completed {
break
}
}
up(100)
return nil
}

217
drivers/123_open/util.go Normal file
View File

@ -0,0 +1,217 @@
package _123_open
import (
"encoding/json"
"errors"
"net/http"
"strconv"
"time"
"github.com/OpenListTeam/OpenList/drivers/base"
"github.com/OpenListTeam/OpenList/internal/op"
"github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus"
)
var ( //不同情况下获取的AccessTokenQPS限制不同 如下模块化易于拓展
Api = "https://open-api.123pan.com"
AccessToken = InitApiInfo(Api+"/api/v1/access_token", 1)
RefreshToken = InitApiInfo(Api+"/api/v1/oauth2/access_token", 1)
UserInfo = InitApiInfo(Api+"/api/v1/user/info", 1)
FileList = InitApiInfo(Api+"/api/v2/file/list", 4)
DownloadInfo = InitApiInfo(Api+"/api/v1/file/download_info", 0)
Mkdir = InitApiInfo(Api+"/upload/v1/file/mkdir", 2)
Move = InitApiInfo(Api+"/api/v1/file/move", 1)
Rename = InitApiInfo(Api+"/api/v1/file/name", 1)
Trash = InitApiInfo(Api+"/api/v1/file/trash", 2)
UploadCreate = InitApiInfo(Api+"/upload/v1/file/create", 2)
UploadUrl = InitApiInfo(Api+"/upload/v1/file/get_upload_url", 0)
UploadComplete = InitApiInfo(Api+"/upload/v1/file/upload_complete", 0)
UploadAsync = InitApiInfo(Api+"/upload/v1/file/upload_async_result", 1)
)
func (d *Open123) Request(apiInfo *ApiInfo, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
retryToken := true
for {
req := base.RestyClient.R()
req.SetHeaders(map[string]string{
"authorization": "Bearer " + d.AccessToken,
"platform": "open_platform",
"Content-Type": "application/json",
})
if callback != nil {
callback(req)
}
if resp != nil {
req.SetResult(resp)
}
log.Debugf("API: %s, QPS: %d, NowLen: %d", apiInfo.url, apiInfo.qps, apiInfo.NowLen())
apiInfo.Require()
defer apiInfo.Release()
res, err := req.Execute(method, apiInfo.url)
if err != nil {
return nil, err
}
body := res.Body()
// 解析为通用响应
var baseResp BaseResp
if err = json.Unmarshal(body, &baseResp); err != nil {
return nil, err
}
if baseResp.Code == 0 {
return body, nil
} else if baseResp.Code == 401 && retryToken {
retryToken = false
if err := d.flushAccessToken(); err != nil {
return nil, err
}
} else if baseResp.Code == 429 {
time.Sleep(500 * time.Millisecond)
log.Warningf("API: %s, QPS: %d, 请求太频繁对应API提示过多请减小QPS", apiInfo.url, apiInfo.qps)
} else {
return nil, errors.New(baseResp.Message)
}
}
}
func (d *Open123) flushAccessToken() error {
if d.Addition.ClientID != "" {
if d.Addition.ClientSecret != "" {
var resp AccessTokenResp
_, err := d.Request(AccessToken, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"clientID": d.ClientID,
"clientSecret": d.ClientSecret,
})
}, &resp)
if err != nil {
return err
}
d.AccessToken = resp.Data.AccessToken
op.MustSaveDriverStorage(d)
} else if d.Addition.RefreshToken != "" {
var resp RefreshTokenResp
_, err := d.Request(RefreshToken, http.MethodPost, func(req *resty.Request) {
req.SetQueryParam("client_id", d.ClientID)
req.SetQueryParam("grant_type", "refresh_token")
req.SetQueryParam("refresh_token", d.Addition.RefreshToken)
}, &resp)
if err != nil {
return err
}
d.AccessToken = resp.AccessToken
d.RefreshToken = resp.RefreshToken
op.MustSaveDriverStorage(d)
}
}
return nil
}
func (d *Open123) getUserInfo() (*UserInfoResp, error) {
var resp UserInfoResp
if _, err := d.Request(UserInfo, http.MethodGet, nil, &resp); err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) getFiles(parentFileId int64, limit int, lastFileId int64) (*FileListResp, error) {
var resp FileListResp
_, err := d.Request(FileList, http.MethodGet, func(req *resty.Request) {
req.SetQueryParams(
map[string]string{
"parentFileId": strconv.FormatInt(parentFileId, 10),
"limit": strconv.Itoa(limit),
"lastFileId": strconv.FormatInt(lastFileId, 10),
"trashed": "false",
"searchMode": "",
"searchData": "",
})
}, &resp)
if err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) getDownloadInfo(fileId int64) (*DownloadInfoResp, error) {
var resp DownloadInfoResp
_, err := d.Request(DownloadInfo, http.MethodGet, func(req *resty.Request) {
req.SetQueryParams(map[string]string{
"fileId": strconv.FormatInt(fileId, 10),
})
}, &resp)
if err != nil {
return nil, err
}
return &resp, nil
}
func (d *Open123) mkdir(parentID int64, name string) error {
_, err := d.Request(Mkdir, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"parentID": strconv.FormatInt(parentID, 10),
"name": name,
})
}, nil)
if err != nil {
return err
}
return nil
}
func (d *Open123) move(fileID, toParentFileID int64) error {
_, err := d.Request(Move, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": []int64{fileID},
"toParentFileID": toParentFileID,
})
}, nil)
if err != nil {
return err
}
return nil
}
func (d *Open123) rename(fileId int64, fileName string) error {
_, err := d.Request(Rename, http.MethodPut, func(req *resty.Request) {
req.SetBody(base.Json{
"fileId": fileId,
"fileName": fileName,
})
}, nil)
if err != nil {
return err
}
return nil
}
func (d *Open123) trash(fileId int64) error {
_, err := d.Request(Trash, http.MethodPost, func(req *resty.Request) {
req.SetBody(base.Json{
"fileIDs": []int64{fileId},
})
}, nil)
if err != nil {
return err
}
return nil
}

View File

@ -11,12 +11,12 @@ import (
"golang.org/x/time/rate" "golang.org/x/time/rate"
_123 "github.com/alist-org/alist/v3/drivers/123" _123 "github.com/OpenListTeam/OpenList/drivers/123"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,8 +1,8 @@
package _123Share package _123Share
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -1,14 +1,15 @@
package _123Share package _123Share
import ( import (
"github.com/alist-org/alist/v3/pkg/utils"
"net/url" "net/url"
"path" "path"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/OpenListTeam/OpenList/internal/model"
) )
type File struct { type File struct {

View File

@ -13,8 +13,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
) )
@ -61,7 +61,7 @@ func (d *Pan123Share) request(url string, method string, callback base.ReqCallba
"origin": "https://www.123pan.com", "origin": "https://www.123pan.com",
"referer": "https://www.123pan.com/", "referer": "https://www.123pan.com/",
"authorization": "Bearer " + d.AccessToken, "authorization": "Bearer " + d.AccessToken,
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) alist-client", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) opnelist-client",
"platform": "web", "platform": "web",
"app-version": "3", "app-version": "3",
//"user-agent": base.UserAgent, //"user-agent": base.UserAgent,

View File

@ -10,14 +10,14 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
streamPkg "github.com/alist-org/alist/v3/internal/stream" streamPkg "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/alist-org/alist/v3/pkg/cron" "github.com/OpenListTeam/OpenList/pkg/cron"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/pkg/utils/random" "github.com/OpenListTeam/OpenList/pkg/utils/random"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,8 +1,8 @@
package _139 package _139
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -12,11 +12,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/pkg/utils/random" "github.com/OpenListTeam/OpenList/pkg/utils/random"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"

View File

@ -5,10 +5,10 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -18,7 +18,7 @@ import (
"strconv" "strconv"
"strings" "strings"
myrand "github.com/alist-org/alist/v3/pkg/utils/random" myrand "github.com/OpenListTeam/OpenList/pkg/utils/random"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -4,7 +4,7 @@ import (
"errors" "errors"
"strconv" "strconv"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,8 +1,8 @@
package _189 package _189
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -15,11 +15,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
myrand "github.com/alist-org/alist/v3/pkg/utils/random" myrand "github.com/OpenListTeam/OpenList/pkg/utils/random"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"

View File

@ -8,11 +8,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
"github.com/google/uuid" "github.com/google/uuid"
) )

View File

@ -18,8 +18,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils/random" "github.com/OpenListTeam/OpenList/pkg/utils/random"
) )
func clientSuffix() map[string]string { func clientSuffix() map[string]string {

View File

@ -1,8 +1,8 @@
package _189pc package _189pc
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -7,7 +7,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
) )
// 居然有四种返回方式 // 居然有四种返回方式

View File

@ -18,18 +18,16 @@ import (
"strings" "strings"
"time" "time"
"golang.org/x/sync/semaphore" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/setting"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/alist-org/alist/v3/internal/setting" "github.com/OpenListTeam/OpenList/pkg/errgroup"
"github.com/alist-org/alist/v3/internal/stream" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/pkg/errgroup"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/avast/retry-go" "github.com/avast/retry-go"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
@ -506,7 +504,7 @@ func (y *Cloud189PC) StreamUpload(ctx context.Context, dstDir model.Obj, file mo
retry.Attempts(3), retry.Attempts(3),
retry.Delay(time.Second), retry.Delay(time.Second),
retry.DelayType(retry.BackOffDelay)) retry.DelayType(retry.BackOffDelay))
sem := semaphore.NewWeighted(3) threadG.SetLimit(3)
count := int(size / sliceSize) count := int(size / sliceSize)
lastPartSize := size % sliceSize lastPartSize := size % sliceSize
@ -531,7 +529,6 @@ func (y *Cloud189PC) StreamUpload(ctx context.Context, dstDir model.Obj, file mo
// 读取块 // 读取块
silceMd5.Reset() silceMd5.Reset()
if _, err := io.ReadFull(teeReader, byteData); err != io.EOF && err != nil { if _, err := io.ReadFull(teeReader, byteData); err != io.EOF && err != nil {
sem.Release(1)
return nil, err return nil, err
} }
@ -541,10 +538,6 @@ func (y *Cloud189PC) StreamUpload(ctx context.Context, dstDir model.Obj, file mo
partInfo := fmt.Sprintf("%d-%s", i, base64.StdEncoding.EncodeToString(md5Bytes)) partInfo := fmt.Sprintf("%d-%s", i, base64.StdEncoding.EncodeToString(md5Bytes))
threadG.Go(func(ctx context.Context) error { threadG.Go(func(ctx context.Context) error {
if err = sem.Acquire(ctx, 1); err != nil {
return err
}
defer sem.Release(1)
uploadUrls, err := y.GetMultiUploadUrls(ctx, isFamily, initMultiUpload.Data.UploadFileID, partInfo) uploadUrls, err := y.GetMultiUploadUrls(ctx, isFamily, initMultiUpload.Data.UploadFileID, partInfo)
if err != nil { if err != nil {
return err return err

View File

@ -3,14 +3,16 @@ package alias
import ( import (
"context" "context"
"errors" "errors"
"io"
stdpath "path" stdpath "path"
"strings" "strings"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/fs" "github.com/OpenListTeam/OpenList/internal/fs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/OpenListTeam/OpenList/pkg/utils"
) )
type Alias struct { type Alias struct {
@ -133,7 +135,10 @@ func (d *Alias) MakeDir(ctx context.Context, parentDir model.Obj, dirName string
} }
reqPath, err := d.getReqPath(ctx, parentDir, true) reqPath, err := d.getReqPath(ctx, parentDir, true)
if err == nil { if err == nil {
return fs.MakeDir(ctx, stdpath.Join(*reqPath, dirName)) for _, path := range reqPath {
err = errors.Join(err, fs.MakeDir(ctx, stdpath.Join(*path, dirName)))
}
return err
} }
if errs.IsNotImplement(err) { if errs.IsNotImplement(err) {
return errors.New("same-name dirs cannot make sub-dir") return errors.New("same-name dirs cannot make sub-dir")
@ -159,7 +164,14 @@ func (d *Alias) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
if err != nil { if err != nil {
return err return err
} }
return fs.Move(ctx, *srcPath, *dstPath) if len(srcPath) == len(dstPath) {
for i := range srcPath {
err = errors.Join(err, fs.Move(ctx, *srcPath[i], *dstPath[i]))
}
return err
} else {
return errors.New("parallel paths mismatch")
}
} }
func (d *Alias) Rename(ctx context.Context, srcObj model.Obj, newName string) error { func (d *Alias) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
@ -168,7 +180,10 @@ func (d *Alias) Rename(ctx context.Context, srcObj model.Obj, newName string) er
} }
reqPath, err := d.getReqPath(ctx, srcObj, false) reqPath, err := d.getReqPath(ctx, srcObj, false)
if err == nil { if err == nil {
return fs.Rename(ctx, *reqPath, newName) for _, path := range reqPath {
err = errors.Join(err, fs.Rename(ctx, *path, newName))
}
return err
} }
if errs.IsNotImplement(err) { if errs.IsNotImplement(err) {
return errors.New("same-name files cannot be Rename") return errors.New("same-name files cannot be Rename")
@ -194,8 +209,21 @@ func (d *Alias) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
if err != nil { if err != nil {
return err return err
} }
_, err = fs.Copy(ctx, *srcPath, *dstPath) if len(srcPath) == len(dstPath) {
for i := range srcPath {
_, e := fs.Copy(ctx, *srcPath[i], *dstPath[i])
err = errors.Join(err, e)
}
return err return err
} else if len(srcPath) == 1 || !d.ProtectSameName {
for _, path := range dstPath {
_, e := fs.Copy(ctx, *srcPath[0], *path)
err = errors.Join(err, e)
}
return err
} else {
return errors.New("parallel paths mismatch")
}
} }
func (d *Alias) Remove(ctx context.Context, obj model.Obj) error { func (d *Alias) Remove(ctx context.Context, obj model.Obj) error {
@ -204,7 +232,10 @@ func (d *Alias) Remove(ctx context.Context, obj model.Obj) error {
} }
reqPath, err := d.getReqPath(ctx, obj, false) reqPath, err := d.getReqPath(ctx, obj, false)
if err == nil { if err == nil {
return fs.Remove(ctx, *reqPath) for _, path := range reqPath {
err = errors.Join(err, fs.Remove(ctx, *path))
}
return err
} }
if errs.IsNotImplement(err) { if errs.IsNotImplement(err) {
return errors.New("same-name files cannot be Delete") return errors.New("same-name files cannot be Delete")
@ -218,7 +249,28 @@ func (d *Alias) Put(ctx context.Context, dstDir model.Obj, s model.FileStreamer,
} }
reqPath, err := d.getReqPath(ctx, dstDir, true) reqPath, err := d.getReqPath(ctx, dstDir, true)
if err == nil { if err == nil {
return fs.PutDirectly(ctx, *reqPath, s) if len(reqPath) == 1 {
return fs.PutDirectly(ctx, *reqPath[0], s)
} else {
defer s.Close()
file, err := s.CacheFullInTempFile()
if err != nil {
return err
}
for _, path := range reqPath {
err = errors.Join(err, fs.PutDirectly(ctx, *path, &stream.FileStream{
Obj: s,
Mimetype: s.GetMimetype(),
WebPutAsTask: s.NeedStore(),
Reader: file,
}))
_, e := file.Seek(0, io.SeekStart)
if e != nil {
return errors.Join(err, e)
}
}
return err
}
} }
if errs.IsNotImplement(err) { if errs.IsNotImplement(err) {
return errors.New("same-name dirs cannot be Put") return errors.New("same-name dirs cannot be Put")
@ -232,7 +284,10 @@ func (d *Alias) PutURL(ctx context.Context, dstDir model.Obj, name, url string)
} }
reqPath, err := d.getReqPath(ctx, dstDir, true) reqPath, err := d.getReqPath(ctx, dstDir, true)
if err == nil { if err == nil {
return fs.PutURL(ctx, *reqPath, name, url) for _, path := range reqPath {
err = errors.Join(err, fs.PutURL(ctx, *path, name, url))
}
return err
} }
if errs.IsNotImplement(err) { if errs.IsNotImplement(err) {
return errors.New("same-name files cannot offline download") return errors.New("same-name files cannot offline download")
@ -314,8 +369,21 @@ func (d *Alias) ArchiveDecompress(ctx context.Context, srcObj, dstDir model.Obj,
if err != nil { if err != nil {
return err return err
} }
_, err = fs.ArchiveDecompress(ctx, *srcPath, *dstPath, args) if len(srcPath) == len(dstPath) {
for i := range srcPath {
_, e := fs.ArchiveDecompress(ctx, *srcPath[i], *dstPath[i], args)
err = errors.Join(err, e)
}
return err return err
} else if len(srcPath) == 1 || !d.ProtectSameName {
for _, path := range dstPath {
_, e := fs.ArchiveDecompress(ctx, *srcPath[0], *path, args)
err = errors.Join(err, e)
}
return err
} else {
return errors.New("parallel paths mismatch")
}
} }
var _ driver.Driver = (*Alias)(nil) var _ driver.Driver = (*Alias)(nil)

View File

@ -1,8 +1,8 @@
package alias package alias
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {
@ -11,6 +11,7 @@ type Addition struct {
// define other // define other
Paths string `json:"paths" required:"true" type:"text"` Paths string `json:"paths" required:"true" type:"text"`
ProtectSameName bool `json:"protect_same_name" default:"true" required:"false" help:"Protects same-name files from Delete or Rename"` ProtectSameName bool `json:"protect_same_name" default:"true" required:"false" help:"Protects same-name files from Delete or Rename"`
ParallelWrite bool `json:"parallel_write" type:"bool" default:"false"`
DownloadConcurrency int `json:"download_concurrency" default:"0" required:"false" type:"number" help:"Need to enable proxy"` DownloadConcurrency int `json:"download_concurrency" default:"0" required:"false" type:"number" help:"Need to enable proxy"`
DownloadPartSize int `json:"download_part_size" default:"0" type:"number" required:"false" help:"Need to enable proxy. Unit: KB"` DownloadPartSize int `json:"download_part_size" default:"0" type:"number" required:"false" help:"Need to enable proxy. Unit: KB"`
Writable bool `json:"writable" type:"bool" default:"false"` Writable bool `json:"writable" type:"bool" default:"false"`

View File

@ -7,14 +7,14 @@ import (
stdpath "path" stdpath "path"
"strings" "strings"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/fs" "github.com/OpenListTeam/OpenList/internal/fs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/internal/sign" "github.com/OpenListTeam/OpenList/internal/sign"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/alist-org/alist/v3/server/common" "github.com/OpenListTeam/OpenList/server/common"
) )
func (d *Alias) listRoot() []model.Obj { func (d *Alias) listRoot() []model.Obj {
@ -127,33 +127,39 @@ func (d *Alias) link(ctx context.Context, dst, sub string, args model.LinkArgs)
return link, err return link, err
} }
func (d *Alias) getReqPath(ctx context.Context, obj model.Obj, isParent bool) (*string, error) { func (d *Alias) getReqPath(ctx context.Context, obj model.Obj, isParent bool) ([]*string, error) {
root, sub := d.getRootAndPath(obj.GetPath()) root, sub := d.getRootAndPath(obj.GetPath())
if sub == "" && !isParent { if sub == "" && !isParent {
return nil, errs.NotSupport return nil, errs.NotSupport
} }
dsts, ok := d.pathMap[root] dsts, ok := d.pathMap[root]
all := true
if !ok { if !ok {
return nil, errs.ObjectNotFound return nil, errs.ObjectNotFound
} }
var reqPath *string var reqPath []*string
for _, dst := range dsts { for _, dst := range dsts {
path := stdpath.Join(dst, sub) path := stdpath.Join(dst, sub)
_, err := fs.Get(ctx, path, &fs.GetArgs{NoLog: true}) _, err := fs.Get(ctx, path, &fs.GetArgs{NoLog: true})
if err != nil { if err != nil {
continue all = false
} if d.ProtectSameName && d.ParallelWrite && len(reqPath) >= 2 {
if !d.ProtectSameName {
return &path, nil
}
if ok {
ok = false
} else {
return nil, errs.NotImplement return nil, errs.NotImplement
} }
reqPath = &path continue
} }
if reqPath == nil { if !d.ProtectSameName && !d.ParallelWrite {
return []*string{&path}, nil
}
reqPath = append(reqPath, &path)
if d.ProtectSameName && !d.ParallelWrite && len(reqPath) >= 2 {
return nil, errs.NotImplement
}
if d.ProtectSameName && d.ParallelWrite && len(reqPath) >= 2 && !all {
return nil, errs.NotImplement
}
}
if len(reqPath) == 0 {
return nil, errs.ObjectNotFound return nil, errs.ObjectNotFound
} }
return reqPath, nil return reqPath, nil

View File

@ -1,118 +0,0 @@
package alist_v2
import (
"context"
"github.com/alist-org/alist/v3/drivers/base"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/server/common"
)
type AListV2 struct {
model.Storage
Addition
}
func (d *AListV2) Config() driver.Config {
return config
}
func (d *AListV2) GetAddition() driver.Additional {
return &d.Addition
}
func (d *AListV2) Init(ctx context.Context) error {
if len(d.Addition.Address) > 0 && string(d.Addition.Address[len(d.Addition.Address)-1]) == "/" {
d.Addition.Address = d.Addition.Address[0 : len(d.Addition.Address)-1]
}
// TODO login / refresh token
//op.MustSaveDriverStorage(d)
return nil
}
func (d *AListV2) Drop(ctx context.Context) error {
return nil
}
func (d *AListV2) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
url := d.Address + "/api/public/path"
var resp common.Resp[PathResp]
_, err := base.RestyClient.R().
SetResult(&resp).
SetHeader("Authorization", d.AccessToken).
SetBody(PathReq{
PageNum: 0,
PageSize: 0,
Path: dir.GetPath(),
Password: d.Password,
}).Post(url)
if err != nil {
return nil, err
}
var files []model.Obj
for _, f := range resp.Data.Files {
file := model.ObjThumb{
Object: model.Object{
Name: f.Name,
Modified: *f.UpdatedAt,
Size: f.Size,
IsFolder: f.Type == 1,
},
Thumbnail: model.Thumbnail{Thumbnail: f.Thumbnail},
}
files = append(files, &file)
}
return files, nil
}
func (d *AListV2) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
url := d.Address + "/api/public/path"
var resp common.Resp[PathResp]
_, err := base.RestyClient.R().
SetResult(&resp).
SetHeader("Authorization", d.AccessToken).
SetBody(PathReq{
PageNum: 0,
PageSize: 0,
Path: file.GetPath(),
Password: d.Password,
}).Post(url)
if err != nil {
return nil, err
}
return &model.Link{
URL: resp.Data.Files[0].Url,
}, nil
}
func (d *AListV2) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error {
return errs.NotImplement
}
func (d *AListV2) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
return errs.NotImplement
}
func (d *AListV2) Rename(ctx context.Context, srcObj model.Obj, newName string) error {
return errs.NotImplement
}
func (d *AListV2) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
return errs.NotImplement
}
func (d *AListV2) Remove(ctx context.Context, obj model.Obj) error {
return errs.NotImplement
}
func (d *AListV2) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) error {
return errs.NotImplement
}
//func (d *AList) Other(ctx context.Context, args model.OtherArgs) (interface{}, error) {
// return nil, errs.NotSupport
//}
var _ driver.Driver = (*AListV2)(nil)

View File

@ -1,26 +0,0 @@
package alist_v2
import (
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/op"
)
type Addition struct {
driver.RootPath
Address string `json:"url" required:"true"`
Password string `json:"password"`
AccessToken string `json:"access_token"`
}
var config = driver.Config{
Name: "AList V2",
LocalSort: true,
NoUpload: true,
DefaultRoot: "/",
}
func init() {
op.RegisterDriver(func() driver.Driver {
return &AListV2{}
})
}

View File

@ -1,31 +0,0 @@
package alist_v2
import (
"time"
)
type File struct {
Id string `json:"-"`
Name string `json:"name"`
Size int64 `json:"size"`
Type int `json:"type"`
Driver string `json:"driver"`
UpdatedAt *time.Time `json:"updated_at"`
Thumbnail string `json:"thumbnail"`
Url string `json:"url"`
SizeStr string `json:"size_str"`
TimeStr string `json:"time_str"`
}
type PathResp struct {
Type string `json:"type"`
//Meta Meta `json:"meta"`
Files []File `json:"files"`
}
type PathReq struct {
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
Password string `json:"password"`
Path string `json:"path"`
}

View File

@ -1 +0,0 @@
package alist_v2

View File

@ -14,14 +14,14 @@ import (
"os" "os"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/conf" "github.com/OpenListTeam/OpenList/internal/conf"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/errs" "github.com/OpenListTeam/OpenList/internal/errs"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/stream" "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/alist-org/alist/v3/pkg/cron" "github.com/OpenListTeam/OpenList/pkg/cron"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -3,7 +3,7 @@ package aliyundrive
import ( import (
"crypto/ecdsa" "crypto/ecdsa"
"github.com/alist-org/alist/v3/pkg/generic_sync" "github.com/OpenListTeam/OpenList/pkg/generic_sync"
) )
type State struct { type State struct {

View File

@ -1,8 +1,8 @@
package aliyundrive package aliyundrive
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -3,7 +3,7 @@ package aliyundrive
import ( import (
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
) )
type RespErr struct { type RespErr struct {

View File

@ -7,9 +7,9 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/dustinxie/ecc" "github.com/dustinxie/ecc"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
"github.com/google/uuid" "github.com/google/uuid"
@ -35,7 +35,7 @@ func (d *AliDrive) createSession() error {
"refreshToken": d.RefreshToken, "refreshToken": d.RefreshToken,
}) })
}, nil) }, nil)
if err == nil{ if err == nil {
state.retry = 0 state.retry = 0
} }
return err return err

View File

@ -8,12 +8,12 @@ import (
"path/filepath" "path/filepath"
"time" "time"
"github.com/OpenListTeam/OpenList/drivers/base"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/errs"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/Xhofe/rateg" "github.com/Xhofe/rateg"
"github.com/alist-org/alist/v3/drivers/base"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,8 +1,8 @@
package aliyundrive_open package aliyundrive_open
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {
@ -11,9 +11,10 @@ type Addition struct {
RefreshToken string `json:"refresh_token" required:"true"` RefreshToken string `json:"refresh_token" required:"true"`
OrderBy string `json:"order_by" type:"select" options:"name,size,updated_at,created_at"` OrderBy string `json:"order_by" type:"select" options:"name,size,updated_at,created_at"`
OrderDirection string `json:"order_direction" type:"select" options:"ASC,DESC"` OrderDirection string `json:"order_direction" type:"select" options:"ASC,DESC"`
OauthTokenURL string `json:"oauth_token_url" default:"https://api.nn.ci/alist/ali_open/token"` UseOnlineAPI bool `json:"use_online_api" default:"true"`
ClientID string `json:"client_id" required:"false" help:"Keep it empty if you don't have one"` APIAddress string `json:"api_url_address" default:"https://api.oplist.org/alicloud/renewapi"`
ClientSecret string `json:"client_secret" required:"false" help:"Keep it empty if you don't have one"` ClientID string `json:"client_id" help:"Keep it empty if you don't have one"`
ClientSecret string `json:"client_secret" help:"Keep it empty if you don't have one"`
RemoveWay string `json:"remove_way" required:"true" type:"select" options:"trash,delete"` RemoveWay string `json:"remove_way" required:"true" type:"select" options:"trash,delete"`
RapidUpload bool `json:"rapid_upload" help:"If you enable this option, the file will be uploaded to the server first, so the progress will be incorrect"` RapidUpload bool `json:"rapid_upload" help:"If you enable this option, the file will be uploaded to the server first, so the progress will be incorrect"`
InternalUpload bool `json:"internal_upload" help:"If you are using Aliyun ECS is located in Beijing, you can turn it on to boost the upload speed"` InternalUpload bool `json:"internal_upload" help:"If you are using Aliyun ECS is located in Beijing, you can turn it on to boost the upload speed"`

View File

@ -1,10 +1,11 @@
package aliyundrive_open package aliyundrive_open
import ( import (
"github.com/alist-org/alist/v3/pkg/utils"
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/OpenListTeam/OpenList/internal/model"
) )
type ErrResp struct { type ErrResp struct {

View File

@ -11,12 +11,12 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
streamPkg "github.com/alist-org/alist/v3/internal/stream" streamPkg "github.com/OpenListTeam/OpenList/internal/stream"
"github.com/alist-org/alist/v3/pkg/http_range" "github.com/OpenListTeam/OpenList/pkg/http_range"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/avast/retry-go" "github.com/avast/retry-go"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"

View File

@ -9,10 +9,10 @@ import (
"strings" "strings"
"time" "time"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
"github.com/alist-org/alist/v3/pkg/utils" "github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@ -20,10 +20,38 @@ import (
// do others that not defined in Driver interface // do others that not defined in Driver interface
func (d *AliyundriveOpen) _refreshToken() (string, string, error) { func (d *AliyundriveOpen) _refreshToken() (string, string, error) {
url := API_URL + "/oauth/access_token" if d.UseOnlineAPI && d.APIAddress != "" {
if d.OauthTokenURL != "" && d.ClientID == "" { u := d.APIAddress
url = d.OauthTokenURL var resp struct {
RefreshToken string `json:"refresh_token"`
AccessToken string `json:"access_token"`
ErrorMessage string `json:"text"`
} }
_, err := base.RestyClient.R().
SetResult(&resp).
SetQueryParams(map[string]string{
"refresh_ui": d.RefreshToken,
"server_use": "true",
"driver_txt": "alicloud_qr",
}).
Get(u)
if err != nil {
return "", "", err
}
if resp.RefreshToken == "" || resp.AccessToken == "" {
if resp.ErrorMessage != "" {
return "", "", fmt.Errorf("failed to refresh token: %s", resp.ErrorMessage)
}
return "", "", fmt.Errorf("empty token returned from official API")
}
return resp.RefreshToken, resp.AccessToken, nil
}
// 本地刷新逻辑,必须要求 client_id 和 client_secret
if d.ClientID == "" || d.ClientSecret == "" {
return "", "", fmt.Errorf("empty ClientID or ClientSecret")
}
url := API_URL + "/oauth/access_token"
//var resp base.TokenResp //var resp base.TokenResp
var e ErrResp var e ErrResp
res, err := base.RestyClient.R(). res, err := base.RestyClient.R().

View File

@ -6,13 +6,13 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/OpenListTeam/OpenList/drivers/base"
"github.com/OpenListTeam/OpenList/internal/driver"
"github.com/OpenListTeam/OpenList/internal/errs"
"github.com/OpenListTeam/OpenList/internal/model"
"github.com/OpenListTeam/OpenList/pkg/cron"
"github.com/OpenListTeam/OpenList/pkg/utils"
"github.com/Xhofe/rateg" "github.com/Xhofe/rateg"
"github.com/alist-org/alist/v3/drivers/base"
"github.com/alist-org/alist/v3/internal/driver"
"github.com/alist-org/alist/v3/internal/errs"
"github.com/alist-org/alist/v3/internal/model"
"github.com/alist-org/alist/v3/pkg/cron"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,8 +1,8 @@
package aliyundrive_share package aliyundrive_share
import ( import (
"github.com/alist-org/alist/v3/internal/driver" "github.com/OpenListTeam/OpenList/internal/driver"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
) )
type Addition struct { type Addition struct {

View File

@ -3,7 +3,7 @@ package aliyundrive_share
import ( import (
"time" "time"
"github.com/alist-org/alist/v3/internal/model" "github.com/OpenListTeam/OpenList/internal/model"
) )
type ErrorResp struct { type ErrorResp struct {

View File

@ -4,8 +4,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/alist-org/alist/v3/drivers/base" "github.com/OpenListTeam/OpenList/drivers/base"
"github.com/alist-org/alist/v3/internal/op" "github.com/OpenListTeam/OpenList/internal/op"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@ -1,76 +1,75 @@
package drivers package drivers
import ( import (
_ "github.com/alist-org/alist/v3/drivers/115" _ "github.com/OpenListTeam/OpenList/drivers/115"
_ "github.com/alist-org/alist/v3/drivers/115_open" _ "github.com/OpenListTeam/OpenList/drivers/115_open"
_ "github.com/alist-org/alist/v3/drivers/115_share" _ "github.com/OpenListTeam/OpenList/drivers/115_share"
_ "github.com/alist-org/alist/v3/drivers/123" _ "github.com/OpenListTeam/OpenList/drivers/123"
_ "github.com/alist-org/alist/v3/drivers/123_link" _ "github.com/OpenListTeam/OpenList/drivers/123_link"
_ "github.com/alist-org/alist/v3/drivers/123_share" _ "github.com/OpenListTeam/OpenList/drivers/123_open"
_ "github.com/alist-org/alist/v3/drivers/139" _ "github.com/OpenListTeam/OpenList/drivers/123_share"
_ "github.com/alist-org/alist/v3/drivers/189" _ "github.com/OpenListTeam/OpenList/drivers/139"
_ "github.com/alist-org/alist/v3/drivers/189pc" _ "github.com/OpenListTeam/OpenList/drivers/189"
_ "github.com/alist-org/alist/v3/drivers/alias" _ "github.com/OpenListTeam/OpenList/drivers/189pc"
_ "github.com/alist-org/alist/v3/drivers/alist_v2" _ "github.com/OpenListTeam/OpenList/drivers/alias"
_ "github.com/alist-org/alist/v3/drivers/alist_v3" _ "github.com/OpenListTeam/OpenList/drivers/aliyundrive"
_ "github.com/alist-org/alist/v3/drivers/aliyundrive" _ "github.com/OpenListTeam/OpenList/drivers/aliyundrive_open"
_ "github.com/alist-org/alist/v3/drivers/aliyundrive_open" _ "github.com/OpenListTeam/OpenList/drivers/aliyundrive_share"
_ "github.com/alist-org/alist/v3/drivers/aliyundrive_share" _ "github.com/OpenListTeam/OpenList/drivers/azure_blob"
_ "github.com/alist-org/alist/v3/drivers/azure_blob" _ "github.com/OpenListTeam/OpenList/drivers/baidu_netdisk"
_ "github.com/alist-org/alist/v3/drivers/baidu_netdisk" _ "github.com/OpenListTeam/OpenList/drivers/baidu_photo"
_ "github.com/alist-org/alist/v3/drivers/baidu_photo" _ "github.com/OpenListTeam/OpenList/drivers/baidu_share"
_ "github.com/alist-org/alist/v3/drivers/baidu_share" _ "github.com/OpenListTeam/OpenList/drivers/chaoxing"
_ "github.com/alist-org/alist/v3/drivers/chaoxing" _ "github.com/OpenListTeam/OpenList/drivers/cloudreve"
_ "github.com/alist-org/alist/v3/drivers/cloudreve" _ "github.com/OpenListTeam/OpenList/drivers/cloudreve_v4"
_ "github.com/alist-org/alist/v3/drivers/cloudreve_v4" _ "github.com/OpenListTeam/OpenList/drivers/crypt"
_ "github.com/alist-org/alist/v3/drivers/crypt" _ "github.com/OpenListTeam/OpenList/drivers/doubao"
_ "github.com/alist-org/alist/v3/drivers/doubao" _ "github.com/OpenListTeam/OpenList/drivers/doubao_share"
_ "github.com/alist-org/alist/v3/drivers/doubao_share" _ "github.com/OpenListTeam/OpenList/drivers/dropbox"
_ "github.com/alist-org/alist/v3/drivers/dropbox" _ "github.com/OpenListTeam/OpenList/drivers/febbox"
_ "github.com/alist-org/alist/v3/drivers/febbox" _ "github.com/OpenListTeam/OpenList/drivers/ftp"
_ "github.com/alist-org/alist/v3/drivers/ftp" _ "github.com/OpenListTeam/OpenList/drivers/github"
_ "github.com/alist-org/alist/v3/drivers/github" _ "github.com/OpenListTeam/OpenList/drivers/github_releases"
_ "github.com/alist-org/alist/v3/drivers/github_releases" _ "github.com/OpenListTeam/OpenList/drivers/google_drive"
_ "github.com/alist-org/alist/v3/drivers/google_drive" _ "github.com/OpenListTeam/OpenList/drivers/google_photo"
_ "github.com/alist-org/alist/v3/drivers/google_photo" _ "github.com/OpenListTeam/OpenList/drivers/halalcloud"
_ "github.com/alist-org/alist/v3/drivers/halalcloud" _ "github.com/OpenListTeam/OpenList/drivers/ilanzou"
_ "github.com/alist-org/alist/v3/drivers/ilanzou" _ "github.com/OpenListTeam/OpenList/drivers/ipfs_api"
_ "github.com/alist-org/alist/v3/drivers/ipfs_api" _ "github.com/OpenListTeam/OpenList/drivers/kodbox"
_ "github.com/alist-org/alist/v3/drivers/kodbox" _ "github.com/OpenListTeam/OpenList/drivers/lanzou"
_ "github.com/alist-org/alist/v3/drivers/lanzou" _ "github.com/OpenListTeam/OpenList/drivers/lenovonas_share"
_ "github.com/alist-org/alist/v3/drivers/lenovonas_share" _ "github.com/OpenListTeam/OpenList/drivers/local"
_ "github.com/alist-org/alist/v3/drivers/local" _ "github.com/OpenListTeam/OpenList/drivers/mediatrack"
_ "github.com/alist-org/alist/v3/drivers/mediatrack" _ "github.com/OpenListTeam/OpenList/drivers/mega"
_ "github.com/alist-org/alist/v3/drivers/mega" _ "github.com/OpenListTeam/OpenList/drivers/misskey"
_ "github.com/alist-org/alist/v3/drivers/misskey" _ "github.com/OpenListTeam/OpenList/drivers/mopan"
_ "github.com/alist-org/alist/v3/drivers/mopan" _ "github.com/OpenListTeam/OpenList/drivers/netease_music"
_ "github.com/alist-org/alist/v3/drivers/netease_music" _ "github.com/OpenListTeam/OpenList/drivers/onedrive"
_ "github.com/alist-org/alist/v3/drivers/onedrive" _ "github.com/OpenListTeam/OpenList/drivers/onedrive_app"
_ "github.com/alist-org/alist/v3/drivers/onedrive_app" _ "github.com/OpenListTeam/OpenList/drivers/onedrive_sharelink"
_ "github.com/alist-org/alist/v3/drivers/onedrive_sharelink" _ "github.com/OpenListTeam/OpenList/drivers/openlist"
_ "github.com/alist-org/alist/v3/drivers/pikpak" _ "github.com/OpenListTeam/OpenList/drivers/pikpak"
_ "github.com/alist-org/alist/v3/drivers/pikpak_share" _ "github.com/OpenListTeam/OpenList/drivers/pikpak_share"
_ "github.com/alist-org/alist/v3/drivers/quark_uc" _ "github.com/OpenListTeam/OpenList/drivers/quark_uc"
_ "github.com/alist-org/alist/v3/drivers/quark_uc_tv" _ "github.com/OpenListTeam/OpenList/drivers/quark_uc_tv"
_ "github.com/alist-org/alist/v3/drivers/quqi" _ "github.com/OpenListTeam/OpenList/drivers/quqi"
_ "github.com/alist-org/alist/v3/drivers/s3" _ "github.com/OpenListTeam/OpenList/drivers/s3"
_ "github.com/alist-org/alist/v3/drivers/seafile" _ "github.com/OpenListTeam/OpenList/drivers/seafile"
_ "github.com/alist-org/alist/v3/drivers/sftp" _ "github.com/OpenListTeam/OpenList/drivers/sftp"
_ "github.com/alist-org/alist/v3/drivers/smb" _ "github.com/OpenListTeam/OpenList/drivers/smb"
_ "github.com/alist-org/alist/v3/drivers/teambition" _ "github.com/OpenListTeam/OpenList/drivers/teambition"
_ "github.com/alist-org/alist/v3/drivers/terabox" _ "github.com/OpenListTeam/OpenList/drivers/terabox"
_ "github.com/alist-org/alist/v3/drivers/thunder" _ "github.com/OpenListTeam/OpenList/drivers/thunder"
_ "github.com/alist-org/alist/v3/drivers/thunder_browser" _ "github.com/OpenListTeam/OpenList/drivers/thunder_browser"
_ "github.com/alist-org/alist/v3/drivers/thunderx" _ "github.com/OpenListTeam/OpenList/drivers/thunderx"
_ "github.com/alist-org/alist/v3/drivers/trainbit" _ "github.com/OpenListTeam/OpenList/drivers/trainbit"
_ "github.com/alist-org/alist/v3/drivers/url_tree" _ "github.com/OpenListTeam/OpenList/drivers/url_tree"
_ "github.com/alist-org/alist/v3/drivers/uss" _ "github.com/OpenListTeam/OpenList/drivers/uss"
_ "github.com/alist-org/alist/v3/drivers/virtual" _ "github.com/OpenListTeam/OpenList/drivers/virtual"
_ "github.com/alist-org/alist/v3/drivers/vtencent" _ "github.com/OpenListTeam/OpenList/drivers/webdav"
_ "github.com/alist-org/alist/v3/drivers/webdav" _ "github.com/OpenListTeam/OpenList/drivers/weiyun"
_ "github.com/alist-org/alist/v3/drivers/weiyun" _ "github.com/OpenListTeam/OpenList/drivers/wopan"
_ "github.com/alist-org/alist/v3/drivers/wopan" _ "github.com/OpenListTeam/OpenList/drivers/yandex_disk"
_ "github.com/alist-org/alist/v3/drivers/yandex_disk"
) )
// All do nothing,just for import // All do nothing,just for import

Some files were not shown because too many files have changed in this diff Show More