Showing preview only (3,477K chars total). Download the full file or copy to clipboard to get everything.
Repository: OpenListTeam/OpenList
Branch: main
Commit: 9a2ba1dabe3a
Files: 744
Total size: 3.2 MB
Directory structure:
gitextract_q94m8ixv/
├── .air.toml
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 00-bug_report_zh.yml
│ │ ├── 01-bug_report_en.yml
│ │ ├── 02-feature_request_zh.yml
│ │ ├── 03-feature_request_en.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── beta_release.yml
│ ├── build.yml
│ ├── changelog.yml
│ ├── issue_pr_comment.yml
│ ├── release.yml
│ ├── release_docker.yml
│ ├── sync_repo.yml
│ ├── test_docker.yml
│ └── trigger-makefile-update.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.ci
├── LICENSE
├── README.md
├── README_cn.md
├── README_ja.md
├── README_nl.md
├── SECURITY.md
├── build.sh
├── cmd/
│ ├── admin.go
│ ├── cancel2FA.go
│ ├── common.go
│ ├── crypt.go
│ ├── flags/
│ │ └── config.go
│ ├── kill.go
│ ├── lang.go
│ ├── restart.go
│ ├── root.go
│ ├── server.go
│ ├── start.go
│ ├── stop_default.go
│ ├── stop_windows.go
│ ├── storage.go
│ ├── user.go
│ └── version.go
├── docker-compose.yml
├── drivers/
│ ├── 115/
│ │ ├── appver.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 115_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 115_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── utils.go
│ ├── 123/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 123_link/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── parse.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 123_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── token.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 123_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 139/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 189/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── login.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 189_tv/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── 189pc/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── alias/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── alist_v3/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── aliyundrive/
│ │ ├── driver.go
│ │ ├── global.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── aliyundrive_open/
│ │ ├── driver.go
│ │ ├── limiter.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── aliyundrive_share/
│ │ ├── driver.go
│ │ ├── limiter.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── all.go
│ ├── autoindex/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── util.go
│ │ └── util_test.go
│ ├── azure_blob/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── baidu_netdisk/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── baidu_photo/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── base/
│ │ ├── client.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── chaoxing/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── chunk/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── obj.go
│ ├── cloudreve/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── cloudreve_v4/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── cnb_releases/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── crypt/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── degoo/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── doubao/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── doubao_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── dropbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── febbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── oauth2.go
│ │ ├── types.go
│ │ └── util.go
│ ├── ftp/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── github/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── github_releases/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── models.go
│ │ ├── types.go
│ │ └── util.go
│ ├── google_drive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── google_photo/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── halalcloud/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── options.go
│ │ ├── types.go
│ │ └── util.go
│ ├── halalcloud_open/
│ │ ├── common.go
│ │ ├── driver.go
│ │ ├── driver_curd_impl.go
│ │ ├── driver_get_link.go
│ │ ├── driver_init.go
│ │ ├── driver_interface.go
│ │ ├── halalcloud_upload.go
│ │ ├── meta.go
│ │ ├── obj_file.go
│ │ └── utils.go
│ ├── ilanzou/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── ipfs_api/
│ │ ├── driver.go
│ │ └── meta.go
│ ├── kodbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── lanzou/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── lenovonas_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── local/
│ │ ├── benchmark_calculatedirsize_test.go
│ │ ├── copy_namedpipes.go
│ │ ├── copy_namedpipes_x.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── token_bucket.go
│ │ ├── util.go
│ │ ├── util_unix.go
│ │ └── util_windows.go
│ ├── mediafire/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mediatrack/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mega/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── misskey/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mopan/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── netease_music/
│ │ ├── crypto.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── onedrive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── onedrive_app/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── onedrive_sharelink/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── openlist/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── openlist_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── pikpak/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── pikpak_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── proton_drive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_uc/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_uc_tv/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── s3/
│ │ ├── doge.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── seafile/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── sftp/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── smb/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── strm/
│ │ ├── driver.go
│ │ ├── hook.go
│ │ ├── meta.go
│ │ └── util.go
│ ├── teambition/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── teldrive/
│ │ ├── copy.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── template/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── terabox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunder/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunder_browser/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunderx/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── url_tree/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── urls_test.go
│ │ └── util.go
│ ├── uss/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── virtual/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── util.go
│ ├── webdav/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── odrvcookie/
│ │ │ ├── cookie.go
│ │ │ └── fetch.go
│ │ ├── types.go
│ │ └── util.go
│ ├── weiyun/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── types.go
│ ├── wopan/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── wps/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ └── yandex_disk/
│ ├── driver.go
│ ├── meta.go
│ ├── types.go
│ └── util.go
├── entrypoint.sh
├── go.mod
├── go.sum
├── internal/
│ ├── archive/
│ │ ├── all.go
│ │ ├── archives/
│ │ │ ├── archives.go
│ │ │ └── utils.go
│ │ ├── iso9660/
│ │ │ ├── iso9660.go
│ │ │ └── utils.go
│ │ ├── rardecode/
│ │ │ ├── rardecode.go
│ │ │ └── utils.go
│ │ ├── sevenzip/
│ │ │ ├── sevenzip.go
│ │ │ └── utils.go
│ │ ├── tool/
│ │ │ ├── base.go
│ │ │ ├── helper.go
│ │ │ └── utils.go
│ │ └── zip/
│ │ ├── utils.go
│ │ └── zip.go
│ ├── authn/
│ │ └── authn.go
│ ├── bootstrap/
│ │ ├── config.go
│ │ ├── data/
│ │ │ ├── data.go
│ │ │ ├── dev.go
│ │ │ ├── setting.go
│ │ │ ├── task.go
│ │ │ └── user.go
│ │ ├── db.go
│ │ ├── index.go
│ │ ├── log.go
│ │ ├── offline_download.go
│ │ ├── patch/
│ │ │ ├── all.go
│ │ │ ├── v3_24_0/
│ │ │ │ └── hash_password.go
│ │ │ ├── v3_32_0/
│ │ │ │ └── update_authn.go
│ │ │ ├── v3_41_0/
│ │ │ │ └── grant_permission.go
│ │ │ ├── v4_1_8/
│ │ │ │ └── alias.go
│ │ │ └── v4_1_9/
│ │ │ ├── skip_tls.go
│ │ │ └── webdav.go
│ │ ├── patch.go
│ │ ├── run.go
│ │ ├── storage.go
│ │ ├── stream_limit.go
│ │ └── task.go
│ ├── cache/
│ │ ├── keyed_cache.go
│ │ ├── type.go
│ │ ├── typed_cache.go
│ │ └── utils.go
│ ├── conf/
│ │ ├── config.go
│ │ ├── const.go
│ │ └── var.go
│ ├── db/
│ │ ├── db.go
│ │ ├── meta.go
│ │ ├── searchnode.go
│ │ ├── settingitem.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── tasks.go
│ │ ├── user.go
│ │ └── util.go
│ ├── driver/
│ │ ├── config.go
│ │ ├── driver.go
│ │ ├── item.go
│ │ └── utils.go
│ ├── errs/
│ │ ├── driver.go
│ │ ├── errors.go
│ │ ├── errors_test.go
│ │ ├── object.go
│ │ ├── operate.go
│ │ ├── search.go
│ │ ├── unwrap.go
│ │ └── user.go
│ ├── fs/
│ │ ├── archive.go
│ │ ├── copy_move.go
│ │ ├── fs.go
│ │ ├── get.go
│ │ ├── link.go
│ │ ├── list.go
│ │ ├── other.go
│ │ ├── put.go
│ │ └── walk.go
│ ├── fuse/
│ │ ├── fs.go
│ │ └── mount.go
│ ├── message/
│ │ ├── http.go
│ │ ├── message.go
│ │ └── ws.go
│ ├── model/
│ │ ├── archive.go
│ │ ├── args.go
│ │ ├── direct_upload.go
│ │ ├── file.go
│ │ ├── meta.go
│ │ ├── obj.go
│ │ ├── object.go
│ │ ├── req.go
│ │ ├── search.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── task.go
│ │ └── user.go
│ ├── net/
│ │ ├── oss.go
│ │ ├── oss_test.go
│ │ ├── request.go
│ │ ├── request_test.go
│ │ ├── serve.go
│ │ └── util.go
│ ├── offline_download/
│ │ ├── 115/
│ │ │ └── client.go
│ │ ├── 115_open/
│ │ │ └── client.go
│ │ ├── 123/
│ │ │ └── client.go
│ │ ├── 123_open/
│ │ │ └── client.go
│ │ ├── all.go
│ │ ├── aria2/
│ │ │ ├── aria2.go
│ │ │ └── notify.go
│ │ ├── http/
│ │ │ ├── client.go
│ │ │ └── util.go
│ │ ├── pikpak/
│ │ │ ├── pikpak.go
│ │ │ └── util.go
│ │ ├── qbit/
│ │ │ └── qbit.go
│ │ ├── thunder/
│ │ │ ├── thunder.go
│ │ │ └── util.go
│ │ ├── thunder_browser/
│ │ │ ├── thunder_browser.go
│ │ │ └── util.go
│ │ ├── thunderx/
│ │ │ ├── thunderx.go
│ │ │ └── utils.go
│ │ ├── tool/
│ │ │ ├── add.go
│ │ │ ├── base.go
│ │ │ ├── download.go
│ │ │ ├── tools.go
│ │ │ └── transfer.go
│ │ └── transmission/
│ │ └── client.go
│ ├── op/
│ │ ├── archive.go
│ │ ├── cache.go
│ │ ├── const.go
│ │ ├── driver.go
│ │ ├── driver_test.go
│ │ ├── fs.go
│ │ ├── hook.go
│ │ ├── meta.go
│ │ ├── path.go
│ │ ├── recursive_list.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── storage_test.go
│ │ └── user.go
│ ├── search/
│ │ ├── bleve/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── build.go
│ │ ├── db/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── db_non_full_text/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── import.go
│ │ ├── meilisearch/
│ │ │ ├── init.go
│ │ │ ├── search.go
│ │ │ ├── task_queue.go
│ │ │ └── utils.go
│ │ ├── search.go
│ │ ├── searcher/
│ │ │ ├── manage.go
│ │ │ └── searcher.go
│ │ └── util.go
│ ├── setting/
│ │ └── setting.go
│ ├── sharing/
│ │ ├── archive.go
│ │ ├── get.go
│ │ ├── link.go
│ │ ├── list.go
│ │ └── sharing.go
│ ├── sign/
│ │ ├── archive.go
│ │ └── sign.go
│ ├── stream/
│ │ ├── limit.go
│ │ ├── stream.go
│ │ ├── stream_test.go
│ │ └── util.go
│ ├── task/
│ │ ├── base.go
│ │ └── manager.go
│ └── task_group/
│ ├── group.go
│ └── transfer.go
├── main.go
├── pkg/
│ ├── aria2/
│ │ └── rpc/
│ │ ├── README.md
│ │ ├── call.go
│ │ ├── call_test.go
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── const.go
│ │ ├── json2.go
│ │ ├── notification.go
│ │ ├── proc.go
│ │ ├── proto.go
│ │ └── resp.go
│ ├── buffer/
│ │ ├── bytes.go
│ │ ├── bytes_test.go
│ │ └── file.go
│ ├── chanio/
│ │ └── chanio.go
│ ├── cookie/
│ │ └── cookie.go
│ ├── cron/
│ │ ├── cron.go
│ │ └── cron_test.go
│ ├── errgroup/
│ │ └── errgroup.go
│ ├── generic/
│ │ └── queue.go
│ ├── generic_sync/
│ │ ├── map.go
│ │ └── map_test.go
│ ├── http_range/
│ │ └── range.go
│ ├── mq/
│ │ └── mq.go
│ ├── pool/
│ │ └── pool.go
│ ├── qbittorrent/
│ │ └── client.go
│ ├── sign/
│ │ ├── hmac.go
│ │ └── sign.go
│ ├── singleflight/
│ │ ├── signleflight_test.go
│ │ ├── singleflight.go
│ │ └── var.go
│ ├── task/
│ │ ├── errors.go
│ │ ├── manager.go
│ │ ├── task.go
│ │ └── task_test.go
│ └── utils/
│ ├── balance.go
│ ├── bool.go
│ ├── ctx.go
│ ├── email.go
│ ├── file.go
│ ├── file_test.go
│ ├── hash/
│ │ └── gcid.go
│ ├── hash.go
│ ├── hash_test.go
│ ├── html.go
│ ├── http.go
│ ├── io.go
│ ├── ip.go
│ ├── json.go
│ ├── log.go
│ ├── map.go
│ ├── oauth2.go
│ ├── path.go
│ ├── path_test.go
│ ├── random/
│ │ └── random.go
│ ├── slice.go
│ ├── str.go
│ ├── time.go
│ └── url.go
├── public/
│ └── public.go
├── server/
│ ├── common/
│ │ ├── auth.go
│ │ ├── base.go
│ │ ├── check.go
│ │ ├── check_test.go
│ │ ├── common.go
│ │ ├── hide_privacy_test.go
│ │ ├── ldap.go
│ │ ├── proxy.go
│ │ ├── resp.go
│ │ └── sign.go
│ ├── debug.go
│ ├── ftp/
│ │ ├── afero.go
│ │ ├── fsmanage.go
│ │ ├── fsread.go
│ │ ├── fsup.go
│ │ ├── site.go
│ │ └── upload_stage.go
│ ├── ftp.go
│ ├── handles/
│ │ ├── archive.go
│ │ ├── auth.go
│ │ ├── const.go
│ │ ├── direct_upload.go
│ │ ├── down.go
│ │ ├── driver.go
│ │ ├── fsbatch.go
│ │ ├── fsmanage.go
│ │ ├── fsread.go
│ │ ├── fsup.go
│ │ ├── helper.go
│ │ ├── index.go
│ │ ├── ldap_login.go
│ │ ├── meta.go
│ │ ├── offline_download.go
│ │ ├── scan.go
│ │ ├── search.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── ssologin.go
│ │ ├── storage.go
│ │ ├── task.go
│ │ ├── user.go
│ │ └── webauthn.go
│ ├── middlewares/
│ │ ├── auth.go
│ │ ├── check.go
│ │ ├── down.go
│ │ ├── filtered_logger.go
│ │ ├── fsup.go
│ │ ├── https.go
│ │ ├── limit.go
│ │ ├── search.go
│ │ └── sharing.go
│ ├── router.go
│ ├── s3/
│ │ ├── backend.go
│ │ ├── ioutils.go
│ │ ├── list.go
│ │ ├── logger.go
│ │ ├── pager.go
│ │ ├── server.go
│ │ └── utils.go
│ ├── s3.go
│ ├── sftp/
│ │ ├── const.go
│ │ ├── hostkey.go
│ │ └── sftp.go
│ ├── sftp.go
│ ├── static/
│ │ ├── config.go
│ │ └── static.go
│ ├── utils.go
│ ├── webdav/
│ │ ├── buffered_response_writer.go
│ │ ├── file.go
│ │ ├── if.go
│ │ ├── internal/
│ │ │ └── xml/
│ │ │ ├── README
│ │ │ ├── atom_test.go
│ │ │ ├── example_test.go
│ │ │ ├── marshal.go
│ │ │ ├── marshal_test.go
│ │ │ ├── read.go
│ │ │ ├── read_test.go
│ │ │ ├── typeinfo.go
│ │ │ ├── xml.go
│ │ │ └── xml_test.go
│ │ ├── litmus_test_server.go
│ │ ├── lock.go
│ │ ├── lock_test.go
│ │ ├── prop.go
│ │ ├── util.go
│ │ ├── webdav.go
│ │ ├── xml.go
│ │ └── xml_test.go
│ └── webdav.go
└── wrapper/
├── zcc-arm64
├── zcc-win7
├── zcc-win7-386
├── zcxx-arm64
├── zcxx-win7
└── zcxx-win7-386
================================================
FILE CONTENTS
================================================
================================================
FILE: .air.toml
================================================
root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"
[build]
args_bin = ["server"]
bin = "./tmp/main"
cmd = "go build -o ./tmp/main ."
delay = 0
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
exclude_file = []
exclude_regex = ["_test.go"]
exclude_unchanged = false
follow_symlink = false
full_bin = ""
include_dir = []
include_ext = ["go", "tpl", "tmpl", "html"]
include_file = []
kill_delay = "0s"
log = "build-errors.log"
poll = false
poll_interval = 0
rerun = false
rerun_delay = 500
send_interrupt = false
stop_on_error = false
[color]
app = ""
build = "yellow"
main = "magenta"
runner = "green"
watcher = "cyan"
[log]
main_only = false
time = false
[misc]
clean_on_exit = false
[screen]
clear_on_rebuild = false
keep_scroll = true
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
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
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: []
================================================
FILE: .github/ISSUE_TEMPLATE/00-bug_report_zh.yml
================================================
name: "错误报告"
description: 错误报告 / 问题
title: "[BUG] 请修改标题为您遇到的问题"
labels: [bug]
body:
- type: markdown
attributes:
value: |
感谢您花时间填写此错误报告。
请**务必**确认您的问题无重复,且不是因为您的操作、网络或第三方软件问题。
- type: checkboxes
attributes:
label: 请确认以下事项
description: |
您必须阅读、检查、确认、同意以下内容,否则您的问题一定会被直接关闭。
或者您可以去[讨论区](https://github.com/OpenListTeam/OpenList/discussions)。
options:
- label: |
我已确认阅读并同意 [AGPL-3.0 第15条](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=15.%20Disclaimer%20of%20Warranty.) 。
本程序不提供任何明示或暗示的担保,使用风险由您自行承担。
- label: |
我已确认阅读并同意 [AGPL-3.0 第16条](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=16.%20Limitation%20of%20Liability.) 。
无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。
- label: |
我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。
- label: |
我已确认阅读了[OpenList文档](https://doc.oplist.org)。
- label: |
我已确认没有重复的问题或讨论。
- label: |
我已确认是`OpenList`的问题,而不是其他原因(例如 [网络](https://doc.oplist.org/faq/howto#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host-1) ,`依赖`或`操作`)。
- label: |
我认为此问题必须由`OpenList`处理,而非第三方。
- label: |
我已确认这个问题在最新版本中没有被修复。
- label: |
我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。
- type: input
id: version
attributes:
label: OpenList 版本(必填)
description: |
您使用的是哪个版本的软件?请不要使用`latest`或`master`作为答案。
placeholder: v4.xx.xx
validations:
required: true
- type: input
id: driver
attributes:
label: 使用的存储驱动(必填)
description: |
您使用的是哪个存储驱动?
placeholder: "例如: OneDrive"
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: 问题描述(必填)
validations:
required: true
- type: textarea
id: logs
attributes:
label: 日志(必填)
description: |
请复制粘贴错误日志,或者截图。(可隐藏隐私字段) [查看方法](https://doc.oplist.org/faq/howto#%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E5%AE%9A%E4%BD%8Dbug)
validations:
required: true
- type: textarea
id: config
attributes:
label: 配置文件内容(必填)
description: |
请提供您的`OpenList`应用的配置文件,并截图相关存储配置。(可隐藏隐私字段)
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: 复现链接(可选)
description: |
请提供能复现此问题的链接。
================================================
FILE: .github/ISSUE_TEMPLATE/01-bug_report_en.yml
================================================
name: "Bug Report"
description: Bug Report / Issue
title: "[BUG] Please modify the title to describe the issue you are facing"
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out this bug report.
Please **make sure** your issue is not a duplicate and is not caused by your own operation, network, or third-party software.
- type: checkboxes
attributes:
label: Please confirm the following
description: |
You must read, check, confirm, and agree to all the following, otherwise your issue will definitely be closed directly.
Or you can go to the [discussions](https://github.com/OpenListTeam/OpenList/discussions).
options:
- label: |
I have read and agree to [AGPL-3.0 Section 15](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=15.%20Disclaimer%20of%20Warranty.) .
The program is provided "as is" without any warranties; you bear all risks of using it.
- label: |
I have read and agree to [AGPL-3.0 Section 16](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=16.%20Limitation%20of%20Liability.) .
The copyright holders and distributors are not liable for any damages resulting from the use or inability to use the program.
- label: |
I confirm my description is clear, polite, helps developers quickly locate the issue, and complies with community rules.
- label: |
I have read the [OpenList documentation](https://doc.oplist.org).
- label: |
I confirm there are no duplicate issues or discussions.
- label: |
I confirm this is an `OpenList` issue, not caused by other reasons (such as [network](https://doc.oplist.org/faq/howto#tls-handshake-timeout-read-connection-reset-by-peer-dns-lookup-failed-connect-connection-refused-client-timeout-exceeded-while-awaiting-headers-no-such-host-1), dependencies, or operation).
- label: |
I believe this issue must be handled by `OpenList` and not by a third party.
- label: |
I confirm this issue is not fixed in the latest version.
- label: |
I have not read these checkboxes and therefore I just ticked them all, Please close this issue.
- type: input
id: version
attributes:
label: OpenList Version (required)
description: |
What version of the software are you using? Please do not use `latest` or `master` as the answer.
placeholder: v4.xx.xx
validations:
required: true
- type: input
id: driver
attributes:
label: Storage Driver Used (required)
description: |
Which storage driver are you using?
placeholder: "e.g. OneDrive"
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Bug Description (required)
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs (required)
description: |
Please copy and paste any relevant log output or screenshots. (You may mask sensitive fields) [Guide](https://doc.oplist.org/faq/howto#how-to-quickly-locate-bugs)
validations:
required: true
- type: textarea
id: config
attributes:
label: Configuration File Content (required)
description: |
Please provide your `OpenList` application's configuration file and a screenshot of the relevant storage configuration. (You may mask sensitive fields)
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction Link (optional)
description: |
Please provide a link to a repo or page that can reproduce this issue.
================================================
FILE: .github/ISSUE_TEMPLATE/02-feature_request_zh.yml
================================================
name: "功能请求"
description: 功能请求 / 增强
title: "[Feature] 请修改标题为您的功能名称"
labels: [enhancement]
body:
- type: checkboxes
attributes:
label: 请确认以下事项
description: |
您必须阅读、检查、确认、同意以下内容,否则您的问题可能会被直接关闭。
或者您可以去[讨论区](https://github.com/OpenListTeam/OpenList/discussions)。
options:
- label: |
我已确认阅读并同意 [AGPL-3.0 第15条](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=15.%20Disclaimer%20of%20Warranty.) 。
本程序不提供任何明示或暗示的担保,使用风险由您自行承担。
- label: |
我已确认阅读并同意 [AGPL-3.0 第16条](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=16.%20Limitation%20of%20Liability.) 。
无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。
- label: |
我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。
- label: |
我已确认阅读了[OpenList文档](https://doc.oplist.org)。
- label: |
我已确认没有重复的问题或讨论。
- label: |
我认为此问题必须由`OpenList`处理,而非第三方。
- label: |
我已确认此功能尚未被实现。
- label: |
我已确认此功能是合理的,且有普遍需求,并非我个人需要。
- label: |
我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。
- type: textarea
id: feature-description
attributes:
label: 需求描述
validations:
required: true
- type: textarea
id: suggested-solution
attributes:
label: 实现思路
description: |
实现此需求的解决思路。
- type: textarea
id: additional-context
attributes:
label: 附加信息
description: |
相关的任何其他上下文或截图,或者你觉得有帮助的信息
================================================
FILE: .github/ISSUE_TEMPLATE/03-feature_request_en.yml
================================================
name: "Feature Request"
description: Feature Request / Enhancement
title: "[Feature] Please modify the title to your feature name"
labels: [enhancement]
body:
- type: checkboxes
attributes:
label: Please confirm the following
description: |
You must read, check, confirm, and agree to all the following, otherwise your request may be closed directly.
Or you can go to the [discussions](https://github.com/OpenListTeam/OpenList/discussions).
options:
- label: |
I have read and agree to [AGPL-3.0 Section 15](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=15.%20Disclaimer%20of%20Warranty.).
The program is provided "as is" without any warranties; you bear all risks of using it.
- label: |
I have read and agree to [AGPL-3.0 Section 16](https://www.gnu.org/licenses/agpl-3.0.txt#:~:text=16.%20Limitation%20of%20Liability.).
The copyright holders and distributors are not liable for any damages resulting from the use or inability to use the program.
- label: |
I confirm my description is clear, polite, helps developers quickly locate the issue, and complies with community rules.
- label: |
I have read the [OpenList documentation](https://doc.oplist.org).
- label: |
I confirm there are no duplicate issues or discussions.
- label: |
I believe this issue must be handled by `OpenList` and not by a third party.
- label: |
I confirm this feature has not been implemented yet.
- label: |
I confirm this feature is reasonable and has general demand, not just my personal need.
- label: |
I have not read these checkboxes and therefore I just ticked them all, Please close this issue.
- type: textarea
id: feature-description
attributes:
label: Feature Description
validations:
required: true
- type: textarea
id: suggested-solution
attributes:
label: Suggested Solution
description: |
Solution or approach to achieve this feature.
- type: textarea
id: additional-context
attributes:
label: Additional Information
description: |
Any other context or screenshots related to this feature request, or information you find helpful.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: 问题和讨论
url: https://github.com/OpenListTeam/OpenList/discussions
about: 讨论、问题、想法等
- name: Questions & Discussions
url: https://github.com/OpenListTeam/OpenList/discussions
about: Discuss issues, ideas, etc.
- name: 即时聊天
url: https://t.me/OpenListTeam
about: 与我们聊天
- name: Chat
url: https://t.me/OpenListTeam
about: Chat with us
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Provide a general summary of your changes in the Title above.
The PR title must start with `feat(): `, `docs(): `, `fix(): `, `style(): `, or `refactor(): `, `chore(): `. For example: `feat(component): add new feature`.
If it spans multiple components, use the main component as the prefix and enumerate in the title, describe in the body.
For breaking changes, add `!` after the type, e.g., `feat(component)!: breaking change`.
-->
<!--
在上方标题中提供您更改的总体摘要。
PR 标题需以 `feat(): `, `docs(): `, `fix(): `, `style(): `, `refactor(): `, `chore(): ` 其中之一开头,例如:`feat(component): 新增功能`。
如果跨多个组件,请使用主要组件作为前缀,并在标题中枚举、描述中说明。
如果是破坏性变更,请在类型后添加 `!`,例如 `feat(component)!: 破坏性变更`。
-->
## Description / 描述
<!-- Describe your changes in detail -->
<!-- 详细描述您的更改 -->
## Motivation and Context / 背景
<!-- Why is this change required? What problem does it solve? -->
<!-- 为什么需要此更改?它解决了什么问题? -->
<!-- If it fixes an open issue, please link to the issue here. -->
<!-- 如果修复了一个打开的issue,请在此处链接到该issue -->
Closes #XXXX
<!-- or -->
<!-- 或者 -->
Relates to #XXXX
## How Has This Been Tested? / 测试
<!-- Please describe in detail how you tested your changes. -->
<!-- 请详细描述您如何测试更改 -->
## Checklist / 检查清单
<!-- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!-- 检查以下所有要点,并在所有适用的框中打`x` -->
<!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
<!-- 如果您对其中任何一项不确定,请不要犹豫提问。我们会帮助您! -->
- [ ] I have read the [CONTRIBUTING](https://github.com/OpenListTeam/OpenList/blob/main/CONTRIBUTING.md) document.
我已阅读 [CONTRIBUTING](https://github.com/OpenListTeam/OpenList/blob/main/CONTRIBUTING.md) 文档。
- [ ] I have formatted my code with `go fmt` or [prettier](https://prettier.io/).
我已使用 `go fmt` 或 [prettier](https://prettier.io/) 格式化提交的代码。
- [ ] I have added appropriate labels to this PR (or mentioned needed labels in the description if lacking permissions).
我已为此 PR 添加了适当的标签(如无权限或需要的标签不存在,请在描述中说明,管理员将后续处理)。
- [ ] I have requested review from relevant code authors using the "Request review" feature when applicable.
我已在适当情况下使用"Request review"功能请求相关代码作者进行审查。
- [ ] I have updated the repository accordingly (If it’s needed).
我已相应更新了相关仓库(若适用)。
- [ ] [OpenList-Frontend](https://github.com/OpenListTeam/OpenList-Frontend) #XXXX
- [ ] [OpenList-Docs](https://github.com/OpenListTeam/OpenList-Docs) #XXXX
================================================
FILE: .github/workflows/beta_release.yml
================================================
name: Beta Release builds
on:
push:
branches: ["main"]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: write
jobs:
changelog:
name: Beta Release Changelog
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create or update ref
id: create-or-update-ref
uses: ovsds/create-or-update-ref-action@v1
with:
ref: tags/beta
sha: ${{ github.sha }}
- name: Delete beta tag
run: git tag -d beta
continue-on-error: true
- name: changelog # or changelogithub@0.12 if ensure the stable result
id: changelog
run: |
git tag -l
npx changelogithub --output CHANGELOG.md
- name: Upload assets to beta release
uses: softprops/action-gh-release@v2
with:
body_path: CHANGELOG.md
files: CHANGELOG.md
prerelease: true
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:
needs:
- changelog
strategy:
matrix:
include:
- target: "!(*musl*|*windows-arm64*|*windows7-*|*android*|*freebsd*)" # xgo and loongarch
hash: "md5"
- target: "linux-!(arm*)-musl*" #musl-not-arm
hash: "md5-linux-musl"
- target: "linux-arm*-musl*" #musl-arm
hash: "md5-linux-musl-arm"
- target: "windows-arm64" #win-arm64
hash: "md5-windows-arm64"
- target: "windows7-*" #win7
hash: "md5-windows7"
- target: "android-*" #android
hash: "md5-android"
- target: "freebsd-*" #freebsd
hash: "md5-freebsd"
name: Beta Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.25.0"
- name: Setup web
run: bash build.sh dev web
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- name: Build
uses: OpenListTeam/cgo-actions@v1.2.2
with:
targets: ${{ matrix.target }}
musl-target-format: $os-$musl-$arch
github-token: ${{ secrets.GITHUB_TOKEN }}
out-dir: build
output: openlist-$target$ext
musl-base-url: "https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
x-flags: |
github.com/OpenListTeam/OpenList/v4/internal/conf.BuiltAt=$built_at
github.com/OpenListTeam/OpenList/v4/internal/conf.GitAuthor=The OpenList Projects Contributors <noreply@openlist.team>
github.com/OpenListTeam/OpenList/v4/internal/conf.GitCommit=$git_commit
github.com/OpenListTeam/OpenList/v4/internal/conf.Version=$tag
github.com/OpenListTeam/OpenList/v4/internal/conf.WebVersion=rolling
- name: Compress
run: |
bash build.sh zip ${{ matrix.hash }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# See above
- name: Upload assets to beta release
uses: softprops/action-gh-release@v2
with:
files: build/compress/*
prerelease: true
tag_name: beta
- name: Clean illegal characters from matrix.target
id: clean_target_name
run: |
ILLEGAL_CHARS_REGEX='[":<>|*?\\/\r\n]'
CLEANED_TARGET=$(echo "${{ matrix.target }}" | sed -E "s/$ILLEGAL_CHARS_REGEX//g")
echo "Original target: ${{ matrix.target }}"
echo "Cleaned target: $CLEANED_TARGET"
echo "cleaned_target=$CLEANED_TARGET" >> $GITHUB_ENV
- name: Upload assets to github artifact
uses: actions/upload-artifact@v4
with:
name: beta builds for ${{ env.cleaned_target }}
path: ${{ github.workspace }}/build/compress/*
compression-level: 0
if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn`
================================================
FILE: .github/workflows/build.yml
================================================
name: Test Build
on:
pull_request:
branches: ["main"]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
strategy:
matrix:
target:
- darwin-amd64
- darwin-arm64
- windows-amd64
- linux-arm64-musl
- linux-amd64-musl
- windows-arm64
- android-arm64
name: Build ${{ matrix.target }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: benjlevesque/short-sha@v3.0
id: short-sha
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: "1.25.0"
- name: Setup web
run: bash build.sh dev web
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- name: Build
uses: OpenListTeam/cgo-actions@v1.2.2
with:
targets: ${{ matrix.target }}
musl-target-format: $os-$musl-$arch
github-token: ${{ secrets.GITHUB_TOKEN }}
out-dir: build
x-flags: |
github.com/OpenListTeam/OpenList/v4/internal/conf.BuiltAt=$built_at
github.com/OpenListTeam/OpenList/v4/internal/conf.GitAuthor=The OpenList Projects Contributors <noreply@openlist.team>
github.com/OpenListTeam/OpenList/v4/internal/conf.GitCommit=$git_commit
github.com/OpenListTeam/OpenList/v4/internal/conf.Version=$tag
github.com/OpenListTeam/OpenList/v4/internal/conf.WebVersion=rolling
output: openlist$ext
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: openlist_${{ steps.short-sha.outputs.sha }}_${{ matrix.target }}
path: build/*
================================================
FILE: .github/workflows/changelog.yml
================================================
name: Release Automatic changelog
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
changelog:
name: Create Release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Delete beta tag
run: git tag -d beta
continue-on-error: true
- run: npx changelogithub # or changelogithub@0.12 if ensure the stable result
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
================================================
FILE: .github/workflows/issue_pr_comment.yml
================================================
name: Issue or PR Auto Reply
on:
issues:
types: [opened]
pull_request:
types: [opened]
permissions:
issues: write
pull-requests: write
jobs:
auto-reply:
runs-on: ubuntu-latest
if: github.event_name == 'issues'
steps:
- name: Check issue for unchecked tasks and reply
uses: actions/github-script@v7
with:
script: |
let comment = "";
const issueTitle = context.payload.issue.title || "";
const titleNotEdited = /(请修改标题|Please modify the title)/i.test(issueTitle);
if (titleNotEdited) {
comment = "⚠️ 请修改标题以更好地描述您的问题或需求,并删除示例提示。当前 Issue 将被自动关闭。如需继续提交,请创建新的 Issue。\n";
comment += "⚠️ Please modify the title to better describe your issue or request, and remove the example prompt. This issue will be automatically closed. If you wish to proceed, please create a new issue.\n";
await github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: comment
});
await github.rest.issues.update({
...context.repo,
issue_number: context.issue.number,
state: 'closed',
state_reason: 'not_planned',
labels: ['invalid']
});
return;
}
const issueBody = context.payload.issue.body || "";
const confirmHasRead = /- \[ \] (?!我没有阅读这个清单|I have not read these checkboxes)/.test(issueBody);
const confirmNotRead = /- \[[xX]\] (?:我没有阅读这个清单|I have not read these checkboxes)/.test(issueBody);
if (confirmNotRead) {
comment = "⚠️ 你的 Issue 不符合提交规则。请先阅读相关规范后再重新提交。当前 Issue 将被自动关闭。如需继续提交,请确认已了解规则后重新打开或创建新的 Issue。\n";
comment += "⚠️ Your issue does not comply with the submission rules. Please read the guidelines before submitting again. This issue will be automatically closed. If you wish to proceed, please confirm that you have reviewed the rules before reopening or creating a new issue.\n";
await github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: comment
});
await github.rest.issues.update({
...context.repo,
issue_number: context.issue.number,
state: 'closed',
state_reason: 'not_planned',
labels: ['invalid']
});
return;
}
if (confirmHasRead) {
comment = "感谢您联系OpenList。我们会尽快回复您。\n";
comment += "Thanks for contacting OpenList. We will reply to you as soon as possible.\n\n";
comment += "由于您提出的 Issue 中包含部分未确认的项目,为了更好地管理项目,在人工审核后可能会直接关闭此问题。\n";
comment += "如果您能确认并补充相关未确认项目的信息,欢迎随时重新提交。我们会及时关注并处理。感谢您的理解与支持!\n";
comment += "Since your issue contains some unchecked tasks, it may be closed after manual review.\n";
comment += "If you can confirm and provide information for the unchecked tasks, feel free to resubmit.\n";
comment += "We will pay attention and handle it in a timely manner.\n\n";
comment += "感谢您的理解与支持!\n";
comment += "Thank you for your understanding and support!\n";
await github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: comment
});
}
pr-title-check:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: Check PR title for required prefix and comment
uses: actions/github-script@v7
with:
script: |
const title = context.payload.pull_request.title || "";
const ok = /^(feat|docs|fix|style|refactor|chore)\(.+?\)!?: /i.test(title);
if (!ok) {
let comment = "⚠️ PR 标题需以 `feat(): `, `docs(): `, `fix(): `, `style(): `, `refactor(): `, `chore(): ` 其中之一开头,例如:`feat(component): 新增功能`。\n";
comment += "⚠️ The PR title must start with `feat(): `, `docs(): `, `fix(): `, `style(): `, or `refactor(): `, `chore(): `. For example: `feat(component): add new feature`.\n\n";
comment += "如果跨多个组件,请使用主要组件作为前缀,并在标题中枚举、描述中说明。\n";
comment += "If it spans multiple components, use the main component as the prefix and enumerate in the title, describe in the body.\n\n";
comment += "如果是破坏性变更,请在类型后添加 `!`,例如 `feat(component)!: 破坏性变更`。\n";
comment += "For breaking changes, add `!` after the type, e.g., `feat(component)!: breaking change`.\n\n";
await github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: comment
});
}
================================================
FILE: .github/workflows/release.yml
================================================
name: Release builds
on:
release:
types: [ published ]
permissions:
contents: write
jobs:
# Set release to prerelease first
prerelease:
name: Set Prerelease
runs-on: ubuntu-latest
steps:
- name: Prerelease
uses: irongut/EditRelease@v1.2.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
id: ${{ github.event.release.id }}
prerelease: true
# Main release job for all platforms
release:
needs: prerelease
strategy:
matrix:
build-type: [ 'standard', 'lite' ]
target-platform: [ '', 'android', 'freebsd', 'linux_musl', 'linux_musl_arm' ]
name: Release ${{ matrix.target-platform && format('{0} ', matrix.target-platform) || '' }}${{ matrix.build-type == 'lite' && 'Lite' || '' }}
runs-on: ubuntu-latest
steps:
- name: Free Disk Space (Ubuntu)
if: matrix.target-platform == ''
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.25.0'
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
if: matrix.target-platform == ''
run: |
sudo snap install zig --classic --beta
docker pull crazymax/xgo:latest
go install github.com/crazy-max/xgo@latest
sudo apt install upx
- name: Build
run: |
bash build.sh release ${{ matrix.build-type == 'lite' && 'lite' || '' }} ${{ matrix.target-platform }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- name: Upload assets
uses: softprops/action-gh-release@v2
with:
files: build/compress/*
prerelease: false
tag_name: ${{ github.event.release.tag_name }}
================================================
FILE: .github/workflows/release_docker.yml
================================================
name: Release builds (Docker)
on:
workflow_dispatch:
inputs:
manual_tag:
description: 'Tag name (like v0.1.0). Required if as_latest is true.'
required: false
type: string
as_latest:
description: 'Tag as latest?'
required: true
default: 'false'
type: choice
options:
- 'true'
- 'false'
push:
tags:
- 'v*'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
DOCKERHUB_ORG_NAME: ${{ vars.DOCKERHUB_ORG_NAME || 'openlistteam' }}
GHCR_ORG_NAME: ${{ vars.GHCR_ORG_NAME || 'openlistteam' }}
IMAGE_NAME: openlist-git
IMAGE_NAME_DOCKERHUB: openlist
REGISTRY: ghcr.io
ARTIFACT_NAME: 'binaries_docker_release'
ARTIFACT_NAME_LITE: 'binaries_docker_release_lite'
RELEASE_PLATFORMS: 'linux/amd64,linux/arm64,linux/arm/v7,linux/386,linux/arm/v6,linux/ppc64le,linux/riscv64,linux/loong64' ### Temporarily disable Docker builds for linux/s390x architectures for unknown reasons.
IMAGE_PUSH: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
permissions:
packages: write
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: '1.25.0'
- 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 (release)
run: bash build.sh release docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
overwrite: true
path: |
build/
!build/*.tgz
!build/musl-libs/**
build_binary_lite:
name: Build Binaries for Docker Release (Lite)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.25.0'
- 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 lite docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build go binary (release)
run: bash build.sh release lite docker-multiplatform
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME_LITE }}
overwrite: true
path: |
build/
!build/*.tgz
!build/musl-libs/**
release_docker:
needs: build_binary
name: Release Docker image
runs-on: ubuntu-latest
strategy:
matrix:
image: ["latest", "ffmpeg", "aria2", "aio"]
include:
- image: "latest"
base_image_tag: "base"
build_arg: ""
tag_favor: ""
- image: "ffmpeg"
base_image_tag: "ffmpeg"
build_arg: INSTALL_FFMPEG=true
tag_favor: "suffix=-ffmpeg,onlatest=true"
- image: "aria2"
base_image_tag: "aria2"
build_arg: INSTALL_ARIA2=true
tag_favor: "suffix=-aria2,onlatest=true"
- image: "aio"
base_image_tag: "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: ${{ vars.DOCKERHUB_ORG_NAME_BACKUP || env.DOCKERHUB_ORG_NAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.GHCR_ORG_NAME }}/${{ env.IMAGE_NAME }}
${{ env.DOCKERHUB_ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }}
tags: >
${{ github.event_name == 'workflow_dispatch'
&& format('type=raw,value={0}', github.event.inputs.manual_tag)
|| format('type=raw,value={0}', github.ref_name) }}
flavor: |
latest=${{ github.event_name == 'push' || github.event.inputs.as_latest == 'true' }}
${{ 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: |
BASE_IMAGE_TAG=${{ matrix.base_image_tag }}
${{ matrix.build_arg }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: ${{ env.RELEASE_PLATFORMS }}
release_docker_lite:
needs: build_binary_lite
name: Release Docker image (Lite)
runs-on: ubuntu-latest
strategy:
matrix:
image: ["latest", "ffmpeg", "aria2", "aio"]
include:
- image: "latest"
base_image_tag: "base"
build_arg: ""
tag_favor: "suffix=-lite,onlatest=true"
- image: "ffmpeg"
base_image_tag: "ffmpeg"
build_arg: INSTALL_FFMPEG=true
tag_favor: "suffix=-lite-ffmpeg,onlatest=true"
- image: "aria2"
base_image_tag: "aria2"
build_arg: INSTALL_ARIA2=true
tag_favor: "suffix=-lite-aria2,onlatest=true"
- image: "aio"
base_image_tag: "aio"
build_arg: |
INSTALL_FFMPEG=true
INSTALL_ARIA2=true
tag_favor: "suffix=-lite-aio,onlatest=true"
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME_LITE }}
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: ${{ vars.DOCKERHUB_ORG_NAME_BACKUP || env.DOCKERHUB_ORG_NAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.GHCR_ORG_NAME }}/${{ env.IMAGE_NAME }}
${{ env.DOCKERHUB_ORG_NAME }}/${{ env.IMAGE_NAME_DOCKERHUB }}
tags: >
${{ github.event_name == 'workflow_dispatch'
&& format('type=raw,value={0}', github.event.inputs.manual_tag)
|| format('type=raw,value={0}', github.ref_name) }}
flavor: |
latest=${{ github.event_name == 'push' || github.event.inputs.as_latest == 'true' }}
${{ 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: |
BASE_IMAGE_TAG=${{ matrix.base_image_tag }}
${{ matrix.build_arg }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: ${{ env.RELEASE_PLATFORMS }}
================================================
FILE: .github/workflows/sync_repo.yml
================================================
name: Sync to Gitee
on:
push:
branches:
- main
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
name: Sync GitHub to Gitee
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.GITEE_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan gitee.com >> ~/.ssh/known_hosts
- name: Create single commit and push
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
# Create a new branch
git checkout --orphan new-main
git add .
git commit -m "Sync from GitHub: $(date)"
# Add Gitee remote and force push
git remote add gitee ${{ vars.GITEE_REPO_URL }}
git push --force gitee new-main:main
================================================
FILE: .github/workflows/test_docker.yml
================================================
name: Beta Release (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:
DOCKERHUB_ORG_NAME: ${{ vars.DOCKERHUB_ORG_NAME || 'openlistteam' }}
GHCR_ORG_NAME: ${{ vars.GHCR_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/ppc64le,linux/riscv64,linux/loong64' ### Temporarily disable Docker builds for linux/s390x architectures for unknown reasons.
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 (Beta)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.25.0'
- 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 }}
FRONTEND_REPO: ${{ vars.FRONTEND_REPO }}
- 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 (Beta)
runs-on: ubuntu-latest
permissions:
packages: write
strategy:
matrix:
image: ["latest", "ffmpeg", "aria2", "aio"]
include:
- image: "latest"
base_image_tag: "base"
build_arg: ""
tag_favor: ""
- image: "ffmpeg"
base_image_tag: "ffmpeg"
build_arg: INSTALL_FFMPEG=true
tag_favor: "suffix=-ffmpeg,onlatest=true"
- image: "aria2"
base_image_tag: "aria2"
build_arg: INSTALL_ARIA2=true
tag_favor: "suffix=-aria2,onlatest=true"
- image: "aio"
base_image_tag: "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: ${{ vars.DOCKERHUB_ORG_NAME_BACKUP || env.DOCKERHUB_ORG_NAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.GHCR_ORG_NAME }}/${{ env.IMAGE_NAME }}
${{ env.DOCKERHUB_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: |
BASE_IMAGE_TAG=${{ matrix.base_image_tag }}
${{ matrix.build_arg }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: ${{ env.RELEASE_PLATFORMS }}
================================================
FILE: .github/workflows/trigger-makefile-update.yml
================================================
name: Trigger OpenWRT Update
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Release tag to trigger update for'
required: true
type: string
jobs:
trigger-makefile-update:
runs-on: ubuntu-latest
steps:
- name: Trigger Makefile hash update
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.EXTERNAL_REPO_TOKEN_LUCI_APP_OPENLIST }}
repository: ${{ vars.HOOK_REPO || 'OpenListTeam/OpenList-OpenWRT' }}
event-type: update-hashes
client-payload: |
{
"source_repository": "${{ github.repository }}",
"release_tag": "${{ inputs.tag || github.ref_name }}",
"release_name": "${{ inputs.tag || github.ref_name }}",
"release_url": "${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ inputs.tag || github.ref_name }}",
"triggered_by": "${{ github.actor }}",
"trigger_reason": "${{ github.event_name }}"
}
- name: Log trigger information
run: |
echo "🚀 Successfully triggered Makefile hash update"
echo "📦 Target repository: OpenListTeam/luci-app-openlist"
echo "🏷️ Tag: ${{ inputs.tag || github.ref_name }}"
echo "👤 Triggered by: ${{ github.actor }}"
echo "📅 Trigger time: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
================================================
FILE: .gitignore
================================================
.idea/
.DS_Store
output/
/dist/
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
*.db
*.bin
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
/bin/*
*.json
/build
/data/
/tmp/
/log/
/lang/
/daemon/
/public/dist/*
/!public/dist/README.md
.VSCodeCounter
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[Telegram Group](https://t.me/OpenListTeam).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
## Setup your machine
`OpenList` is written in [Go](https://golang.org/) and [SolidJS](https://www.solidjs.com/).
Prerequisites:
- [git](https://git-scm.com)
- [Go 1.24+](https://golang.org/doc/install)
- [gcc](https://gcc.gnu.org/)
- [nodejs](https://nodejs.org/)
## Cloning a fork
Fork and clone `OpenList` and `OpenList-Frontend` anywhere:
```shell
$ git clone https://github.com/<your-username>/OpenList.git
$ git clone --recurse-submodules https://github.com/<your-username>/OpenList-Frontend.git
```
## Creating a branch
Create a new branch from the `main` branch, with an appropriate name.
```shell
$ git checkout -b <branch-name>
```
## Preview your change
### backend
```shell
$ go run main.go
```
### frontend
```shell
$ pnpm dev
```
## Add a new driver
Copy `drivers/template` folder and rename it, and follow the comments in it.
## Create a commit
Commit messages should be well formatted, and to make that "standardized".
Submit your pull request. For PR titles, follow [Conventional Commits](https://www.conventionalcommits.org).
https://github.com/OpenListTeam/OpenList/issues/376
It's suggested to sign your commits. See: [How to sign commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits)
## Submit a pull request
Please make sure your code has been formatted with `go fmt` or [prettier](https://prettier.io/) before submitting.
Push your branch to your `openlist` fork and open a pull request against the `main` branch.
## Merge your pull request
Your pull request will be merged after review. Please wait for the maintainer to merge your pull request after review.
At least 1 approving review is required by reviewers with write access. You can also request a review from maintainers.
## Delete your branch
(Optional) After your pull request is merged, you can delete your branch.
---
Thank you for your contribution! Let's make OpenList better together!
================================================
FILE: Dockerfile
================================================
### Default image is base. You can add other support by modifying BASE_IMAGE_TAG. The following parameters are supported: base (default), aria2, ffmpeg, aio
ARG BASE_IMAGE_TAG=base
FROM alpine:edge AS builder
LABEL stage=go-builder
WORKDIR /app/
RUN apk add --no-cache bash curl jq gcc git go musl-dev
COPY go.mod go.sum ./
RUN go mod download
COPY ./ ./
RUN bash build.sh release docker
FROM openlistteam/openlist-base-image:${BASE_IMAGE_TAG}
LABEL MAINTAINER="OpenList"
ARG INSTALL_FFMPEG=false
ARG INSTALL_ARIA2=false
ARG USER=openlist
ARG UID=1001
ARG GID=1001
WORKDIR /opt/openlist/
RUN addgroup -g ${GID} ${USER} && \
adduser -D -u ${UID} -G ${USER} ${USER} && \
mkdir -p /opt/openlist/data
COPY --from=builder --chmod=755 --chown=${UID}:${GID} /app/bin/openlist ./
COPY --chmod=755 --chown=${UID}:${GID} entrypoint.sh /entrypoint.sh
USER ${USER}
RUN /entrypoint.sh version
ENV UMASK=022 RUN_ARIA2=${INSTALL_ARIA2}
VOLUME /opt/openlist/data/
EXPOSE 5244 5245
CMD [ "/entrypoint.sh" ]
================================================
FILE: Dockerfile.ci
================================================
ARG BASE_IMAGE_TAG=base
FROM ghcr.io/openlistteam/openlist-base-image:${BASE_IMAGE_TAG}
LABEL MAINTAINER="OpenList"
ARG TARGETPLATFORM
ARG INSTALL_FFMPEG=false
ARG INSTALL_ARIA2=false
ARG USER=openlist
ARG UID=1001
ARG GID=1001
WORKDIR /opt/openlist/
RUN addgroup -g ${GID} ${USER} && \
adduser -D -u ${UID} -G ${USER} ${USER} && \
mkdir -p /opt/openlist/data
COPY --chmod=755 --chown=${UID}:${GID} /build/${TARGETPLATFORM}/openlist ./
COPY --chmod=755 --chown=${UID}:${GID} entrypoint.sh /entrypoint.sh
USER ${USER}
RUN /entrypoint.sh version
ENV UMASK=022 RUN_ARIA2=${INSTALL_ARIA2}
VOLUME /opt/openlist/data/
EXPOSE 5244 5245
CMD [ "/entrypoint.sh" ]
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
<div align="center">
<img style="width: 128px; height: 128px;" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg" alt="logo" />
<p><em>OpenList is a resilient, long-term governance, community-driven fork of AList — built to defend open source against trust-based attacks.</em></p>
<img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
<a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE"><img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" /></a>
<a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild"><img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" /></a>
<a href="https://github.com/OpenListTeam/OpenList/discussions"><img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" /></a>
</div>
---
- English | [中文](./README_cn.md) | [日本語](./README_ja.md) | [Dutch](./README_nl.md)
- [Contributing](./CONTRIBUTING.md)
- [CODE OF CONDUCT](./CODE_OF_CONDUCT.md)
- [LICENSE](./LICENSE)
## Disclaimer
OpenList is an open-source project independently maintained by the OpenList Team, following the AGPL-3.0 license and committed to maintaining complete code openness and modification transparency.
We have noticed the emergence of some third-party projects in the community with names similar to this project, such as OpenListApp/OpenListApp, as well as some paid proprietary software using the same or similar naming. To avoid user confusion, we hereby declare:
- OpenList has no official association with any third-party derivative projects.
- All software, code, and services of this project are maintained by the OpenList Team and are freely available on GitHub.
- Project documentation and API services primarily rely on charitable resources provided by Cloudflare. There are currently no paid plans or commercial deployments, and the use of existing features does not involve any costs.
We respect the community's rights to free use and derivative development, but we also strongly urge downstream projects:
- Should not use the "OpenList" name for impersonation promotion or commercial gain;
- Must not distribute OpenList-based code in a closed-source manner or violate AGPL license terms.
To better maintain healthy ecosystem development, we recommend:
- Clearly indicate the project source and choose appropriate open-source licenses in accordance with the open-source spirit;
- If involving commercial use, please avoid using "OpenList" or any confusing naming as the project name;
- If you need to use materials located under OpenListTeam/Logo, you may modify and use them under compliance with the agreement.
Thank you for your support and understanding of the OpenList project.
## Features
- [x] Multiple storages
- [x] Local storage
- [x] [Aliyundrive](https://www.alipan.com)
- [x] OneDrive / Sharepoint ([Global](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage), [CN](https://portal.partner.microsoftonline.cn), DE, US)
- [x] [189cloud](https://cloud.189.cn) (Personal, Family)
- [x] [GoogleDrive](https://drive.google.com)
- [x] [123pan](https://www.123pan.com)
- [x] [FTP / SFTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol)
- [x] [PikPak](https://www.mypikpak.com)
- [x] [S3](https://aws.amazon.com/s3)
- [x] [Seafile](https://seafile.com)
- [x] [UPYUN Storage Service](https://www.upyun.com/products/file-storage)
- [x] [WebDAV](https://en.wikipedia.org/wiki/WebDAV)
- [x] Teambition([China](https://www.teambition.com), [International](https://us.teambition.com))
- [x] [MediaFire](https://www.mediafire.com)
- [x] [Mediatrack](https://www.mediatrack.cn)
- [x] [ProtonDrive](https://proton.me/drive)
- [x] [139yun](https://yun.139.com) (Personal, Family, Group)
- [x] [YandexDisk](https://disk.yandex.com)
- [x] [BaiduNetdisk](http://pan.baidu.com)
- [x] [Terabox](https://www.terabox.com/main)
- [x] [UC](https://drive.uc.cn)
- [x] [Quark](https://pan.quark.cn)
- [x] [Thunder](https://pan.xunlei.com)
- [x] [Lanzou](https://www.lanzou.com)
- [x] [ILanzou](https://www.ilanzou.com)
- [x] [Google photo](https://photos.google.com)
- [x] [Mega.nz](https://mega.nz)
- [x] [Baidu photo](https://photo.baidu.com)
- [x] [SMB](https://en.wikipedia.org/wiki/Server_Message_Block)
- [x] [115](https://115.com)
- [X] [Cloudreve](https://cloudreve.org)
- [x] [Dropbox](https://www.dropbox.com)
- [x] [FeijiPan](https://www.feijipan.com)
- [x] [dogecloud](https://www.dogecloud.com/product/oss)
- [x] [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs)
- [x] [Chaoxing](https://www.chaoxing.com)
- [x] [CNB](https://cnb.cool/)
- [x] [Degoo](https://degoo.com)
- [x] [Doubao](https://www.doubao.com)
- [x] [Febbox](https://www.febbox.com)
- [x] [GitHub](https://github.com)
- [x] [OpenList](https://github.com/OpenListTeam/OpenList)
- [x] [Teldrive](https://github.com/tgdrive/teldrive)
- [x] [Weiyun](https://www.weiyun.com)
- [x] Easy to deploy and out-of-the-box
- [x] File preview (PDF, markdown, code, plain text, ...)
- [x] Image preview in gallery mode
- [x] Video and audio preview, support lyrics and subtitles
- [x] Office documents preview (docx, pptx, xlsx, ...)
- [x] `README.md` preview rendering
- [x] File permalink copy and direct file download
- [x] Dark mode
- [x] I18n
- [x] Protected routes (password protection and authentication)
- [x] WebDAV
- [x] Docker Deploy
- [x] Cloudflare Workers proxy
- [x] File/Folder package download
- [x] Web upload(Can allow visitors to upload), delete, mkdir, rename, move and copy
- [x] Offline download
- [x] Copy files between two storage
- [x] Multi-thread downloading acceleration for single-thread download/stream
## Document
- 📘 [Global Site](https://doc.oplist.org)
- 📚 [Backup Site](https://doc.openlist.team)
- 🌏 [CN Site](https://doc.oplist.org.cn)
## Demo
- 🌎 [Global Demo](https://demo.oplist.org)
- 🇨🇳 [CN Demo](https://demo.oplist.org.cn)
## Discussion
Please refer to [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) for raising general questions, ***Issues* is for bug reports and feature requests only.**
## Sponsor
[](https://vps.town "VPS.Town - Trust, Effortlessly. Your Cloud, Reimagined.")
## License
The `OpenList` is open-source software licensed under the [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) license.
## Disclaimer
- This project is a free and open-source software designed to facilitate file sharing via net disks, primarily intended to support the downloading and learning of the Go programming language.
- Please comply with all applicable laws and regulations when using this software. Any form of misuse is strictly prohibited.
- The software is based on official SDKs or APIs without any modification, disruption, or interference with their behavior.
- It only performs HTTP 302 redirects or traffic forwarding, and does not intercept, store, or tamper with any user data.
- This project is not affiliated with any official platform or service provider.
- The software is provided "as is", without any warranties of any kind, either express or implied, including but not limited to warranties of merchantability or fitness for a particular purpose.
- The maintainers are not liable for any direct or indirect damages arising from the use of, or inability to use, this software.
- You are solely responsible for any risks associated with using this software, including but not limited to account bans or download speed limitations.
- This project is licensed under the [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) License. Please see the [LICENSE](./LICENSE) file for details.
## Contact Us
- [@GitHub](https://github.com/OpenListTeam)
- [Telegram Group](https://t.me/OpenListTeam)
- [Telegram Channel](https://t.me/OpenListOfficial)
## Contributors
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.
Thanks goes to these wonderful people:
[](https://github.com/OpenListTeam/OpenList/graphs/contributors)
================================================
FILE: README_cn.md
================================================
<div align="center">
<img style="width: 128px; height: 128px;" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg" alt="logo" />
<p><em>OpenList 是一个有韧性、长期治理、社区驱动的 AList 分支,旨在防御基于信任的开源攻击。</em></p>
<img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
<a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE"><img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" /></a>
<a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild"><img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" /></a>
<a href="https://github.com/OpenListTeam/OpenList/discussions"><img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" /></a>
</div>
---
- [English](./README.md) | 中文 | [日本語](./README_ja.md) | [Dutch](./README_nl.md)
- [贡献指南](./CONTRIBUTING.md)
- [行为准则](./CODE_OF_CONDUCT.md)
- [许可证](./LICENSE)
## 免责声明
OpenList 是一个由 OpenList 团队独立维护的开源项目,遵循 AGPL-3.0 许可证,致力于保持完整的代码开放性和修改透明性。
我们注意到社区中出现了一些与本项目名称相似的第三方项目,如 OpenListApp/OpenListApp,以及部分采用相同或近似命名的收费专有软件。为避免用户误解,现声明如下:
- OpenList 与任何第三方衍生项目无官方关联。
- 本项目的全部软件、代码与服务由 OpenList 团队维护,可在 GitHub 免费获取。
- 项目文档与 API 服务均主要依托于 Cloudflare 提供的公益资源,目前无任何收费计划或商业部署,现有功能使用不涉及任何支出。
我们尊重社区的自由使用与衍生开发权利,但也强烈呼吁下游项目:
- 不应以“OpenList”名义进行冒名宣传或获取商业利益;
- 不得将基于 OpenList 的代码进行闭源分发或违反 AGPL 许可证条款。
为了更好地维护生态健康发展,我们建议:
- 明确注明项目来源,并以符合开源精神的方式选择适当的开源许可证;
- 如涉及商业用途,请避免使用“OpenList”或任何会产生混淆的方式作为项目名称;
- 若需使用本项目位于 OpenListTeam/Logo 下的素材,可在遵守协议的前提下进行修改后使用。
感谢您对 OpenList 项目的支持与理解。
## 功能
- [x] 多种存储
- [x] 本地存储
- [x] [阿里云盘](https://www.alipan.com)
- [x] OneDrive / Sharepoint ([国际版](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage), [中国](https://portal.partner.microsoftonline.cn), DE, US)
- [x] [天翼云盘](https://cloud.189.cn)(个人、家庭)
- [x] [GoogleDrive](https://drive.google.com)
- [x] [123云盘](https://www.123pan.com)
- [x] [FTP / SFTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol)
- [x] [PikPak](https://www.mypikpak.com)
- [x] [S3](https://aws.amazon.com/s3)
- [x] [Seafile](https://seafile.com)
- [x] [又拍云对象存储](https://www.upyun.com/products/file-storage)
- [x] [WebDAV](https://en.wikipedia.org/wiki/WebDAV)
- [x] Teambition([中国](https://www.teambition.com), [国际](https://us.teambition.com))
- [x] [MediaFire](https://www.mediafire.com)
- [x] [分秒帧](https://www.mediatrack.cn)
- [x] [ProtonDrive](https://proton.me/drive)
- [x] [和彩云](https://yun.139.com)(个人、家庭、群组)
- [x] [YandexDisk](https://disk.yandex.com)
- [x] [百度网盘](http://pan.baidu.com)
- [x] [Terabox](https://www.terabox.com/main)
- [x] [UC网盘](https://drive.uc.cn)
- [x] [夸克网盘](https://pan.quark.cn)
- [x] [迅雷网盘](https://pan.xunlei.com)
- [x] [蓝奏云](https://www.lanzou.com)
- [x] [蓝奏云优享版](https://www.ilanzou.com)
- [x] [Google 相册](https://photos.google.com)
- [x] [Mega.nz](https://mega.nz)
- [x] [百度相册](https://photo.baidu.com)
- [x] [SMB](https://en.wikipedia.org/wiki/Server_Message_Block)
- [x] [115](https://115.com)
- [x] [Cloudreve](https://cloudreve.org)
- [x] [Dropbox](https://www.dropbox.com)
- [x] [飞机盘](https://www.feijipan.com)
- [x] [多吉云](https://www.dogecloud.com/product/oss)
- [x] [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs)
- [x] [超星](https://www.chaoxing.com)
- [x] [CNB](https://cnb.cool/)
- [x] [Degoo](https://degoo.com)
- [x] [豆包](https://www.doubao.com)
- [x] [Febbox](https://www.febbox.com)
- [x] [GitHub](https://github.com)
- [x] [OpenList](https://github.com/OpenListTeam/OpenList)
- [x] [Teldrive](https://github.com/tgdrive/teldrive)
- [x] [微云](https://www.weiyun.com)
- [x] 部署方便,开箱即用
- [x] 文件预览(PDF、markdown、代码、纯文本等)
- [x] 画廊模式下的图片预览
- [x] 视频和音频预览,支持歌词和字幕
- [x] Office 文档预览(docx、pptx、xlsx 等)
- [x] `README.md` 预览渲染
- [x] 文件永久链接复制和直接文件下载
- [x] 黑暗模式
- [x] 国际化
- [x] 受保护的路由(密码保护和认证)
- [x] WebDAV
- [x] Docker 部署
- [x] Cloudflare Workers 代理
- [x] 文件/文件夹打包下载
- [x] 网页上传(可允许访客上传)、删除、新建文件夹、重命名、移动和复制
- [x] 离线下载
- [x] 跨存储复制文件
- [x] 单文件多线程下载/流式加速
## 文档
- 🌏 [国内站点](https://doc.oplist.org.cn)
- 📘 [海外站点](https://doc.oplist.org)
- 📚 [备用站点](https://doc.openlist.team)
## 演示
- 🇨🇳 [国内演示站](https://demo.oplist.org.cn)
- 🌎 [海外演示站](https://demo.oplist.org)
## 讨论
如有一般性问题请前往 [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) 讨论区,***Issues* 仅用于错误报告和功能请求。**
## 赞助者
[](https://vps.town "VPS.Town - Trust, Effortlessly. Your Cloud, Reimagined.")
## 许可证
`OpenList` 是基于 [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) 许可证的开源软件。
## 免责声明
- 本项目为免费开源软件,旨在通过网盘便捷分享文件,主要用于 Go 语言的下载与学习。
- 使用本软件时请遵守相关法律法规,严禁任何形式的滥用。
- 本软件基于官方 SDK 或 API 实现,未对其行为进行任何修改、破坏或干扰。
- 仅进行 HTTP 302 跳转或流量转发,不拦截、存储或篡改任何用户数据。
- 本项目与任何官方平台或服务提供商无关。
- 本软件按“原样”提供,不附带任何明示或暗示的担保,包括但不限于适销性或特定用途的适用性。
- 维护者不对因使用或无法使用本软件而导致的任何直接或间接损失负责。
- 您需自行承担使用本软件的所有风险,包括但不限于账号被封、下载限速等。
- 本项目遵循 [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) 许可证,详情请参见 [LICENSE](./LICENSE) 文件。
## 联系我们
- [@GitHub](https://github.com/OpenListTeam)
- [Telegram 交流群](https://t.me/OpenListTeam)
- [Telegram 频道](https://t.me/OpenListOfficial)
## 贡献者
我们衷心感谢原项目 [AlistGo/alist](https://github.com/AlistGo/alist) 的作者 [Xhofe](https://github.com/Xhofe) 及所有其他贡献者。
感谢这些优秀的人:
[](https://github.com/OpenListTeam/OpenList/graphs/contributors)
================================================
FILE: README_ja.md
================================================
<div align="center">
<img style="width: 128px; height: 128px;" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg" alt="logo" />
<p><em>OpenList は、信頼ベースの攻撃からオープンソースを守るために構築された、レジリエントで長期ガバナンス、コミュニティ主導の AList フォークです。</em></p>
<img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
<a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE"><img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" /></a>
<a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild"><img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" /></a>
<a href="https://github.com/OpenListTeam/OpenList/discussions"><img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" /></a>
</div>
---
- [English](./README.md) | [中文](./README_cn.md) | 日本語 | [Dutch](./README_nl.md)
- [コントリビュート](./CONTRIBUTING.md)
- [行動規範](./CODE_OF_CONDUCT.md)
- [ライセンス](./LICENSE)
## 免責事項
OpenListは、OpenListチームが独立して維持するオープンソースプロジェクトであり、AGPL-3.0ライセンスに従い、完全なコードの開放性と変更の透明性を維持することに専念しています。
コミュニティ内で、OpenListApp/OpenListAppなど、本プロジェクトと類似した名称を持つサードパーティプロジェクトや、同一または類似した命名を採用する有料専有ソフトウェアが出現していることを確認しています。ユーザーの誤解を避けるため、以下のように宣言いたします:
- OpenListは、いかなるサードパーティ派生プロジェクトとも公式な関連性はありません。
- 本プロジェクトのすべてのソフトウェア、コード、サービスはOpenListチームによって維持され、GitHubで無料で取得できます。
- プロジェクトドキュメントとAPIサービスは主にCloudflareが提供する公益リソースに依存しており、現在有料プランや商業展開はなく、既存機能の使用に費用は発生しません。
私たちはコミュニティの自由な使用と派生開発の権利を尊重しますが、下流プロジェクトに強く呼びかけます:
- 「OpenList」の名前で偽装宣伝や商業利益を得るべきではありません;
- OpenListベースのコードをクローズドソースで配布したり、AGPLライセンス条項に違反してはいけません。
エコシステムの健全な発展をより良く維持するため、以下を推奨します:
- プロジェクトの出典を明確に示し、オープンソース精神に合致する適切なオープンソースライセンスを選択する;
- 商業用途が関わる場合は、「OpenList」や混乱を招く可能性のある名前をプロジェクト名として使用することを避ける;
- OpenListTeam/Logo下の素材を使用する必要がある場合は、協定を遵守した上で修正して使用できます。
OpenListプロジェクトへのご支援とご理解をありがとうございます。
## 特徴
- [x] 複数ストレージ
- [x] ローカルストレージ
- [x] [Aliyundrive](https://www.alipan.com)
- [x] OneDrive / Sharepoint ([グローバル](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage), [中国](https://portal.partner.microsoftonline.cn), DE, US)
- [x] [189cloud](https://cloud.189.cn)(個人、家族)
- [x] [GoogleDrive](https://drive.google.com)
- [x] [123pan](https://www.123pan.com)
- [x] [FTP / SFTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol)
- [x] [PikPak](https://www.mypikpak.com)
- [x] [S3](https://aws.amazon.com/s3)
- [x] [Seafile](https://seafile.com)
- [x] [UPYUN Storage Service](https://www.upyun.com/products/file-storage)
- [x] [WebDAV](https://en.wikipedia.org/wiki/WebDAV)
- [x] Teambition([中国](https://www.teambition.com), [国際](https://us.teambition.com))
- [x] [Mediatrack](https://www.mediatrack.cn)
- [x] [ProtonDrive](https://proton.me/drive)
- [x] [139yun](https://yun.139.com)(個人、家族、グループ)
- [x] [YandexDisk](https://disk.yandex.com)
- [x] [BaiduNetdisk](http://pan.baidu.com)
- [x] [Terabox](https://www.terabox.com/main)
- [x] [UC](https://drive.uc.cn)
- [x] [Quark](https://pan.quark.cn)
- [x] [Thunder](https://pan.xunlei.com)
- [x] [Lanzou](https://www.lanzou.com)
- [x] [ILanzou](https://www.ilanzou.com)
- [x] [Google photo](https://photos.google.com)
- [x] [Mega.nz](https://mega.nz)
- [x] [Baidu photo](https://photo.baidu.com)
- [x] [SMB](https://en.wikipedia.org/wiki/Server_Message_Block)
- [x] [115](https://115.com)
- [x] [Cloudreve](https://cloudreve.org)
- [x] [Dropbox](https://www.dropbox.com)
- [x] [FeijiPan](https://www.feijipan.com)
- [x] [dogecloud](https://www.dogecloud.com/product/oss)
- [x] [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs)
- [x] [Chaoxing](https://www.chaoxing.com)
- [x] [CNB](https://cnb.cool/)
- [x] [Degoo](https://degoo.com)
- [x] [Doubao](https://www.doubao.com)
- [x] [Febbox](https://www.febbox.com)
- [x] [GitHub](https://github.com)
- [x] [OpenList](https://github.com/OpenListTeam/OpenList)
- [x] [Teldrive](https://github.com/tgdrive/teldrive)
- [x] [Weiyun](https://www.weiyun.com)
- [x] [MediaFire](https://www.mediafire.com)
- [x] 簡単にデプロイでき、すぐに使える
- [x] ファイルプレビュー(PDF、markdown、コード、テキストなど)
- [x] ギャラリーモードでの画像プレビュー
- [x] ビデオ・オーディオプレビュー、歌詞・字幕対応
- [x] Officeドキュメントプレビュー(docx、pptx、xlsxなど)
- [x] `README.md` プレビュー表示
- [x] ファイルのパーマリンクコピーと直接ダウンロード
- [x] ダークモード
- [x] 国際化対応
- [x] 保護されたルート(パスワード保護と認証)
- [x] WebDAV
- [x] Dockerデプロイ
- [x] Cloudflare Workersプロキシ
- [x] ファイル/フォルダのパッケージダウンロード
- [x] Webアップロード(訪問者のアップロード許可可)、削除、フォルダ作成、リネーム、移動、コピー
- [x] オフラインダウンロード
- [x] ストレージ間のファイルコピー
- [x] 単一ファイルのマルチスレッドダウンロード/ストリーム加速
## ドキュメント
- 📘 [グローバルサイト](https://doc.oplist.org)
- 📚 [バックアップサイト](https://doc.openlist.team)
- 🌏 [CNサイト](https://doc.oplist.org.cn)
## デモ
- 🌎 [グローバルデモ](https://demo.oplist.org)
- 🇨🇳 [CNデモ](https://demo.oplist.org.cn)
## ディスカッション
一般的な質問は [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions) をご利用ください。***Issues* はバグ報告と機能リクエスト専用です。**
## スポンサー
[](https://vps.town "VPS.Town - Trust, Effortlessly. Your Cloud, Reimagined.")
## ライセンス
「OpenList」は [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) ライセンスの下で公開されているオープンソースソフトウェアです。
## 免責事項
- 本プロジェクトは無料のオープンソースソフトウェアであり、ネットワークディスクを通じたファイル共有を容易にすることを目的とし、主に Go 言語のダウンロードと学習をサポートします。
- 本ソフトウェアの利用にあたっては、関連する法令を遵守し、不正利用を固く禁じます。
- 本ソフトウェアは公式 SDK または API に基づいており、その動作を一切改変・破壊・妨害しません。
- 302 リダイレクトまたはトラフィック転送のみを行い、ユーザーデータの傍受・保存・改ざんは一切行いません。
- 本プロジェクトは、いかなる公式プラットフォームやサービスプロバイダーとも関係ありません。
- 本ソフトウェアは「現状有姿」で提供されており、商品性や特定目的への適合性を含むいかなる保証もありません。
- 本ソフトウェアの使用または使用不能によるいかなる直接的・間接的損害についても、メンテナは責任を負いません。
- 本ソフトウェアの利用に伴うすべてのリスク(アカウントの凍結やダウンロード速度制限などを含む)は、利用者自身が負うものとします。
- 本プロジェクトは [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) ライセンスに従います。詳細は [LICENSE](./LICENSE) ファイルをご覧ください。
## お問い合わせ
- [@GitHub](https://github.com/OpenListTeam)
- [Telegram グループ](https://t.me/OpenListTeam)
- [Telegram チャンネル](https://t.me/OpenListOfficial)
## コントリビューター
オリジナルプロジェクト [AlistGo/alist](https://github.com/AlistGo/alist) の作者 [Xhofe](https://github.com/Xhofe) およびその他すべての貢献者に心より感謝いたします。
素晴らしい皆様に感謝します:
[](https://github.com/OpenListTeam/OpenList/graphs/contributors)
================================================
FILE: README_nl.md
================================================
<div align="center">
<img style="width: 128px; height: 128px;" src="https://raw.githubusercontent.com/OpenListTeam/Logo/main/logo.svg" alt="logo" />
<p><em>OpenList is een veerkrachtige, langetermijn, door de gemeenschap geleide fork van AList — gebouwd om open source te beschermen tegen op vertrouwen gebaseerde aanvallen.</em></p>
<img src="https://goreportcard.com/badge/github.com/OpenListTeam/OpenList/v3" alt="latest version" />
<a href="https://github.com/OpenListTeam/OpenList/blob/main/LICENSE"><img src="https://img.shields.io/github/license/OpenListTeam/OpenList" alt="License" /></a>
<a href="https://github.com/OpenListTeam/OpenList/actions?query=workflow%3ABuild"><img src="https://img.shields.io/github/actions/workflow/status/OpenListTeam/OpenList/build.yml?branch=main" alt="Build status" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/release/OpenListTeam/OpenList" alt="latest version" /></a>
<a href="https://github.com/OpenListTeam/OpenList/discussions"><img src="https://img.shields.io/github/discussions/OpenListTeam/OpenList?color=%23ED8936" alt="discussions" /></a>
<a href="https://github.com/OpenListTeam/OpenList/releases"><img src="https://img.shields.io/github/downloads/OpenListTeam/OpenList/total?color=%239F7AEA&logo=github" alt="Downloads" /></a>
</div>
---
- [English](./README.md) | [中文](./README_cn.md) | [日本語](./README_ja.md) | Dutch
- [Bijdragen](./CONTRIBUTING.md)
- [Gedragscode](./CODE_OF_CONDUCT.md)
- [Licentie](./LICENSE)
## Disclaimer
OpenList is een open-source project dat onafhankelijk wordt onderhouden door het OpenList Team, volgend op de AGPL-3.0 licentie en toegewijd aan het behouden van volledige code openheid en transparantie van wijzigingen.
We hebben gemerkt dat er in de gemeenschap enkele derde partij projecten zijn verschenen met namen vergelijkbaar met dit project, zoals OpenListApp/OpenListApp, evenals enkele betaalde eigendomssoftware die dezelfde of soortgelijke naamgeving gebruikt. Om verwarring bij gebruikers te voorkomen, verklaren we hierbij:
- OpenList heeft geen officiële associatie met enige derde partij afgeleide projecten.
- Alle software, code en diensten van dit project worden onderhouden door het OpenList Team en zijn gratis beschikbaar op GitHub.
- Projectdocumentatie en API diensten zijn voornamelijk afhankelijk van liefdadigheidsbronnen verstrekt door Cloudflare. Er zijn momenteel geen betaalplannen of commerciële implementaties, en het gebruik van bestaande functies brengt geen kosten met zich mee.
We respecteren de rechten van de gemeenschap voor vrij gebruik en afgeleide ontwikkeling, maar we roepen downstream projecten ook ten zeerste op:
- Mogen niet de "OpenList" naam gebruiken voor namaakpromotie of commercieel gewin;
- Mogen OpenList-gebaseerde code niet distribueren op een closed-source manier of AGPL licentievoorwaarden schenden.
Om een gezonde ecosysteemontwikkeling beter te onderhouden, bevelen we aan:
- Duidelijk de projectbron aangeven en passende open-source licenties kiezen in overeenstemming met de open-source geest;
- Bij commercieel gebruik, vermijd het gebruik van "OpenList" of enige verwarrende naamgeving als projectnaam;
- Als u materialen onder OpenListTeam/Logo moet gebruiken, kunt u deze wijzigen en gebruiken onder naleving van de overeenkomst.
Dank u voor uw ondersteuning en begrip
## Functies
- [x] Meerdere opslagmogelijkheden
- [x] Lokale opslag
- [x] [Aliyundrive](https://www.alipan.com)
- [x] OneDrive / Sharepoint ([Global](https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage), [CN](https://portal.partner.microsoftonline.cn), DE, US)
- [x] [189cloud](https://cloud.189.cn) (Persoonlijk, Familie)
- [x] [GoogleDrive](https://drive.google.com)
- [x] [123pan](https://www.123pan.com)
- [x] [FTP / SFTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol)
- [x] [PikPak](https://www.mypikpak.com)
- [x] [S3](https://aws.amazon.com/s3)
- [x] [Seafile](https://seafile.com)
- [x] [UPYUN Storage Service](https://www.upyun.com/products/file-storage)
- [x] [WebDAV](https://en.wikipedia.org/wiki/WebDAV)
- [x] Teambition([China](https://www.teambition.com), [Internationaal](https://us.teambition.com))
- [x] [MediaFire](https://www.mediafire.com)
- [x] [Mediatrack](https://www.mediatrack.cn)
- [x] [ProtonDrive](https://proton.me/drive)
- [x] [139yun](https://yun.139.com) (Persoonlijk, Familie, Groep)
- [x] [YandexDisk](https://disk.yandex.com)
- [x] [BaiduNetdisk](http://pan.baidu.com)
- [x] [Terabox](https://www.terabox.com/main)
- [x] [UC](https://drive.uc.cn)
- [x] [Quark](https://pan.quark.cn)
- [x] [Thunder](https://pan.xunlei.com)
- [x] [Lanzou](https://www.lanzou.com)
- [x] [ILanzou](https://www.ilanzou.com)
- [x] [Google photo](https://photos.google.com)
- [x] [Mega.nz](https://mega.nz)
- [x] [Baidu photo](https://photo.baidu.com)
- [x] [SMB](https://en.wikipedia.org/wiki/Server_Message_Block)
- [x] [115](https://115.com)
- [x] [Cloudreve](https://cloudreve.org)
- [x] [Dropbox](https://www.dropbox.com)
- [x] [FeijiPan](https://www.feijipan.com)
- [x] [dogecloud](https://www.dogecloud.com/product/oss)
- [x] [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs)
- [x] [Chaoxing](https://www.chaoxing.com)
- [x] [CNB](https://cnb.cool/)
- [x] [Degoo](https://degoo.com)
- [x] [Doubao](https://www.doubao.com)
- [x] [Febbox](https://www.febbox.com)
- [x] [GitHub](https://github.com)
- [x] [OpenList](https://github.com/OpenListTeam/OpenList)
- [x] [Teldrive](https://github.com/tgdrive/teldrive)
- [x] [Weiyun](https://www.weiyun.com)
- [x] Eenvoudig te implementeren en direct te gebruiken
- [x] Bestandsvoorbeeld (PDF, markdown, code, platte tekst, ...)
- [x] Afbeeldingsvoorbeeld in galerijweergave
- [x] Video- en audiovoorbeeld, ondersteuning voor songteksten en ondertitels
- [x] Office-documenten voorbeeld (docx, pptx, xlsx, ...)
- [x] `README.md` voorbeeldweergave
- [x] Permalink kopiëren en direct downloaden van bestanden
- [x] Donkere modus
- [x] I18n
- [x] Beschermde routes (wachtwoordbeveiliging en authenticatie)
- [x] WebDAV
- [x] Docker implementatie
- [x] Cloudflare Workers proxy
- [x] Bestands-/map-pakket download
- [x] Webupload (bezoekers kunnen uploaden toestaan), verwijderen, map aanmaken, hernoemen, verplaatsen en kopiëren
- [x] Offline download
- [x] Bestanden kopiëren tussen twee opslaglocaties
- [x] Multi-thread downloadversnelling voor enkelvoudige download/stream
## Documentatie
- 📘 [Global Site](https://doc.oplist.org)
- 📚 [Backup Site](https://doc.openlist.team)
- 🌏 [CN Site](https://doc.oplist.org.cn)
## Demo
- 🌎 [Global Demo](https://demo.oplist.org)
- 🇨🇳 [CN Demo](https://demo.oplist.org.cn)
## Discussie
Stel algemene vragen in [*Discussions*](https://github.com/OpenListTeam/OpenList/discussions), ***Issues* zijn alleen voor bugmeldingen en feature requests.**
## Sponsoren
[](https://vps.town "VPS.Town - Trust, Effortlessly. Your Cloud, Reimagined.")
## Licentie
`OpenList` is open-source software onder de [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) licentie.
## Disclaimer
- Dit project is gratis en open-source software, ontworpen om het delen van bestanden via netdisks te vergemakkelijken, voornamelijk bedoeld ter ondersteuning van het downloaden en leren van de programmeertaal Go.
- Houd u bij het gebruik van deze software aan alle toepasselijke wetten en voorschriften. Elk misbruik is ten strengste verboden.
- De software is gebaseerd op officiële SDK's of API's zonder enige wijziging, verstoring of beïnvloeding van hun gedrag.
- Het voert alleen HTTP 302-omleidingen of verkeersdoorsturing uit en onderschept, slaat of wijzigt geen gebruikersgegevens.
- Dit project is niet gelieerd aan enig officieel platform of dienstverlener.
- De software wordt geleverd "zoals deze is", zonder enige vorm van garantie, expliciet of impliciet, inclusief maar niet beperkt tot garanties van verkoopbaarheid of geschiktheid voor een bepaald doel.
- De beheerders zijn niet aansprakelijk voor enige directe of indirecte schade die voortvloeit uit het gebruik van of het onvermogen om deze software te gebruiken.
- U bent zelf verantwoordelijk voor alle risico's die gepaard gaan met het gebruik van deze software, inclusief maar niet beperkt tot accountblokkades of downloadbeperkingen.
- Dit project valt onder de [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.txt) licentie. Zie het [LICENSE](./LICENSE) bestand voor details.
## Contact
- [@GitHub](https://github.com/OpenListTeam)
- [Telegram Groep](https://t.me/OpenListTeam)
- [Telegram Kanaal](https://t.me/OpenListOfficial)
## Bijdragers
Wij danken de auteur [Xhofe](https://github.com/Xhofe) van het originele project [AlistGo/alist](https://github.com/AlistGo/alist) en alle andere bijdragers.
Dank aan deze geweldige mensen:
[](https://github.com/OpenListTeam/OpenList/graphs/contributors)
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
Only the latest stable release receives security patches. We strongly recommend always keeping OpenList up to date.
| Version | Supported |
| -------------------- | ------------------ |
| Latest stable (v4.x) | :white_check_mark: |
| Older versions | :x: |
## Reporting a Vulnerability
**Please do NOT report security vulnerabilities through public GitHub Issues.**
If you discover a security vulnerability in OpenList, please report it responsibly by using one of the following channels:
- **GitHub Private Security Advisory** (preferred): [Submit here](https://github.com/OpenListTeam/OpenList/security/advisories/new)
- **Telegram**: Contact a maintainer privately via [@OpenListTeam](https://t.me/OpenListTeam)
When reporting, please include as much of the following as possible:
- A description of the vulnerability and its potential impact
- The affected version(s)
- Step-by-step instructions to reproduce the issue
- Any proof-of-concept code or screenshots (if applicable)
- Suggested mitigation or fix (optional but appreciated)
## Security Best Practices for Users
To keep your OpenList instance secure:
- Always update to the latest release.
- Use a strong, unique admin password and change it after first login.
- Enable HTTPS (TLS) for your deployment — do **not** expose OpenList over plain HTTP on the public internet.
- Limit exposed ports using a reverse proxy (e.g., Nginx, Caddy).
- Set up access controls and avoid enabling guest access unless necessary.
- Regularly review mounted storage permissions and revoke unused API tokens.
- When using Docker, avoid running the container as root if possible.
## Acknowledgments
We sincerely thank all security researchers and community members who responsibly disclose vulnerabilities and help make OpenList safer for everyone.
---
# 安全政策
## 支持的版本
我们仅对最新稳定版本提供安全补丁。强烈建议始终保持 OpenList 为最新版本。
| 版本 | 是否支持 |
| ------------------ | ------------------ |
| 最新稳定版(v4.x) | :white_check_mark: |
| 旧版本 | :x: |
## 报告漏洞
**请勿通过公开的 GitHub Issues 报告安全漏洞。**
如果您在 OpenList 中发现安全漏洞,请通过以下渠道之一负责任地进行报告:
- **GitHub 私密安全公告**(推荐):[点击提交](https://github.com/OpenListTeam/OpenList/security/advisories/new)
- **Telegram**:通过 [@OpenListTeam](https://t.me/OpenListTeam) 私信联系维护者
报告时,请尽量提供以下信息:
- 漏洞描述及其潜在影响
- 受影响的版本
- 复现问题的详细步骤
- 概念验证代码或截图(如有)
- 建议的缓解措施或修复方案(可选,但非常欢迎)
## 用户安全最佳实践
为保障您的 OpenList 实例安全:
- 始终更新至最新版本。
- 使用强且唯一的管理员密码,并在首次登录后立即修改。
- 为您的部署启用 HTTPS(TLS)—— **请勿**在公网上以明文 HTTP 方式暴露 OpenList。
- 使用反向代理(如 Nginx、Caddy)限制对外暴露的端口。
- 配置访问控制,非必要情况下不要开启访客访问。
- 定期检查已挂载存储的权限,并撤销未使用的 API 令牌。
- 使用 Docker 部署时,尽可能避免以 root 用户运行容器。
## 致谢
我们衷心感谢所有负责任地披露漏洞、帮助 OpenList 变得更加安全的安全研究人员和社区成员。
================================================
FILE: build.sh
================================================
set -e
appName="openlist"
builtAt="$(date +'%F %T %z')"
gitAuthor="The OpenList Projects Contributors <noreply@openlist.team>"
gitCommit=$(git log --pretty=format:"%h" -1)
# Set frontend repository, default to OpenListTeam/OpenList-Frontend
frontendRepo="${FRONTEND_REPO:-OpenListTeam/OpenList-Frontend}"
githubAuthArgs=""
if [ -n "$GITHUB_TOKEN" ]; then
githubAuthArgs="--header \"Authorization: Bearer $GITHUB_TOKEN\""
fi
# Check for lite parameter
useLite=false
if [[ "$*" == *"lite"* ]]; then
useLite=true
fi
if [ "$1" = "dev" ]; then
version="dev"
webVersion="rolling"
elif [ "$1" = "beta" ]; then
version="beta"
webVersion="rolling"
else
git tag -d beta || true
# Always true if there's no tag
version=$(git describe --abbrev=0 --tags 2>/dev/null || echo "v0.0.0")
webVersion=$(eval "curl -fsSL --max-time 2 $githubAuthArgs \"https://api.github.com/repos/$frontendRepo/releases/latest\"" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
fi
echo "backend version: $version"
echo "frontend version: $webVersion"
if [ "$useLite" = true ]; then
echo "using lite frontend"
else
echo "using standard frontend"
fi
ldflags="\
-w -s \
-X 'github.com/OpenListTeam/OpenList/v4/internal/conf.BuiltAt=$builtAt' \
-X 'github.com/OpenListTeam/OpenList/v4/internal/conf.GitAuthor=$gitAuthor' \
-X 'github.com/OpenListTeam/OpenList/v4/internal/conf.GitCommit=$gitCommit' \
-X 'github.com/OpenListTeam/OpenList/v4/internal/conf.Version=$version' \
-X 'github.com/OpenListTeam/OpenList/v4/internal/conf.WebVersion=$webVersion' \
"
FetchWebRolling() {
pre_release_json=$(eval "curl -fsSL --max-time 2 $githubAuthArgs -H \"Accept: application/vnd.github.v3+json\" \"https://api.github.com/repos/$frontendRepo/releases/tags/rolling\"")
pre_release_assets=$(echo "$pre_release_json" | jq -r '.assets[].browser_download_url')
# There is no lite for rolling
pre_release_tar_url=$(echo "$pre_release_assets" | grep "openlist-frontend-dist" | grep -v "lite" | grep "\.tar\.gz$")
curl -fsSL "$pre_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
}
FetchWebRelease() {
release_json=$(eval "curl -fsSL --max-time 2 $githubAuthArgs -H \"Accept: application/vnd.github.v3+json\" \"https://api.github.com/repos/$frontendRepo/releases/latest\"")
release_assets=$(echo "$release_json" | jq -r '.assets[].browser_download_url')
if [ "$useLite" = true ]; then
release_tar_url=$(echo "$release_assets" | grep "openlist-frontend-dist-lite" | grep "\.tar\.gz$")
else
release_tar_url=$(echo "$release_assets" | grep "openlist-frontend-dist" | grep -v "lite" | grep "\.tar\.gz$")
fi
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
}
BuildWinArm64() {
echo building for windows-arm64
chmod +x ./wrapper/zcc-arm64
chmod +x ./wrapper/zcxx-arm64
export GOOS=windows
export GOARCH=arm64
export CC=$(pwd)/wrapper/zcc-arm64
export CXX=$(pwd)/wrapper/zcxx-arm64
export CGO_ENABLED=1
go build -o "$1" -ldflags="$ldflags" -tags=jsoniter .
}
BuildWin7() {
# Setup Win7 Go compiler (patched version that supports Windows 7)
go_version=$(go version | grep -o 'go[0-9]\+\.[0-9]\+\.[0-9]\+' | sed 's/go//')
echo "Detected Go version: $go_version"
curl -fsSL --retry 3 -o go-win7.zip -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/XTLS/go-win7/releases/download/patched-${go_version}/go-for-win7-linux-amd64.zip"
rm -rf go-win7
unzip go-win7.zip -d go-win7
rm go-win7.zip
# Set permissions for all wrapper files
chmod +x ./wrapper/zcc-win7
chmod +x ./wrapper/zcxx-win7
chmod +x ./wrapper/zcc-win7-386
chmod +x ./wrapper/zcxx-win7-386
# Build for both 386 and amd64 architectures
for arch in "386" "amd64"; do
echo "building for windows7-${arch}"
export GOOS=windows
export GOARCH=${arch}
export CGO_ENABLED=1
# Use architecture-specific wrapper files
if [ "$arch" = "386" ]; then
export CC=$(pwd)/wrapper/zcc-win7-386
export CXX=$(pwd)/wrapper/zcxx-win7-386
else
export CC=$(pwd)/wrapper/zcc-win7
export CXX=$(pwd)/wrapper/zcxx-win7
fi
# Use the patched Go compiler for Win7 compatibility
$(pwd)/go-win7/bin/go build -o "${1}-${arch}.exe" -ldflags="$ldflags" -tags=jsoniter .
done
}
BuildDev() {
rm -rf .git/
mkdir -p "dist"
muslflags="--extldflags '-static -fpic' $ldflags"
BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross)
for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz"
curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
done
OS_ARCHES=(linux-musl-amd64 linux-musl-arm64)
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc)
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]}
echo building for ${os_arch}
export GOOS=${os_arch%%-*}
export GOARCH=${os_arch##*-}
export CC=${cgo_cc}
export CGO_ENABLED=1
go build -o ./dist/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
done
xgo -targets=windows/amd64,darwin/amd64,darwin/arm64 -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
mv "$appName"-* dist
cd dist
# cp ./"$appName"-windows-amd64.exe ./"$appName"-windows-amd64-upx.exe
# upx -9 ./"$appName"-windows-amd64-upx.exe
find . -type f -print0 | xargs -0 md5sum >md5.txt
cat md5.txt
}
BuildDocker() {
go build -o ./bin/"$appName" -ldflags="$ldflags" -tags=jsoniter .
}
PrepareBuildDockerMusl() {
mkdir -p build/musl-libs
BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
FILES=(x86_64-linux-musl-cross aarch64-linux-musl-cross i486-linux-musl-cross armv6-linux-musleabihf-cross armv7l-linux-musleabihf-cross riscv64-linux-musl-cross powerpc64le-linux-musl-cross loongarch64-linux-musl-cross) ## Disable s390x-linux-musl-cross builds
for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz"
lib_tgz="build/${i}.tgz"
curl -fsSL -o "${lib_tgz}" "${url}"
tar xf "${lib_tgz}" --strip-components 1 -C build/musl-libs
rm -f "${lib_tgz}"
done
}
BuildDockerMultiplatform() {
go mod download
# run PrepareBuildDockerMusl before build
export PATH=$PATH:$PWD/build/musl-libs/bin
docker_lflags="--extldflags '-static -fpic' $ldflags"
export CGO_ENABLED=1
OS_ARCHES=(linux-amd64 linux-arm64 linux-386 linux-riscv64 linux-ppc64le linux-loong64) ## Disable linux-s390x builds
CGO_ARGS=(x86_64-linux-musl-gcc aarch64-linux-musl-gcc i486-linux-musl-gcc riscv64-linux-musl-gcc powerpc64le-linux-musl-gcc loongarch64-linux-musl-gcc) ## Disable s390x-linux-musl-gcc builds
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]}
os=${os_arch%%-*}
arch=${os_arch##*-}
export GOOS=$os
export GOARCH=$arch
export CC=${cgo_cc}
echo "building for $os_arch"
go build -o build/$os/$arch/"$appName" -ldflags="$docker_lflags" -tags=jsoniter .
done
DOCKER_ARM_ARCHES=(linux-arm/v6 linux-arm/v7)
CGO_ARGS=(armv6-linux-musleabihf-gcc armv7l-linux-musleabihf-gcc)
GO_ARM=(6 7)
export GOOS=linux
export GOARCH=arm
for i in "${!DOCKER_ARM_ARCHES[@]}"; do
docker_arch=${DOCKER_ARM_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]}
export GOARM=${GO_ARM[$i]}
export CC=${cgo_cc}
echo "building for $docker_arch"
go build -o build/${docker_arch%%-*}/${docker_arch##*-}/"$appName" -ldflags="$docker_lflags" -tags=jsoniter .
done
}
BuildRelease() {
rm -rf .git/
mkdir -p "build"
BuildWinArm64 ./build/"$appName"-windows-arm64.exe
BuildWin7 ./build/"$appName"-windows7
xgo -out "$appName" -ldflags="$ldflags" -tags=jsoniter .
# why? Because some target platforms seem to have issues with upx compression
# upx -9 ./"$appName"-linux-amd64
# cp ./"$appName"-windows-amd64.exe ./"$appName"-windows-amd64-upx.exe
# upx -9 ./"$appName"-windows-amd64-upx.exe
mv "$appName"-* build
# Build LoongArch with glibc (both old world abi1.0 and new world abi2.0)
# Separate from musl builds to avoid cache conflicts
BuildLoongGLIBC ./build/$appName-linux-loong64-abi1.0 abi1.0
BuildLoongGLIBC ./build/$appName-linux-loong64 abi2.0
}
BuildLoongGLIBC() {
local target_abi="$2"
local output_file="$1"
local oldWorldGoVersion="1.25.0"
if [ "$target_abi" = "abi1.0" ]; then
echo building for linux-loong64-abi1.0
else
echo building for linux-loong64-abi2.0
target_abi="abi2.0" # Default to abi2.0 if not specified
fi
# Note: No longer need global cache cleanup since ABI1.0 uses isolated cache directory
echo "Using optimized cache strategy: ABI1.0 has isolated cache, ABI2.0 uses standard cache"
if [ "$target_abi" = "abi1.0" ]; then
# Setup abi1.0 toolchain and patched Go compiler similar to cgo-action implementation
echo "Setting up Loongson old-world ABI1.0 toolchain and patched Go compiler..."
# Download and setup patched Go compiler for old-world
if ! curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/loong64-abi1.0-toolchains/releases/download/20250821/go${oldWorldGoVersion}.linux-amd64.tar.gz" \
-o go-loong64-abi1.0.tar.gz; then
echo "Error: Failed to download patched Go compiler for old-world ABI1.0"
if [ -n "$GITHUB_TOKEN" ]; then
echo "Error output from curl:"
curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/loong64-abi1.0-toolchains/releases/download/20250821/go${oldWorldGoVersion}.linux-amd64.tar.gz" \
-o go-loong64-abi1.0.tar.gz || true
fi
return 1
fi
rm -rf go-loong64-abi1.0
mkdir go-loong64-abi1.0
if ! tar -xzf go-loong64-abi1.0.tar.gz -C go-loong64-abi1.0 --strip-components=1; then
echo "Error: Failed to extract patched Go compiler"
return 1
fi
rm go-loong64-abi1.0.tar.gz
# Download and setup GCC toolchain for old-world
if ! curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/loong64-abi1.0-toolchains/releases/download/20250722/loongson-gnu-toolchain-8.3.novec-x86_64-loongarch64-linux-gnu-rc1.1.tar.xz" \
-o gcc8-loong64-abi1.0.tar.xz; then
echo "Error: Failed to download GCC toolchain for old-world ABI1.0"
if [ -n "$GITHUB_TOKEN" ]; then
echo "Error output from curl:"
curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/loong64-abi1.0-toolchains/releases/download/20250722/loongson-gnu-toolchain-8.3.novec-x86_64-loongarch64-linux-gnu-rc1.1.tar.xz" \
-o gcc8-loong64-abi1.0.tar.xz || true
fi
return 1
fi
rm -rf gcc8-loong64-abi1.0
mkdir gcc8-loong64-abi1.0
if ! tar -Jxf gcc8-loong64-abi1.0.tar.xz -C gcc8-loong64-abi1.0 --strip-components=1; then
echo "Error: Failed to extract GCC toolchain"
return 1
fi
rm gcc8-loong64-abi1.0.tar.xz
# Setup separate cache directory for ABI1.0 to avoid cache pollution
abi1_cache_dir="$(pwd)/go-loong64-abi1.0-cache"
mkdir -p "$abi1_cache_dir"
echo "Using separate cache directory for ABI1.0: $abi1_cache_dir"
# Use patched Go compiler for old-world build (critical for ABI1.0 compatibility)
echo "Building with patched Go compiler for old-world ABI1.0..."
echo "Using isolated cache directory: $abi1_cache_dir"
# Use env command to set environment variables locally without affecting global environment
if ! env GOOS=linux GOARCH=loong64 \
CC="$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-gcc" \
CXX="$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-g++" \
CGO_ENABLED=1 \
GOCACHE="$abi1_cache_dir" \
$(pwd)/go-loong64-abi1.0/bin/go build -a -o "$output_file" -ldflags="$ldflags" -tags=jsoniter .; then
echo "Error: Build failed with patched Go compiler"
echo "Attempting retry with cache cleanup..."
env GOCACHE="$abi1_cache_dir" $(pwd)/go-loong64-abi1.0/bin/go clean -cache
if ! env GOOS=linux GOARCH=loong64 \
CC="$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-gcc" \
CXX="$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-g++" \
CGO_ENABLED=1 \
GOCACHE="$abi1_cache_dir" \
$(pwd)/go-loong64-abi1.0/bin/go build -a -o "$output_file" -ldflags="$ldflags" -tags=jsoniter .; then
echo "Error: Build failed again after cache cleanup"
echo "Build environment details:"
echo "GOOS=linux"
echo "GOARCH=loong64"
echo "CC=$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-gcc"
echo "CXX=$(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-g++"
echo "CGO_ENABLED=1"
echo "GOCACHE=$abi1_cache_dir"
echo "Go version: $($(pwd)/go-loong64-abi1.0/bin/go version)"
echo "GCC version: $($(pwd)/gcc8-loong64-abi1.0/bin/loongarch64-linux-gnu-gcc --version | head -1)"
return 1
fi
fi
else
# Setup abi2.0 toolchain for new world glibc build
echo "Setting up new-world ABI2.0 toolchain..."
if ! curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/cross-tools/releases/download/20250507/x86_64-cross-tools-loongarch64-unknown-linux-gnu-legacy.tar.xz" \
-o gcc12-loong64-abi2.0.tar.xz; then
echo "Error: Failed to download GCC toolchain for new-world ABI2.0"
if [ -n "$GITHUB_TOKEN" ]; then
echo "Error output from curl:"
curl -fsSL --retry 3 -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://github.com/loong64/cross-tools/releases/download/20250507/x86_64-cross-tools-loongarch64-unknown-linux-gnu-legacy.tar.xz" \
-o gcc12-loong64-abi2.0.tar.xz || true
fi
return 1
fi
rm -rf gcc12-loong64-abi2.0
mkdir gcc12-loong64-abi2.0
if ! tar -Jxf gcc12-loong64-abi2.0.tar.xz -C gcc12-loong64-abi2.0 --strip-components=1; then
echo "Error: Failed to extract GCC toolchain"
return 1
fi
rm gcc12-loong64-abi2.0.tar.xz
export GOOS=linux
export GOARCH=loong64
export CC=$(pwd)/gcc12-loong64-abi2.0/bin/loongarch64-unknown-linux-gnu-gcc
export CXX=$(pwd)/gcc12-loong64-abi2.0/bin/loongarch64-unknown-linux-gnu-g++
export CGO_ENABLED=1
# Use standard Go compiler for new-world build
echo "Building with standard Go compiler for new-world ABI2.0..."
if ! go build -a -o "$output_file" -ldflags="$ldflags" -tags=jsoniter .; then
echo "Error: Build failed with standard Go compiler"
echo "Attempting retry with cache cleanup..."
go clean -cache
if ! go build -a -o "$output_file" -ldflags="$ldflags" -tags=jsoniter .; then
echo "Error: Build failed again after cache cleanup"
echo "Build environment details:"
echo "GOOS=$GOOS"
echo "GOARCH=$GOARCH"
echo "CC=$CC"
echo "CXX=$CXX"
echo "CGO_ENABLED=$CGO_ENABLED"
echo "Go version: $(go version)"
echo "GCC version: $($CC --version | head -1)"
return 1
fi
fi
fi
}
BuildReleaseLinuxMusl() {
rm -rf .git/
mkdir -p "build"
muslflags="--extldflags '-static -fpic' $ldflags"
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 loongarch64-linux-musl-cross)
for i in "${FILES[@]}"; do
url="${BASE}${i}.tgz"
curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
rm -f "${i}.tgz"
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 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 loongarch64-linux-musl-gcc)
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]}
echo building for ${os_arch}
export GOOS=${os_arch%%-*}
export GOARCH=${os_arch##*-}
export CC=${cgo_cc}
export CGO_ENABLED=1
go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
done
}
BuildReleaseLinuxMuslArm() {
rm -rf .git/
mkdir -p "build"
muslflags="--extldflags '-static -fpic' $ldflags"
BASE="https://github.com/OpenListTeam/musl-compilers/releases/latest/download/"
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
url="${BASE}${i}.tgz"
curl -fsSL -o "${i}.tgz" "${url}"
sudo tar xf "${i}.tgz" --strip-components 1 -C /usr/local
rm -f "${i}.tgz"
done
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)
GOARMS=('' '' '' '' '5' '5' '6' '6' '7' '7' '7')
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc=${CGO_ARGS[$i]}
arm=${GOARMS[$i]}
echo building for ${os_arch}
export GOOS=linux
export GOARCH=arm
export CC=${cgo_cc}
export CGO_ENABLED=1
export GOARM=${arm}
go build -o ./build/$appName-$os_arch -ldflags="$muslflags" -tags=jsoniter .
done
}
BuildReleaseAndroid() {
rm -rf .git/
mkdir -p "build"
wget https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
unzip android-ndk-r26b-linux.zip
rm android-ndk-r26b-linux.zip
OS_ARCHES=(amd64 arm64 386 arm)
CGO_ARGS=(x86_64-linux-android24-clang aarch64-linux-android24-clang i686-linux-android24-clang armv7a-linux-androideabi24-clang)
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc=$(realpath android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/${CGO_ARGS[$i]})
echo building for android-${os_arch}
export GOOS=android
export GOARCH=${os_arch##*-}
export CC=${cgo_cc}
export CGO_ENABLED=1
go build -o ./build/$appName-android-$os_arch -ldflags="$ldflags" -tags=jsoniter .
android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip ./build/$appName-android-$os_arch
done
}
BuildReleaseFreeBSD() {
rm -rf .git/
mkdir -p "build/freebsd"
# Get latest FreeBSD 14.x release version from GitHub
freebsd_version=$(eval "curl -fsSL --max-time 2 $githubAuthArgs \"https://api.github.com/repos/freebsd/freebsd-src/tags\"" | \
jq -r '.[].name' | \
grep '^release/14\.' | \
grep -v -- '-p[0-9]*$' | \
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)
GO_ARCHES=(amd64 arm64 386)
CGO_ARGS=(x86_64-unknown-freebsd${freebsd_version} aarch64-unknown-freebsd${freebsd_version} i386-unknown-freebsd${freebsd_version})
for i in "${!OS_ARCHES[@]}"; do
os_arch=${OS_ARCHES[$i]}
cgo_cc="clang --target=${CGO_ARGS[$i]} --sysroot=/opt/freebsd/${os_arch}"
echo building for freebsd-${os_arch}
sudo mkdir -p "/opt/freebsd/${os_arch}"
wget -q https://download.freebsd.org/releases/${os_arch}/${freebsd_version}-RELEASE/base.txz
sudo tar -xf ./base.txz -C /opt/freebsd/${os_arch}
rm base.txz
export GOOS=freebsd
export GOARCH=${GO_ARCHES[$i]}
export CC=${cgo_cc}
export CGO_ENABLED=1
export CGO_LDFLAGS="-fuse-ld=lld"
go build -o ./build/$appName-freebsd-$os_arch -ldflags="$ldflags" -tags=jsoniter .
done
}
MakeRelease() {
cd build
if [ -d compress ]; then
rm -rv compress
fi
mkdir compress
# Add -lite suffix if useLite is true
liteSuffix=""
if [ "$useLite" = true ]; then
liteSuffix="-lite"
fi
for i in $(find . -type f -name "$appName-linux-*"); do
cp "$i" "$appName"
tar -czvf compress/"$i$liteSuffix".tar.gz "$appName"
rm -f "$appName"
done
for i in $(find . -type f -name "$appName-android-*"); do
cp "$i" "$appName"
tar -czvf compress/"$i$liteSuffix".tar.gz "$appName"
rm -f "$appName"
done
for i in $(find . -type f -name "$appName-darwin-*"); do
cp "$i" "$appName"
tar -czvf compress/"$i$liteSuffix".tar.gz "$appName"
rm -f "$appName"
done
for i in $(find . -type f -name "$appName-freebsd-*"); do
cp "$i" "$appName"
tar -czvf compress/"$i$liteSuffix".tar.gz "$appName"
rm -f "$appName"
done
for i in $(find . -type f \( -name "$appName-windows-*" -o -name "$appName-windows7-*" \)); do
cp "$i" "$appName".exe
zip compress/$(echo $i | sed 's/\.[^.]*$//')$liteSuffix.zip "$appName".exe
rm -f "$appName".exe
done
cd compress
# Handle MD5 filename - add -lite suffix only if not already present
md5FileName="$1"
if [ "$useLite" = true ] && [[ "$1" != *"-lite.txt" ]]; then
md5FileName=$(echo "$1" | sed 's/\.txt$/-lite.txt/')
fi
find . -type f -print0 | xargs -0 md5sum >"$md5FileName"
cat "$md5FileName"
cd ../..
}
# Parse parameters to handle lite parameter position flexibility
buildType=""
dockerType=""
otherParam=""
for arg in "$@"; do
case $arg in
dev|beta|release|zip|prepare)
if [ -z "$buildType" ]; then
buildType="$arg"
fi
;;
docker|docker-multiplatform|linux_musl_arm|linux_musl|android|freebsd|web)
if [ -z "$dockerType" ]; then
dockerType="$arg"
fi
;;
lite)
# lite parameter is already handled above
;;
*)
if [ -z "$otherParam" ]; then
otherParam="$arg"
fi
;;
esac
done
if [ "$buildType" = "dev" ]; then
FetchWebRolling
if [ "$dockerType" = "docker" ]; then
BuildDocker
elif [ "$dockerType" = "docker-multiplatform" ]; then
BuildDockerMultiplatform
elif [ "$dockerType" = "web" ]; then
echo "web only"
else
BuildDev
fi
elif [ "$buildType" = "release" -o "$buildType" = "beta" ]; then
if [ "$buildType" = "beta" ]; then
FetchWebRolling
else
FetchWebRelease
fi
if [ "$dockerType" = "docker" ]; then
BuildDocker
elif [ "$dockerType" = "docker-multiplatform" ]; then
BuildDockerMultiplatform
elif [ "$dockerType" = "linux_musl_arm" ]; then
BuildReleaseLinuxMuslArm
if [ "$useLite" = true ]; then
MakeRelease "md5-linux-musl-arm-lite.txt"
else
MakeRelease "md5-linux-musl-arm.txt"
fi
elif [ "$dockerType" = "linux_musl" ]; then
BuildReleaseLinuxMusl
if [ "$useLite" = true ]; then
MakeRelease "md5-linux-musl-lite.txt"
else
MakeRelease "md5-linux-musl.txt"
fi
elif [ "$dockerType" = "android" ]; then
BuildReleaseAndroid
if [ "$useLite" = true ]; then
MakeRelease "md5-android-lite.txt"
else
MakeRelease "md5-android.txt"
fi
elif [ "$dockerType" = "freebsd" ]; then
BuildReleaseFreeBSD
if [ "$useLite" = true ]; then
MakeRelease "md5-freebsd-lite.txt"
else
MakeRelease "md5-freebsd.txt"
fi
elif [ "$dockerType" = "web" ]; then
echo "web only"
else
BuildRelease
if [ "$useLite" = true ]; then
MakeRelease "md5-lite.txt"
else
MakeRelease "md5.txt"
fi
fi
elif [ "$buildType" = "prepare" ]; then
if [ "$dockerType" = "docker-multiplatform" ]; then
PrepareBuildDockerMusl
fi
elif [ "$buildType" = "zip" ]; then
if [ -n "$otherParam" ]; then
if [ "$useLite" = true ]; then
MakeRelease "$otherParam-lite.txt"
else
MakeRelease "$otherParam.txt"
fi
elif [ -n "$dockerType" ]; then
if [ "$useLite" = true ]; then
MakeRelease "$dockerType-lite.txt"
else
MakeRelease "$dockerType.txt"
fi
else
if [ "$useLite" = true ]; then
MakeRelease "md5-lite.txt"
else
MakeRelease "md5.txt"
fi
fi
else
echo -e "Parameter error"
echo -e "Usage: $0 {dev|beta|release|zip|prepare} [docker|docker-multiplatform|linux_musl_arm|linux_musl|android|freebsd|web] [lite] [other_params]"
echo -e "Examples:"
echo -e " $0 dev"
echo -e " $0 dev lite"
echo -e " $0 dev docker"
echo -e " $0 dev docker lite"
echo -e " $0 release"
echo -e " $0 release lite"
echo -e " $0 release docker lite"
echo -e " $0 release linux_musl"
fi
================================================
FILE: cmd/admin.go
================================================
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/internal/setting"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
"github.com/OpenListTeam/OpenList/v4/pkg/utils/random"
"github.com/spf13/cobra"
)
// AdminCmd represents the password command
var AdminCmd = &cobra.Command{
Use: "admin",
Aliases: []string{"password"},
Short: "Show admin user's info and some operations about admin user's password",
Run: func(cmd *cobra.Command, args []string) {
bootstrap.Init()
defer bootstrap.Release()
admin, err := op.GetAdmin()
if err != nil {
utils.Log.Errorf("failed get admin user: %+v", err)
} else {
utils.Log.Infof("get admin user from CLI")
fmt.Println("Admin user's username:", admin.Username)
fmt.Println("The password can only be output at the first startup, and then stored as a hash value, which cannot be reversed")
fmt.Println("You can reset the password with a random string by running [openlist admin random]")
fmt.Println("You can also set a new password by running [openlist admin set NEW_PASSWORD]")
}
},
}
var RandomPasswordCmd = &cobra.Command{
Use: "random",
Short: "Reset admin user's password to a random string",
Run: func(cmd *cobra.Command, args []string) {
utils.Log.Infof("reset admin user's password to a random string from CLI")
newPwd := random.String(8)
setAdminPassword(newPwd)
},
}
var SetPasswordCmd = &cobra.Command{
Use: "set",
Short: "Set admin user's password",
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) == 0 {
return fmt.Errorf("Please enter the new password")
}
setAdminPassword(args[0])
return nil
},
}
var ShowTokenCmd = &cobra.Command{
Use: "token",
Short: "Show admin token",
Run: func(cmd *cobra.Command, args []string) {
bootstrap.Init()
defer bootstrap.Release()
token := setting.GetStr(conf.Token)
utils.Log.Infof("show admin token from CLI")
fmt.Println("Admin token:", token)
},
}
func setAdminPassword(pwd string) {
bootstrap.Init()
defer bootstrap.Release()
admin, err := op.GetAdmin()
if err != nil {
utils.Log.Errorf("failed get admin user: %+v", err)
return
}
admin.SetPassword(pwd)
if err := op.UpdateUser(admin); err != nil {
utils.Log.Errorf("failed update admin user: %+v", err)
return
}
utils.Log.Infof("admin user has been update from CLI")
fmt.Println("admin user has been updated:")
fmt.Println("username:", admin.Username)
fmt.Println("password:", pwd)
DelAdminCacheOnline()
}
func init() {
RootCmd.AddCommand(AdminCmd)
AdminCmd.AddCommand(RandomPasswordCmd)
AdminCmd.AddCommand(SetPasswordCmd)
AdminCmd.AddCommand(ShowTokenCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// passwordCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// passwordCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/cancel2FA.go
================================================
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
"github.com/spf13/cobra"
)
// Cancel2FACmd represents the delete2fa command
var Cancel2FACmd = &cobra.Command{
Use: "cancel2fa",
Short: "Delete 2FA of admin user",
Run: func(cmd *cobra.Command, args []string) {
bootstrap.Init()
defer bootstrap.Release()
admin, err := op.GetAdmin()
if err != nil {
utils.Log.Errorf("failed to get admin user: %+v", err)
} else {
err := op.Cancel2FAByUser(admin)
if err != nil {
utils.Log.Errorf("failed to cancel 2FA: %+v", err)
} else {
utils.Log.Infof("2FA is canceled from CLI")
fmt.Println("2FA canceled")
DelAdminCacheOnline()
}
}
},
}
func init() {
RootCmd.AddCommand(Cancel2FACmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// cancel2FACmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// cancel2FACmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/common.go
================================================
package cmd
import (
"os"
"path/filepath"
"strconv"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
log "github.com/sirupsen/logrus"
)
func Init() {
bootstrap.Init()
}
func Release() {
bootstrap.Release()
}
var pid = -1
var pidFile string
func initDaemon() {
ex, err := os.Executable()
if err != nil {
log.Fatal(err)
}
exPath := filepath.Dir(ex)
_ = os.MkdirAll(filepath.Join(exPath, "daemon"), 0700)
pidFile = filepath.Join(exPath, "daemon/pid")
if utils.Exists(pidFile) {
bytes, err := os.ReadFile(pidFile)
if err != nil {
log.Fatal("failed to read pid file", err)
}
id, err := strconv.Atoi(string(bytes))
if err != nil {
log.Fatal("failed to parse pid data", err)
}
pid = id
}
}
================================================
FILE: cmd/crypt.go
================================================
package cmd
import (
"io"
"os"
"path"
"path/filepath"
"strings"
rcCrypt "github.com/rclone/rclone/backend/crypt"
"github.com/rclone/rclone/fs/config/configmap"
"github.com/rclone/rclone/fs/config/obscure"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// encryption and decryption command format for Crypt driver
type options struct {
op string //decrypt or encrypt
src string //source dir or file
dst string //out destination
pwd string //de/encrypt password
salt string
filenameEncryption string //reference drivers\crypt\meta.go Addtion
dirnameEncryption string
filenameEncode string
suffix string
}
var opt options
// CryptCmd represents the crypt command
var CryptCmd = &cobra.Command{
Use: "crypt",
Short: "Encrypt or decrypt local file or dir",
Example: `openlist crypt -s ./src/encrypt/ --op=de --pwd=123456 --salt=345678`,
Run: func(cmd *cobra.Command, args []string) {
opt.validate()
opt.cryptFileDir()
},
}
func init() {
RootCmd.AddCommand(CryptCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// versionCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
CryptCmd.Flags().StringVarP(&opt.src, "src", "s", "", "src file or dir to encrypt/decrypt")
CryptCmd.Flags().StringVarP(&opt.dst, "dst", "d", "", "dst dir to output,if not set,output to src dir")
CryptCmd.Flags().StringVar(&opt.op, "op", "", "de or en which stands for decrypt or encrypt")
CryptCmd.Flags().StringVar(&opt.pwd, "pwd", "", "password used to encrypt/decrypt,if not contain ___Obfuscated___ prefix,will be obfuscated before used")
CryptCmd.Flags().StringVar(&opt.salt, "salt", "", "salt used to encrypt/decrypt,if not contain ___Obfuscated___ prefix,will be obfuscated before used")
CryptCmd.Flags().StringVar(&opt.filenameEncryption, "filename-encrypt", "off", "filename encryption mode: off,standard,obfuscate")
CryptCmd.Flags().StringVar(&opt.dirnameEncryption, "dirname-encrypt", "false", "is dirname encryption enabled:true,false")
CryptCmd.Flags().StringVar(&opt.filenameEncode, "filename-encode", "base64", "filename encoding mode: base64,base32,base32768")
CryptCmd.Flags().StringVar(&opt.suffix, "suffix", ".bin", "suffix for encrypted file,default is .bin")
}
func (o *options) validate() {
if o.src == "" {
log.Fatal("src can not be empty")
}
if o.op != "encrypt" && o.op != "decrypt" && o.op != "en" && o.op != "de" {
log.Fatal("op must be encrypt or decrypt")
}
if o.filenameEncryption != "off" && o.filenameEncryption != "standard" && o.filenameEncryption != "obfuscate" {
log.Fatal("filename_encryption must be off,standard,obfuscate")
}
if o.filenameEncode != "base64" && o.filenameEncode != "base32" && o.filenameEncode != "base32768" {
log.Fatal("filename_encode must be base64,base32,base32768")
}
}
func (o *options) cryptFileDir() {
src, _ := filepath.Abs(o.src)
log.Infof("src abs is %v", src)
fileInfo, err := os.Stat(src)
if err != nil {
log.Fatalf("reading file/dir %v failed,err:%v", src, err)
}
pwd := updateObfusParm(o.pwd)
salt := updateObfusParm(o.salt)
//create cipher
config := configmap.Simple{
"password": pwd,
"password2": salt,
"filename_encryption": o.filenameEncryption,
"directory_name_encryption": o.dirnameEncryption,
"filename_encoding": o.filenameEncode,
"suffix": o.suffix,
"pass_bad_blocks": "",
}
log.Infof("config:%v", config)
cipher, err := rcCrypt.NewCipher(config)
if err != nil {
log.Fatalf("create cipher failed,err:%v", err)
}
dst := ""
//check and create dst dir
if o.dst != "" {
dst, _ = filepath.Abs(o.dst)
checkCreateDir(dst)
}
// src is file
if !fileInfo.IsDir() { //file
if dst == "" {
dst = filepath.Dir(src)
}
o.cryptFile(cipher, src, dst)
return
}
// src is dir
if dst == "" {
//if src is dir and not set dst dir ,create ${src}_crypt dir as dst dir
dst = path.Join(filepath.Dir(src), fileInfo.Name()+"_crypt")
}
log.Infof("dst : %v", dst)
dirnameMap := make(map[string]string)
pathSeparator := string(os.PathSeparator)
filepath.Walk(src, func(p string, info os.FileInfo, err error) error {
if err != nil {
log.Errorf("get file %v info failed, err:%v", p, err)
return err
}
if p == src {
return nil
}
log.Infof("current path %v", p)
// relative path
rp := strings.ReplaceAll(p, src, "")
log.Infof("relative path %v", rp)
rpds := strings.Split(rp, pathSeparator)
if info.IsDir() {
// absolute dst dir for current path
dd := ""
if o.dirnameEncryption == "true" {
if o.op == "encrypt" || o.op == "en" {
for i := range rpds {
oname := rpds[i]
if _, ok := dirnameMap[rpds[i]]; ok {
rpds[i] = dirnameMap[rpds[i]]
} else {
rpds[i] = cipher.EncryptDirName(rpds[i])
dirnameMap[oname] = rpds[i]
}
}
dd = path.Join(dst, strings.Join(rpds, pathSeparator))
} else {
for i := range rpds {
oname := rpds[i]
if _, ok := dirnameMap[rpds[i]]; ok {
rpds[i] = dirnameMap[rpds[i]]
} else {
dnn, err := cipher.DecryptDirName(rpds[i])
if err != nil {
log.Fatalf("decrypt dir name %v failed,err:%v", rpds[i], err)
}
rpds[i] = dnn
dirnameMap[oname] = dnn
}
}
dd = path.Join(dst, strings.Join(rpds, pathSeparator))
}
} else {
dd = path.Join(dst, rp)
}
log.Infof("create output dir %v", dd)
checkCreateDir(dd)
return nil
}
// file dst dir
fdd := dst
if o.dirnameEncryption == "true" {
for i := range rpds {
if i == len(rpds)-1 {
break
}
fdd = path.Join(fdd, dirnameMap[rpds[i]])
}
} else {
fdd = path.Join(fdd, strings.Join(rpds[:len(rpds)-1], pathSeparator))
}
log.Infof("file output dir %v", fdd)
o.cryptFile(cipher, p, fdd)
return nil
})
}
func (o *options) cryptFile(cipher *rcCrypt.Cipher, src string, dst string) {
fileInfo, err := os.Stat(src)
if err != nil {
log.Fatalf("get file %v info failed,err:%v", src, err)
}
fd, err := os.OpenFile(src, os.O_RDWR, 0666)
if err != nil {
log.Fatalf("open file %v failed,err:%v", src, err)
}
defer fd.Close()
var cryptSrcReader io.Reader
var outFile string
if o.op == "encrypt" || o.op == "en" {
filename := fileInfo.Name()
if o.filenameEncryption != "off" {
filename = cipher.EncryptFileName(fileInfo.Name())
log.Infof("encrypt file name %v to %v", fileInfo.Name(), filename)
} else {
filename = fileInfo.Name() + o.suffix
}
cryptSrcReader, err = cipher.EncryptData(fd)
if err != nil {
log.Fatalf("encrypt file %v failed,err:%v", src, err)
}
outFile = path.Join(dst, filename)
} else {
filename := fileInfo.Name()
if o.filenameEncryption != "off" {
filename, err = cipher.DecryptFileName(filename)
if err != nil {
log.Fatalf("decrypt file name %v failed,err:%v", src, err)
}
log.Infof("decrypt file name %v to %v, ", fileInfo.Name(), filename)
} else {
filename = strings.TrimSuffix(filename, o.suffix)
}
cryptSrcReader, err = cipher.DecryptData(fd)
if err != nil {
log.Fatalf("decrypt file %v failed,err:%v", src, err)
}
outFile = path.Join(dst, filename)
}
//write new file
wr, err := os.OpenFile(outFile, os.O_CREATE|os.O_WRONLY, 0755)
if err != nil {
log.Fatalf("create file %v failed,err:%v", outFile, err)
}
defer wr.Close()
_, err = io.Copy(wr, cryptSrcReader)
if err != nil {
log.Fatalf("write file %v failed,err:%v", outFile, err)
}
}
// check dir exist ,if not ,create
func checkCreateDir(dir string) {
_, err := os.Stat(dir)
if os.IsNotExist(err) {
err := os.MkdirAll(dir, 0755)
if err != nil {
log.Fatalf("create dir %v failed,err:%v", dir, err)
}
return
} else if err != nil {
log.Fatalf("read dir %v err: %v", dir, err)
}
}
func updateObfusParm(str string) string {
obfuscatedPrefix := "___Obfuscated___"
if !strings.HasPrefix(str, obfuscatedPrefix) {
str, err := obscure.Obscure(str)
if err != nil {
log.Fatalf("update obfuscated parameter failed,err:%v", str)
}
} else {
str, _ = strings.CutPrefix(str, obfuscatedPrefix)
}
return str
}
================================================
FILE: cmd/flags/config.go
================================================
package flags
var (
DataDir string
ConfigPath string
Debug bool
NoPrefix bool
Dev bool
ForceBinDir bool
LogStd bool
)
================================================
FILE: cmd/kill.go
================================================
package cmd
import (
"os"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// KillCmd represents the kill command
var KillCmd = &cobra.Command{
Use: "kill",
Short: "Force kill openlist server process by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) {
kill()
},
}
func kill() {
initDaemon()
if pid == -1 {
log.Info("Seems not have been started. Try use `openlist start` to start server.")
return
}
process, err := os.FindProcess(pid)
if err != nil {
log.Errorf("failed to find process by pid: %d, reason: %v", pid, process)
return
}
err = process.Kill()
if err != nil {
log.Errorf("failed to kill process %d: %v", pid, err)
} else {
log.Info("killed process: ", pid)
}
err = os.Remove(pidFile)
if err != nil {
log.Errorf("failed to remove pid file")
}
pid = -1
}
func init() {
RootCmd.AddCommand(KillCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// stopCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// stopCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/lang.go
================================================
/*
Package cmd
Copyright © 2022 Noah Hsu<i@nn.ci>
*/
package cmd
import (
"fmt"
"io"
"os"
"strings"
_ "github.com/OpenListTeam/OpenList/v4/drivers"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap/data"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
type KV[V any] map[string]V
type Drivers KV[KV[interface{}]]
var frontendPath string
func firstUpper(s string) string {
if s == "" {
return ""
}
return strings.ToUpper(s[:1]) + s[1:]
}
func convert(s string) string {
ss := strings.Split(s, "_")
ans := strings.Join(ss, " ")
return firstUpper(ans)
}
func writeFile(name string, data interface{}) {
f, err := os.Open(fmt.Sprintf("%s/src/lang/en/%s.json", frontendPath, name))
if err != nil {
log.Errorf("failed to open %s.json: %+v", name, err)
return
}
defer f.Close()
content, err := io.ReadAll(f)
if err != nil {
log.Errorf("failed to read %s.json: %+v", name, err)
return
}
oldData := make(map[string]interface{})
newData := make(map[string]interface{})
err = utils.Json.Unmarshal(content, &oldData)
if err != nil {
log.Errorf("failed to unmarshal %s.json: %+v", name, err)
return
}
content, err = utils.Json.Marshal(data)
if err != nil {
log.Errorf("failed to marshal json: %+v", err)
return
}
err = utils.Json.Unmarshal(content, &newData)
if err != nil {
log.Errorf("failed to unmarshal json: %+v", err)
return
}
if mergeJson(newData, oldData) {
log.Infof("%s.json no changed, skip", name)
} else {
log.Infof("%s.json changed, update file", name)
//log.Infof("old: %+v\nnew:%+v", oldData, data)
utils.WriteJsonToFile(fmt.Sprintf("lang/%s.json", name), oldData, true)
}
}
func mergeJson(source, target map[string]interface{}) bool {
equal := true
for k, v := range source {
tgtV, tgtOk := target[k]
if !tgtOk {
equal = false
target[k] = v
} else {
srcMap, srcIsMap := v.(map[string]interface{})
tgtMap, tgtIsMap := tgtV.(map[string]interface{})
if srcIsMap && tgtIsMap {
equal = mergeJson(srcMap, tgtMap) && equal
}
}
}
return equal
}
func generateDriversJson() {
drivers := make(Drivers)
drivers["drivers"] = make(KV[interface{}])
drivers["config"] = make(KV[interface{}])
driverInfoMap := op.GetDriverInfoMap()
for k, v := range driverInfoMap {
drivers["drivers"][k] = convert(k)
items := make(KV[interface{}])
config := map[string]string{}
if v.Config.Alert != "" {
alert := strings.SplitN(v.Config.Alert, "|", 2)
if len(alert) > 1 {
config["alert"] = alert[1]
}
}
drivers["config"][k] = config
for i := range v.Additional {
item := v.Additional[i]
items[item.Name] = convert(item.Name)
if item.Help != "" {
items[fmt.Sprintf("%s-tips", item.Name)] = item.Help
}
if item.Type == conf.TypeSelect && len(item.Options) > 0 {
options := make(KV[string])
_options := strings.Split(item.Options, ",")
for _, o := range _options {
options[o] = convert(o)
}
items[fmt.Sprintf("%ss", item.Name)] = options
}
}
drivers[k] = items
}
writeFile("drivers", drivers)
}
func generateSettingsJson() {
settings := data.InitialSettings()
settingsLang := make(KV[any])
for _, setting := range settings {
settingsLang[setting.Key] = convert(setting.Key)
if setting.Help != "" {
settingsLang[fmt.Sprintf("%s-tips", setting.Key)] = setting.Help
}
if setting.Type == conf.TypeSelect && len(setting.Options) > 0 {
options := make(KV[string])
_options := strings.Split(setting.Options, ",")
for _, o := range _options {
options[o] = convert(o)
}
settingsLang[fmt.Sprintf("%ss", setting.Key)] = options
}
}
writeFile("settings", settingsLang)
//utils.WriteJsonToFile("lang/settings.json", settingsLang)
}
// LangCmd represents the lang command
var LangCmd = &cobra.Command{
Use: "lang",
Short: "Generate language json file",
Run: func(cmd *cobra.Command, args []string) {
frontendPath, _ = cmd.Flags().GetString("frontend-path")
bootstrap.InitConfig()
err := os.MkdirAll("lang", 0777)
if err != nil {
utils.Log.Fatalf("failed create folder: %s", err.Error())
}
generateDriversJson()
generateSettingsJson()
},
}
func init() {
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.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// langCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// langCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/restart.go
================================================
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"github.com/spf13/cobra"
)
// RestartCmd represents the restart command
var RestartCmd = &cobra.Command{
Use: "restart",
Short: "Restart openlist server by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) {
stop()
start()
},
}
func init() {
RootCmd.AddCommand(RestartCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// restartCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// restartCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/root.go
================================================
package cmd
import (
"fmt"
"os"
"github.com/OpenListTeam/OpenList/v4/cmd/flags"
_ "github.com/OpenListTeam/OpenList/v4/drivers"
_ "github.com/OpenListTeam/OpenList/v4/internal/archive"
_ "github.com/OpenListTeam/OpenList/v4/internal/offline_download"
"github.com/spf13/cobra"
)
var RootCmd = &cobra.Command{
Use: "openlist",
Short: "A file list program that supports multiple storage.",
Long: `A file list program that supports multiple storage,
built with love by OpenListTeam.
Complete documentation is available at https://doc.oplist.org/`,
}
func Execute() {
if err := RootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func init() {
RootCmd.PersistentFlags().StringVar(&flags.DataDir, "data", "data", "data directory (relative paths are resolved against the current working directory)")
RootCmd.PersistentFlags().StringVar(&flags.ConfigPath, "config", "", "path to config.json (relative to current working directory; defaults to [data directory]/config.json, where [data directory] is set by --data)")
RootCmd.PersistentFlags().BoolVar(&flags.Debug, "debug", false, "start with debug mode")
RootCmd.PersistentFlags().BoolVar(&flags.NoPrefix, "no-prefix", false, "disable env prefix")
RootCmd.PersistentFlags().BoolVar(&flags.Dev, "dev", false, "start with dev mode")
RootCmd.PersistentFlags().BoolVar(&flags.ForceBinDir, "force-bin-dir", false, "Force to use the directory where the binary file is located as data directory")
RootCmd.PersistentFlags().BoolVar(&flags.LogStd, "log-std", false, "Force to log to std")
}
================================================
FILE: cmd/server.go
================================================
package cmd
import (
"os"
"os/signal"
"syscall"
"time"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/spf13/cobra"
)
// ServerCmd represents the server command
var ServerCmd = &cobra.Command{
Use: "server",
Short: "Start the server at the specified address",
Long: `Start the server at the specified address
the address is defined in config file`,
Run: func(cmd *cobra.Command, args []string) {
bootstrap.Init()
defer bootstrap.Release()
bootstrap.Start()
// Wait for interrupt signal to gracefully shutdown the server with
// a timeout of 1 second.
quit := make(chan os.Signal, 1)
// kill (no param) default send syscanll.SIGTERM
// kill -2 is syscall.SIGINT
// kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
bootstrap.Shutdown(1 * time.Second)
},
}
func init() {
RootCmd.AddCommand(ServerCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// serverCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// serverCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
// OutOpenListInit 暴露用于外部启动server的函数
func OutOpenListInit() {
var (
cmd *cobra.Command
args []string
)
ServerCmd.Run(cmd, args)
}
================================================
FILE: cmd/start.go
================================================
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"os"
"os/exec"
"path/filepath"
"strconv"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// StartCmd represents the start command
var StartCmd = &cobra.Command{
Use: "start",
Short: "Silent start openlist server with `--force-bin-dir`",
Run: func(cmd *cobra.Command, args []string) {
start()
},
}
func start() {
initDaemon()
if pid != -1 {
_, err := os.FindProcess(pid)
if err == nil {
log.Info("openlist already started, pid ", pid)
return
}
}
args := os.Args
args[1] = "server"
args = append(args, "--force-bin-dir")
cmd := &exec.Cmd{
Path: args[0],
Args: args,
Env: os.Environ(),
}
stdout, err := os.OpenFile(filepath.Join(filepath.Dir(pidFile), "start.log"), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
log.Fatal(os.Getpid(), ": failed to open start log file:", err)
}
cmd.Stderr = stdout
cmd.Stdout = stdout
err = cmd.Start()
if err != nil {
log.Fatal("failed to start children process: ", err)
}
log.Infof("success start pid: %d", cmd.Process.Pid)
err = os.WriteFile(pidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0666)
if err != nil {
log.Warn("failed to record pid, you may not be able to stop the program with `./openlist stop`")
}
}
func init() {
RootCmd.AddCommand(StartCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// startCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// startCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/stop_default.go
================================================
//go:build !windows
package cmd
import (
"os"
"syscall"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// StopCmd represents the stop command
var StopCmd = &cobra.Command{
Use: "stop",
Short: "Stop openlist server by daemon/pid file",
Run: func(cmd *cobra.Command, args []string) {
stop()
},
}
func stop() {
initDaemon()
if pid == -1 {
log.Info("Seems not have been started. Try use `openlist start` to start server.")
return
}
process, err := os.FindProcess(pid)
if err != nil {
log.Errorf("failed to find process by pid: %d, reason: %v", pid, process)
return
}
err = process.Signal(syscall.SIGTERM)
if err != nil {
log.Errorf("failed to terminate process %d: %v", pid, err)
} else {
log.Info("terminated process: ", pid)
}
err = os.Remove(pidFile)
if err != nil {
log.Errorf("failed to remove pid file")
}
pid = -1
}
func init() {
RootCmd.AddCommand(StopCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// stopCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// stopCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/stop_windows.go
================================================
//go:build windows
package cmd
import (
"github.com/spf13/cobra"
)
// StopCmd represents the stop command
var StopCmd = &cobra.Command{
Use: "stop",
Short: "Same as the kill command",
Run: func(cmd *cobra.Command, args []string) {
stop()
},
}
func stop() {
kill()
}
func init() {
RootCmd.AddCommand(StopCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// stopCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// stopCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/storage.go
================================================
/*
Copyright © 2023 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"os"
"strconv"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
"github.com/OpenListTeam/OpenList/v4/internal/db"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
"github.com/charmbracelet/bubbles/table"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/spf13/cobra"
)
// storageCmd represents the storage command
var storageCmd = &cobra.Command{
Use: "storage",
Short: "Manage storage",
}
var disableStorageCmd = &cobra.Command{
Use: "disable [mount path]",
Short: "Disable a storage by mount path",
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return fmt.Errorf("mount path is required")
}
mountPath := args[0]
bootstrap.Init()
defer bootstrap.Release()
storage, err := db.GetStorageByMountPath(mountPath)
if err != nil {
return fmt.Errorf("failed to query storage: %+v", err)
}
storage.Disabled = true
err = db.UpdateStorage(storage)
if err != nil {
return fmt.Errorf("failed to update storage: %+v", err)
}
utils.Log.Infof("Storage with mount path [%s] has been disabled from CLI", mountPath)
fmt.Printf("Storage with mount path [%s] has been disabled\n", mountPath)
return nil
},
}
var deleteStorageCmd = &cobra.Command{
Use: "delete [id]",
Short: "Delete a storage by id",
RunE: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return fmt.Errorf("id is required")
}
id, err := strconv.Atoi(args[0])
if err != nil {
return fmt.Errorf("id must be a number")
}
if force, _ := cmd.Flags().GetBool("force"); force {
fmt.Printf("Are you sure you want to delete storage with id [%d]? [y/N]: ", id)
var confirm string
fmt.Scanln(&confirm)
if confirm != "y" && confirm != "Y" {
fmt.Println("Delete operation cancelled.")
return nil
}
}
bootstrap.Init()
defer bootstrap.Release()
err = db.DeleteStorageById(uint(id))
if err != nil {
return fmt.Errorf("failed to delete storage by id: %+v", err)
}
utils.Log.Infof("Storage with id [%d] have been deleted from CLI", id)
fmt.Printf("Storage with id [%d] have been deleted\n", id)
return nil
},
}
var baseStyle = lipgloss.NewStyle().
BorderStyle(lipgloss.NormalBorder()).
BorderForeground(lipgloss.Color("240"))
type model struct {
table table.Model
}
func (m model) Init() tea.Cmd { return nil }
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "esc":
if m.table.Focused() {
m.table.Blur()
} else {
m.table.Focus()
}
case "q", "ctrl+c":
return m, tea.Quit
//case "enter":
// return m, tea.Batch(
// tea.Printf("Let's go to %s!", m.table.SelectedRow()[1]),
// )
}
}
m.table, cmd = m.table.Update(msg)
return m, cmd
}
func (m model) View() string {
return baseStyle.Render(m.table.View()) + "\n"
}
var storageTableHeight int
var listStorageCmd = &cobra.Command{
Use: "list",
Short: "List all storages",
RunE: func(cmd *cobra.Command, args []string) error {
bootstrap.Init()
defer bootstrap.Release()
storages, _, err := db.GetStorages(1, -1)
if err != nil {
return fmt.Errorf("failed to query storages: %+v", err)
} else {
fmt.Printf("Found %d storages\n", len(storages))
columns := []table.Column{
{Title: "ID", Width: 4},
{Title: "Driver", Width: 16},
{Title: "Mount Path", Width: 30},
{Title: "Enabled", Width: 7},
}
var rows []table.Row
for i := range storages {
storage := storages[i]
enabled := "true"
if storage.Disabled {
enabled = "false"
}
rows = append(rows, table.Row{
strconv.Itoa(int(storage.ID)),
storage.Driver,
storage.MountPath,
enabled,
})
}
t := table.New(
table.WithColumns(columns),
table.WithRows(rows),
table.WithFocused(true),
table.WithHeight(storageTableHeight),
)
s := table.DefaultStyles()
s.Header = s.Header.
BorderStyle(lipgloss.NormalBorder()).
BorderForeground(lipgloss.Color("240")).
BorderBottom(true).
Bold(false)
s.Selected = s.Selected.
Foreground(lipgloss.Color("229")).
Background(lipgloss.Color("57")).
Bold(false)
t.SetStyles(s)
m := model{t}
if _, err := tea.NewProgram(m).Run(); err != nil {
fmt.Printf("failed to run program: %+v\n", err)
os.Exit(1)
}
}
return nil
},
}
func init() {
RootCmd.AddCommand(storageCmd)
storageCmd.AddCommand(disableStorageCmd)
storageCmd.AddCommand(listStorageCmd)
storageCmd.PersistentFlags().IntVarP(&storageTableHeight, "height", "H", 10, "Table height")
storageCmd.AddCommand(deleteStorageCmd)
deleteStorageCmd.Flags().BoolP("force", "f", false, "Force delete without confirmation")
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// storageCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// storageCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: cmd/user.go
================================================
package cmd
import (
"crypto/tls"
"fmt"
"time"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/internal/op"
"github.com/OpenListTeam/OpenList/v4/internal/setting"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
"github.com/go-resty/resty/v2"
)
func DelAdminCacheOnline() {
admin, err := op.GetAdmin()
if err != nil {
utils.Log.Errorf("[del_admin_cache] get admin error: %+v", err)
return
}
DelUserCacheOnline(admin.Username)
}
func DelUserCacheOnline(username string) {
client := resty.New().SetTimeout(1 * time.Second).SetTLSClientConfig(&tls.Config{InsecureSkipVerify: conf.Conf.TlsInsecureSkipVerify})
token := setting.GetStr(conf.Token)
port := conf.Conf.Scheme.HttpPort
u := fmt.Sprintf("http://localhost:%d/api/admin/user/del_cache", port)
if port == -1 {
if conf.Conf.Scheme.HttpsPort == -1 {
utils.Log.Warnf("[del_user_cache] no open port")
return
}
u = fmt.Sprintf("https://localhost:%d/api/admin/user/del_cache", conf.Conf.Scheme.HttpsPort)
}
res, err := client.R().SetHeader("Authorization", token).SetQueryParam("username", username).Post(u)
if err != nil {
utils.Log.Warnf("[del_user_cache_online] failed: %+v", err)
return
}
if res.StatusCode() != 200 {
utils.Log.Warnf("[del_user_cache_online] failed: %+v", res.String())
return
}
code := utils.Json.Get(res.Body(), "code").ToInt()
msg := utils.Json.Get(res.Body(), "message").ToString()
if code != 200 {
utils.Log.Errorf("[del_user_cache_online] error: %s", msg)
return
}
utils.Log.Debugf("[del_user_cache_online] del user [%s] cache success", username)
}
================================================
FILE: cmd/version.go
================================================
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"os"
"runtime"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/spf13/cobra"
)
// VersionCmd represents the version command
var VersionCmd = &cobra.Command{
Use: "version",
Short: "Show current version of OpenList",
Run: func(cmd *cobra.Command, args []string) {
goVersion := fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH)
fmt.Printf(`Built At: %s
Go Version: %s
Author: %s
Commit ID: %s
Version: %s
WebVersion: %s
`, conf.BuiltAt, goVersion, conf.GitAuthor, conf.GitCommit, conf.Version, conf.WebVersion)
os.Exit(0)
},
}
func init() {
RootCmd.AddCommand(VersionCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// versionCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
================================================
FILE: docker-compose.yml
================================================
services:
openlist:
restart: always
volumes:
- '/etc/openlist:/opt/openlist/data'
ports:
- '5244:5244'
- '5245:5245'
user: '0:0'
environment:
- UMASK=022
- TZ=Asia/Shanghai
container_name: openlist
image: 'openlistteam/openlist:latest'
================================================
FILE: drivers/115/appver.go
================================================
package _115
import (
"errors"
"github.com/OpenListTeam/OpenList/v4/drivers/base"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
log "github.com/sirupsen/logrus"
)
var (
md5Salt = "Qclm8MGWUv59TnrR0XPg"
appVer = "35.6.0.3"
)
func (d *Pan115) getAppVersion() (string, error) {
result := VersionResp{}
res, err := base.RestyClient.R().Get(driver115.ApiGetVersion)
if err != nil {
return "", err
}
err = utils.Json.Unmarshal(res.Body(), &result)
if err != nil {
return "", err
}
if len(result.Error) > 0 {
return "", errors.New(result.Error)
}
return result.Data.Win.Version, nil
}
func (d *Pan115) getAppVer() string {
ver, err := d.getAppVersion()
if err != nil {
log.Warnf("[115] get app version failed: %v", err)
return appVer
}
if len(ver) > 0 {
return ver
}
return appVer
}
func (d *Pan115) initAppVer() {
appVer = d.getAppVer()
log.Debugf("use app version: %v", appVer)
}
type VersionResp struct {
Error string `json:"error,omitempty"`
Data Versions `json:"data"`
}
type Versions struct {
Win Version `json:"win"`
}
type Version struct {
Version string `json:"version_code"`
}
================================================
FILE: drivers/115/driver.go
================================================
package _115
import (
"context"
"strings"
"sync"
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/model"
streamPkg "github.com/OpenListTeam/OpenList/v4/internal/stream"
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
driver115 "github.com/SheltonZhu/115driver/pkg/driver"
"github.com/pkg/errors"
"golang.org/x/time/rate"
)
type Pan115 struct {
model.Storage
Addition
client *driver115.Pan115Client
limiter *rate.Limiter
appVerOnce sync.Once
}
func (d *Pan115) Config() driver.Config {
return config
}
func (d *Pan115) GetAddition() driver.Additional {
return &d.Addition
}
func (d *Pan115) Init(ctx context.Context) error {
d.appVerOnce.Do(d.initAppVer)
if d.LimitRate > 0 {
d.limiter = rate.NewLimiter(rate.Limit(d.LimitRate), 1)
}
return d.login()
}
func (d *Pan115) WaitLimit(ctx context.Context) error {
if d.limiter != nil {
return d.limiter.Wait(ctx)
}
return nil
}
func (d *Pan115) Drop(ctx context.Context) error {
return nil
}
func (d *Pan115) List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
files, err := d.getFiles(dir.GetID())
if err != nil && !errors.Is(err, driver115.ErrNotExist) {
return nil, err
}
return utils.SliceConvert(files, func(src FileObj) (model.Obj, error) {
return &src, nil
})
}
func (d *Pan115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
userAgent := args.Header.Get("User-Agent")
downloadInfo, err := d.client.DownloadWithUA(file.(*FileObj).PickCode, userAgent)
if err != nil {
return nil, err
}
link := &model.Link{
URL: downloadInfo.Url.Url,
Header: downloadInfo.Header,
}
return link, nil
}
func (d *Pan115) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
result := driver115.MkdirResp{}
form := map[string]string{
"pid": parentDir.GetID(),
"cname": dirName,
}
req := d.client.NewRequest().
SetFormData(form).
SetResult(&result).
ForceContentType("application/json;charset=UTF-8")
resp, err := req.Post(driver115.ApiDirAdd)
err = driver115.CheckErr(err, &result, resp)
if err != nil {
return nil, err
}
f, err := d.getNewFile(result.FileID)
if err != nil {
return nil, nil
}
return f, nil
}
func (d *Pan115) Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
if err := d.client.Move(dstDir.GetID(), srcObj.GetID()); err != nil {
return nil, err
}
f, err := d.getNewFile(srcObj.GetID())
if err != nil {
return nil, nil
}
return f, nil
}
func (d *Pan115) Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
if err := d.client.Rename(srcObj.GetID(), newName); err != nil {
return nil, err
}
f, err := d.getNewFile((srcObj.GetID()))
if err != nil {
return nil, nil
}
return f, nil
}
func (d *Pan115) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}
return d.client.Copy(dstDir.GetID(), srcObj.GetID())
}
func (d *Pan115) Remove(ctx context.Context, obj model.Obj) error {
if err := d.WaitLimit(ctx); err != nil {
return err
}
return d.client.Delete(obj.GetID())
}
func (d *Pan115) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {
if err := d.WaitLimit(ctx); err != nil {
return nil, err
}
var (
fastInfo *driver115.UploadInitResp
dirID = dstDir.GetID()
)
if ok, err := d.client.UploadAvailable(); err != nil || !ok {
return nil, err
}
if stream.GetSize() > d.client.UploadMetaInfo.SizeLimit {
return nil, driver115.ErrUploadTooLarge
}
//if digest, err = d.client.GetDigestResult(stream); err != nil {
// return err
//}
const PreHashSize int64 = 128 * utils.KB
hashSize := PreHashSize
if stream.GetSize() < PreHashSize {
hashSize = stream.GetSize()
}
reader, err := stream.RangeRead(http_range.Range{Start: 0, Length: hashSize})
if err != nil {
return nil, err
}
preHash, err := utils.HashReader(utils.SHA1, reader)
if err != nil {
return nil, err
}
preHash = strings.ToUpper(preHash)
fullHash := stream.GetHash().GetHash(utils.SHA1)
if len(fullHash) != utils.SHA1.Width {
_, fullHash, err = streamPkg.CacheFullAndHash(stream, &up, utils.SHA1)
if err != nil {
return nil, err
}
}
fullHash = strings.ToUpper(fullHash)
// rapid-upload
// note that 115 add timeout for rapid-upload,
// and "sig invalid" err is thrown even when the hash is correct after timeout.
if fastInfo, err = d.rapidUpload(stream.GetSize(), stream.GetName(), dirID, preHash, fullHash, stream); err != nil {
return nil, err
}
if matched, err := fastInfo.Ok(); err != nil {
return nil, err
} else if matched {
f, err := d.getNewFileByPickCode(fastInfo.PickCode)
if err != nil {
return nil, nil
}
return f, nil
}
var uploadResult *UploadResult
// 闪传失败,上传
if stream.GetSize() <= 10*utils.MB { // 文件大小小于10MB,改用普通模式上传
if uploadResult, err = d.UploadByOSS(ctx, &fastInfo.UploadOSSParams, stream, dirID, up); err != nil {
return nil, err
}
} else {
// 分片上传
if uploadResult, err = d.UploadByMultipart(ctx, &fastInfo.UploadOSSParams, stream.GetSize(), stream, dirID, up); err != nil {
return nil, err
}
}
file, err := d.getNewFile(uploadResult.Data.FileID)
if err != nil {
return nil, nil
}
return file, nil
}
func (d *Pan115) OfflineList(ctx context.Context) ([]*driver115.OfflineTask, error) {
resp, err := d.client.ListOfflineTask(0)
if err != nil {
return nil, err
}
return resp.Tasks, nil
}
func (d *Pan115) OfflineDownload(ctx context.Context, uris []string, dstDir model.Obj) ([]string, error) {
return d.client.AddOfflineTaskURIs(uris, dstDir.GetID(), driver115.WithAppVer(appVer))
}
func (d *Pan115) DeleteOfflineTasks(ctx context.Context, hashes []string, deleteFiles bool) error {
return d.client.DeleteOfflineTasks(hashes, deleteFiles)
}
func (d *Pan115) GetDetails(ctx context.Context) (*model.StorageDetails, error) {
info, err := d.client.GetInfo()
if err != nil {
return nil, err
}
return &model.StorageDetails{
DiskUsage: model.DiskUsage{
TotalSpace: info.SpaceInfo.AllTotal.Size,
UsedSpace: info.SpaceInfo.AllUse.Size,
},
}, nil
}
var _ driver.Driver = (*Pan115)(nil)
================================================
FILE: drivers/115/meta.go
================================================
package _115
import (
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/op"
)
type Addition struct {
Cookie string `json:"cookie" type:"text" help:"one of QR code token and cookie required"`
QRCodeToken string `json:"qrcode_token" type:"text" help:"one of QR code token and cookie required"`
QRCodeSource string `json:"qrcode_source" type:"select" options:"web,android,ios,tv,alipaymini,wechatmini,qandroid" default:"linux" help:"select the QR code device, default linux"`
PageSize int64 `json:"page_size" type:"number" default:"1000" help:"list api per page size of 115 driver"`
LimitRate float64 `json:"limit_rate" type:"float" default:"2" help:"limit all api request rate ([limit]r/1s)"`
driver.RootID
}
var config = driver.Config{
Name: "115 Cloud",
DefaultRoot: "0",
LinkCacheMode: driver.LinkCacheUA,
}
func init() {
op.RegisterDriver(func() driver.Driver {
return &Pan115{}
})
}
================================================
FILE: drivers/115/types.go
================================================
package _115
import (
"time"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
"github.com/SheltonZhu/115driver/pkg/driver"
)
var _ model.Obj = (*FileObj)(nil)
type FileObj struct {
driver.File
}
func (f *FileObj) CreateTime() time.Time {
return f.File.CreateTime
}
func (f *FileObj) GetHash() utils.HashInfo {
return utils.NewHashInfo(utils.SHA1, f.Sha1)
}
func (f *FileObj) Thumb() string {
return f.ThumbURL
}
type UploadResult struct {
driver.BasicResp
Data struct {
PickCode string `json:"pick_code"`
FileSize int `json:"file_size"`
FileID string `json:"file_id"`
ThumbURL string `json:"thumb_url"`
Sha1 string `json:"sha1"`
Aid int `json:"aid"`
FileName string `json:"file_name"`
Cid string `json:"cid"`
IsVideo int `json:"is_video"`
} `json:"data"`
}
================================================
FILE: drivers/115/util.go
================================================
package _115
import (
"bytes"
"context"
"crypto/md5"
"crypto/tls"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"net/url"
"strconv"
"strings"
"sync"
"sync/atomic"
"time"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/internal/driver"
"github.com/OpenListTeam/OpenList/v4/internal/model"
netutil "github.com/OpenListTeam/OpenList/v4/internal/net"
"github.com/OpenListT
gitextract_q94m8ixv/
├── .air.toml
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 00-bug_report_zh.yml
│ │ ├── 01-bug_report_en.yml
│ │ ├── 02-feature_request_zh.yml
│ │ ├── 03-feature_request_en.yml
│ │ └── config.yml
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── beta_release.yml
│ ├── build.yml
│ ├── changelog.yml
│ ├── issue_pr_comment.yml
│ ├── release.yml
│ ├── release_docker.yml
│ ├── sync_repo.yml
│ ├── test_docker.yml
│ └── trigger-makefile-update.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── Dockerfile.ci
├── LICENSE
├── README.md
├── README_cn.md
├── README_ja.md
├── README_nl.md
├── SECURITY.md
├── build.sh
├── cmd/
│ ├── admin.go
│ ├── cancel2FA.go
│ ├── common.go
│ ├── crypt.go
│ ├── flags/
│ │ └── config.go
│ ├── kill.go
│ ├── lang.go
│ ├── restart.go
│ ├── root.go
│ ├── server.go
│ ├── start.go
│ ├── stop_default.go
│ ├── stop_windows.go
│ ├── storage.go
│ ├── user.go
│ └── version.go
├── docker-compose.yml
├── drivers/
│ ├── 115/
│ │ ├── appver.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 115_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 115_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── utils.go
│ ├── 123/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 123_link/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── parse.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 123_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── token.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── 123_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 139/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 189/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── login.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── 189_tv/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── 189pc/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── alias/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── alist_v3/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── aliyundrive/
│ │ ├── driver.go
│ │ ├── global.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── aliyundrive_open/
│ │ ├── driver.go
│ │ ├── limiter.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── aliyundrive_share/
│ │ ├── driver.go
│ │ ├── limiter.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── all.go
│ ├── autoindex/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── util.go
│ │ └── util_test.go
│ ├── azure_blob/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── baidu_netdisk/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── baidu_photo/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── utils.go
│ ├── base/
│ │ ├── client.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── chaoxing/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── chunk/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── obj.go
│ ├── cloudreve/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── cloudreve_v4/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── cnb_releases/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── crypt/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── degoo/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── doubao/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── doubao_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── dropbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── febbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── oauth2.go
│ │ ├── types.go
│ │ └── util.go
│ ├── ftp/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── github/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── github_releases/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── models.go
│ │ ├── types.go
│ │ └── util.go
│ ├── google_drive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── google_photo/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── halalcloud/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── options.go
│ │ ├── types.go
│ │ └── util.go
│ ├── halalcloud_open/
│ │ ├── common.go
│ │ ├── driver.go
│ │ ├── driver_curd_impl.go
│ │ ├── driver_get_link.go
│ │ ├── driver_init.go
│ │ ├── driver_interface.go
│ │ ├── halalcloud_upload.go
│ │ ├── meta.go
│ │ ├── obj_file.go
│ │ └── utils.go
│ ├── ilanzou/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── ipfs_api/
│ │ ├── driver.go
│ │ └── meta.go
│ ├── kodbox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── lanzou/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── lenovonas_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── local/
│ │ ├── benchmark_calculatedirsize_test.go
│ │ ├── copy_namedpipes.go
│ │ ├── copy_namedpipes_x.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── token_bucket.go
│ │ ├── util.go
│ │ ├── util_unix.go
│ │ └── util_windows.go
│ ├── mediafire/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mediatrack/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mega/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── misskey/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── mopan/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── netease_music/
│ │ ├── crypto.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── onedrive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── onedrive_app/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── onedrive_sharelink/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── openlist/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── openlist_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── pikpak/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── pikpak_share/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── proton_drive/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_open/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_uc/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── quark_uc_tv/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── s3/
│ │ ├── doge.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── seafile/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── sftp/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── smb/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── strm/
│ │ ├── driver.go
│ │ ├── hook.go
│ │ ├── meta.go
│ │ └── util.go
│ ├── teambition/
│ │ ├── driver.go
│ │ ├── help.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── teldrive/
│ │ ├── copy.go
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── upload.go
│ │ └── util.go
│ ├── template/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── terabox/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunder/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunder_browser/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── thunderx/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── url_tree/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ ├── urls_test.go
│ │ └── util.go
│ ├── uss/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── virtual/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── util.go
│ ├── webdav/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── odrvcookie/
│ │ │ ├── cookie.go
│ │ │ └── fetch.go
│ │ ├── types.go
│ │ └── util.go
│ ├── weiyun/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ └── types.go
│ ├── wopan/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ ├── wps/
│ │ ├── driver.go
│ │ ├── meta.go
│ │ ├── types.go
│ │ └── util.go
│ └── yandex_disk/
│ ├── driver.go
│ ├── meta.go
│ ├── types.go
│ └── util.go
├── entrypoint.sh
├── go.mod
├── go.sum
├── internal/
│ ├── archive/
│ │ ├── all.go
│ │ ├── archives/
│ │ │ ├── archives.go
│ │ │ └── utils.go
│ │ ├── iso9660/
│ │ │ ├── iso9660.go
│ │ │ └── utils.go
│ │ ├── rardecode/
│ │ │ ├── rardecode.go
│ │ │ └── utils.go
│ │ ├── sevenzip/
│ │ │ ├── sevenzip.go
│ │ │ └── utils.go
│ │ ├── tool/
│ │ │ ├── base.go
│ │ │ ├── helper.go
│ │ │ └── utils.go
│ │ └── zip/
│ │ ├── utils.go
│ │ └── zip.go
│ ├── authn/
│ │ └── authn.go
│ ├── bootstrap/
│ │ ├── config.go
│ │ ├── data/
│ │ │ ├── data.go
│ │ │ ├── dev.go
│ │ │ ├── setting.go
│ │ │ ├── task.go
│ │ │ └── user.go
│ │ ├── db.go
│ │ ├── index.go
│ │ ├── log.go
│ │ ├── offline_download.go
│ │ ├── patch/
│ │ │ ├── all.go
│ │ │ ├── v3_24_0/
│ │ │ │ └── hash_password.go
│ │ │ ├── v3_32_0/
│ │ │ │ └── update_authn.go
│ │ │ ├── v3_41_0/
│ │ │ │ └── grant_permission.go
│ │ │ ├── v4_1_8/
│ │ │ │ └── alias.go
│ │ │ └── v4_1_9/
│ │ │ ├── skip_tls.go
│ │ │ └── webdav.go
│ │ ├── patch.go
│ │ ├── run.go
│ │ ├── storage.go
│ │ ├── stream_limit.go
│ │ └── task.go
│ ├── cache/
│ │ ├── keyed_cache.go
│ │ ├── type.go
│ │ ├── typed_cache.go
│ │ └── utils.go
│ ├── conf/
│ │ ├── config.go
│ │ ├── const.go
│ │ └── var.go
│ ├── db/
│ │ ├── db.go
│ │ ├── meta.go
│ │ ├── searchnode.go
│ │ ├── settingitem.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── tasks.go
│ │ ├── user.go
│ │ └── util.go
│ ├── driver/
│ │ ├── config.go
│ │ ├── driver.go
│ │ ├── item.go
│ │ └── utils.go
│ ├── errs/
│ │ ├── driver.go
│ │ ├── errors.go
│ │ ├── errors_test.go
│ │ ├── object.go
│ │ ├── operate.go
│ │ ├── search.go
│ │ ├── unwrap.go
│ │ └── user.go
│ ├── fs/
│ │ ├── archive.go
│ │ ├── copy_move.go
│ │ ├── fs.go
│ │ ├── get.go
│ │ ├── link.go
│ │ ├── list.go
│ │ ├── other.go
│ │ ├── put.go
│ │ └── walk.go
│ ├── fuse/
│ │ ├── fs.go
│ │ └── mount.go
│ ├── message/
│ │ ├── http.go
│ │ ├── message.go
│ │ └── ws.go
│ ├── model/
│ │ ├── archive.go
│ │ ├── args.go
│ │ ├── direct_upload.go
│ │ ├── file.go
│ │ ├── meta.go
│ │ ├── obj.go
│ │ ├── object.go
│ │ ├── req.go
│ │ ├── search.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── task.go
│ │ └── user.go
│ ├── net/
│ │ ├── oss.go
│ │ ├── oss_test.go
│ │ ├── request.go
│ │ ├── request_test.go
│ │ ├── serve.go
│ │ └── util.go
│ ├── offline_download/
│ │ ├── 115/
│ │ │ └── client.go
│ │ ├── 115_open/
│ │ │ └── client.go
│ │ ├── 123/
│ │ │ └── client.go
│ │ ├── 123_open/
│ │ │ └── client.go
│ │ ├── all.go
│ │ ├── aria2/
│ │ │ ├── aria2.go
│ │ │ └── notify.go
│ │ ├── http/
│ │ │ ├── client.go
│ │ │ └── util.go
│ │ ├── pikpak/
│ │ │ ├── pikpak.go
│ │ │ └── util.go
│ │ ├── qbit/
│ │ │ └── qbit.go
│ │ ├── thunder/
│ │ │ ├── thunder.go
│ │ │ └── util.go
│ │ ├── thunder_browser/
│ │ │ ├── thunder_browser.go
│ │ │ └── util.go
│ │ ├── thunderx/
│ │ │ ├── thunderx.go
│ │ │ └── utils.go
│ │ ├── tool/
│ │ │ ├── add.go
│ │ │ ├── base.go
│ │ │ ├── download.go
│ │ │ ├── tools.go
│ │ │ └── transfer.go
│ │ └── transmission/
│ │ └── client.go
│ ├── op/
│ │ ├── archive.go
│ │ ├── cache.go
│ │ ├── const.go
│ │ ├── driver.go
│ │ ├── driver_test.go
│ │ ├── fs.go
│ │ ├── hook.go
│ │ ├── meta.go
│ │ ├── path.go
│ │ ├── recursive_list.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── storage.go
│ │ ├── storage_test.go
│ │ └── user.go
│ ├── search/
│ │ ├── bleve/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── build.go
│ │ ├── db/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── db_non_full_text/
│ │ │ ├── init.go
│ │ │ └── search.go
│ │ ├── import.go
│ │ ├── meilisearch/
│ │ │ ├── init.go
│ │ │ ├── search.go
│ │ │ ├── task_queue.go
│ │ │ └── utils.go
│ │ ├── search.go
│ │ ├── searcher/
│ │ │ ├── manage.go
│ │ │ └── searcher.go
│ │ └── util.go
│ ├── setting/
│ │ └── setting.go
│ ├── sharing/
│ │ ├── archive.go
│ │ ├── get.go
│ │ ├── link.go
│ │ ├── list.go
│ │ └── sharing.go
│ ├── sign/
│ │ ├── archive.go
│ │ └── sign.go
│ ├── stream/
│ │ ├── limit.go
│ │ ├── stream.go
│ │ ├── stream_test.go
│ │ └── util.go
│ ├── task/
│ │ ├── base.go
│ │ └── manager.go
│ └── task_group/
│ ├── group.go
│ └── transfer.go
├── main.go
├── pkg/
│ ├── aria2/
│ │ └── rpc/
│ │ ├── README.md
│ │ ├── call.go
│ │ ├── call_test.go
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── const.go
│ │ ├── json2.go
│ │ ├── notification.go
│ │ ├── proc.go
│ │ ├── proto.go
│ │ └── resp.go
│ ├── buffer/
│ │ ├── bytes.go
│ │ ├── bytes_test.go
│ │ └── file.go
│ ├── chanio/
│ │ └── chanio.go
│ ├── cookie/
│ │ └── cookie.go
│ ├── cron/
│ │ ├── cron.go
│ │ └── cron_test.go
│ ├── errgroup/
│ │ └── errgroup.go
│ ├── generic/
│ │ └── queue.go
│ ├── generic_sync/
│ │ ├── map.go
│ │ └── map_test.go
│ ├── http_range/
│ │ └── range.go
│ ├── mq/
│ │ └── mq.go
│ ├── pool/
│ │ └── pool.go
│ ├── qbittorrent/
│ │ └── client.go
│ ├── sign/
│ │ ├── hmac.go
│ │ └── sign.go
│ ├── singleflight/
│ │ ├── signleflight_test.go
│ │ ├── singleflight.go
│ │ └── var.go
│ ├── task/
│ │ ├── errors.go
│ │ ├── manager.go
│ │ ├── task.go
│ │ └── task_test.go
│ └── utils/
│ ├── balance.go
│ ├── bool.go
│ ├── ctx.go
│ ├── email.go
│ ├── file.go
│ ├── file_test.go
│ ├── hash/
│ │ └── gcid.go
│ ├── hash.go
│ ├── hash_test.go
│ ├── html.go
│ ├── http.go
│ ├── io.go
│ ├── ip.go
│ ├── json.go
│ ├── log.go
│ ├── map.go
│ ├── oauth2.go
│ ├── path.go
│ ├── path_test.go
│ ├── random/
│ │ └── random.go
│ ├── slice.go
│ ├── str.go
│ ├── time.go
│ └── url.go
├── public/
│ └── public.go
├── server/
│ ├── common/
│ │ ├── auth.go
│ │ ├── base.go
│ │ ├── check.go
│ │ ├── check_test.go
│ │ ├── common.go
│ │ ├── hide_privacy_test.go
│ │ ├── ldap.go
│ │ ├── proxy.go
│ │ ├── resp.go
│ │ └── sign.go
│ ├── debug.go
│ ├── ftp/
│ │ ├── afero.go
│ │ ├── fsmanage.go
│ │ ├── fsread.go
│ │ ├── fsup.go
│ │ ├── site.go
│ │ └── upload_stage.go
│ ├── ftp.go
│ ├── handles/
│ │ ├── archive.go
│ │ ├── auth.go
│ │ ├── const.go
│ │ ├── direct_upload.go
│ │ ├── down.go
│ │ ├── driver.go
│ │ ├── fsbatch.go
│ │ ├── fsmanage.go
│ │ ├── fsread.go
│ │ ├── fsup.go
│ │ ├── helper.go
│ │ ├── index.go
│ │ ├── ldap_login.go
│ │ ├── meta.go
│ │ ├── offline_download.go
│ │ ├── scan.go
│ │ ├── search.go
│ │ ├── setting.go
│ │ ├── sharing.go
│ │ ├── sshkey.go
│ │ ├── ssologin.go
│ │ ├── storage.go
│ │ ├── task.go
│ │ ├── user.go
│ │ └── webauthn.go
│ ├── middlewares/
│ │ ├── auth.go
│ │ ├── check.go
│ │ ├── down.go
│ │ ├── filtered_logger.go
│ │ ├── fsup.go
│ │ ├── https.go
│ │ ├── limit.go
│ │ ├── search.go
│ │ └── sharing.go
│ ├── router.go
│ ├── s3/
│ │ ├── backend.go
│ │ ├── ioutils.go
│ │ ├── list.go
│ │ ├── logger.go
│ │ ├── pager.go
│ │ ├── server.go
│ │ └── utils.go
│ ├── s3.go
│ ├── sftp/
│ │ ├── const.go
│ │ ├── hostkey.go
│ │ └── sftp.go
│ ├── sftp.go
│ ├── static/
│ │ ├── config.go
│ │ └── static.go
│ ├── utils.go
│ ├── webdav/
│ │ ├── buffered_response_writer.go
│ │ ├── file.go
│ │ ├── if.go
│ │ ├── internal/
│ │ │ └── xml/
│ │ │ ├── README
│ │ │ ├── atom_test.go
│ │ │ ├── example_test.go
│ │ │ ├── marshal.go
│ │ │ ├── marshal_test.go
│ │ │ ├── read.go
│ │ │ ├── read_test.go
│ │ │ ├── typeinfo.go
│ │ │ ├── xml.go
│ │ │ └── xml_test.go
│ │ ├── litmus_test_server.go
│ │ ├── lock.go
│ │ ├── lock_test.go
│ │ ├── prop.go
│ │ ├── util.go
│ │ ├── webdav.go
│ │ ├── xml.go
│ │ └── xml_test.go
│ └── webdav.go
└── wrapper/
├── zcc-arm64
├── zcc-win7
├── zcc-win7-386
├── zcxx-arm64
├── zcxx-win7
└── zcxx-win7-386
Showing preview only (566K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6685 symbols across 680 files)
FILE: cmd/admin.go
function setAdminPassword (line 73) | func setAdminPassword(pwd string) {
function init (line 93) | func init() {
FILE: cmd/cancel2FA.go
function init (line 38) | func init() {
FILE: cmd/common.go
function Init (line 13) | func Init() {
function Release (line 17) | func Release() {
function initDaemon (line 24) | func initDaemon() {
FILE: cmd/crypt.go
type options (line 19) | type options struct
method validate (line 68) | func (o *options) validate() {
method cryptFileDir (line 84) | func (o *options) cryptFileDir() {
method cryptFile (line 219) | func (o *options) cryptFile(cipher *rcCrypt.Cipher, src string, dst st...
function init (line 46) | func init() {
function checkCreateDir (line 283) | func checkCreateDir(dir string) {
function updateObfusParm (line 298) | func updateObfusParm(str string) string {
FILE: cmd/kill.go
function kill (line 19) | func kill() {
function init (line 43) | func init() {
FILE: cmd/lang.go
type KV (line 23) | type KV
type Drivers (line 25) | type Drivers
function firstUpper (line 29) | func firstUpper(s string) string {
function convert (line 36) | func convert(s string) string {
function writeFile (line 42) | func writeFile(name string, data interface{}) {
function mergeJson (line 80) | func mergeJson(source, target map[string]interface{}) bool {
function generateDriversJson (line 98) | func generateDriversJson() {
function generateSettingsJson (line 134) | func generateSettingsJson() {
function init (line 171) | func init() {
FILE: cmd/restart.go
function init (line 20) | func init() {
FILE: cmd/root.go
function Execute (line 22) | func Execute() {
function init (line 29) | func init() {
FILE: cmd/server.go
function init (line 35) | func init() {
function OutOpenListInit (line 50) | func OutOpenListInit() {
FILE: cmd/start.go
function start (line 25) | func start() {
function init (line 59) | func init() {
FILE: cmd/stop_default.go
function stop (line 22) | func stop() {
function init (line 46) | func init() {
FILE: cmd/stop_windows.go
function stop (line 18) | func stop() {
function init (line 22) | func init() {
FILE: cmd/storage.go
type model (line 89) | type model struct
method Init (line 93) | func (m model) Init() tea.Cmd { return nil }
method Update (line 95) | func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
method View (line 118) | func (m model) View() string {
function init (line 184) | func init() {
FILE: cmd/user.go
function DelAdminCacheOnline (line 15) | func DelAdminCacheOnline() {
function DelUserCacheOnline (line 24) | func DelUserCacheOnline(username string) {
FILE: cmd/version.go
function init (line 33) | func init() {
FILE: drivers/115/appver.go
method getAppVersion (line 16) | func (d *Pan115) getAppVersion() (string, error) {
method getAppVer (line 32) | func (d *Pan115) getAppVer() string {
method initAppVer (line 44) | func (d *Pan115) initAppVer() {
type VersionResp (line 49) | type VersionResp struct
type Versions (line 54) | type Versions struct
type Version (line 58) | type Version struct
FILE: drivers/115/driver.go
type Pan115 (line 18) | type Pan115 struct
method Config (line 26) | func (d *Pan115) Config() driver.Config {
method GetAddition (line 30) | func (d *Pan115) GetAddition() driver.Additional {
method Init (line 34) | func (d *Pan115) Init(ctx context.Context) error {
method WaitLimit (line 42) | func (d *Pan115) WaitLimit(ctx context.Context) error {
method Drop (line 49) | func (d *Pan115) Drop(ctx context.Context) error {
method List (line 53) | func (d *Pan115) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 66) | func (d *Pan115) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 82) | func (d *Pan115) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 110) | func (d *Pan115) Move(ctx context.Context, srcObj, dstDir model.Obj) (...
method Rename (line 124) | func (d *Pan115) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 138) | func (d *Pan115) Copy(ctx context.Context, srcObj, dstDir model.Obj) e...
method Remove (line 145) | func (d *Pan115) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 152) | func (d *Pan115) Put(ctx context.Context, dstDir model.Obj, stream mod...
method OfflineList (line 231) | func (d *Pan115) OfflineList(ctx context.Context) ([]*driver115.Offlin...
method OfflineDownload (line 239) | func (d *Pan115) OfflineDownload(ctx context.Context, uris []string, d...
method DeleteOfflineTasks (line 243) | func (d *Pan115) DeleteOfflineTasks(ctx context.Context, hashes []stri...
method GetDetails (line 247) | func (d *Pan115) GetDetails(ctx context.Context) (*model.StorageDetail...
FILE: drivers/115/meta.go
type Addition (line 8) | type Addition struct
function init (line 23) | func init() {
FILE: drivers/115/types.go
type FileObj (line 13) | type FileObj struct
method CreateTime (line 17) | func (f *FileObj) CreateTime() time.Time {
method GetHash (line 21) | func (f *FileObj) GetHash() utils.HashInfo {
method Thumb (line 25) | func (f *FileObj) Thumb() string {
type UploadResult (line 29) | type UploadResult struct
FILE: drivers/115/util.go
method login (line 32) | func (d *Pan115) login() error {
method getFiles (line 62) | func (d *Pan115) getFiles(fileId string) ([]FileObj, error) {
method getNewFile (line 77) | func (d *Pan115) getNewFile(fileId string) (*FileObj, error) {
method getNewFileByPickCode (line 85) | func (d *Pan115) getNewFileByPickCode(pickCode string) (*FileObj, error) {
method getUA (line 105) | func (d *Pan115) getUA() string {
method GenerateToken (line 109) | func (c *Pan115) GenerateToken(fileID, preID, timeStamp, fileSize, signK...
method rapidUpload (line 116) | func (d *Pan115) rapidUpload(fileSize int64, fileName, dirID, preID, fil...
function UploadDigestRange (line 201) | func UploadDigestRange(stream model.FileStreamer, rangeSpec string) (res...
method UploadByOSS (line 221) | func (c *Pan115) UploadByOSS(ctx context.Context, params *driver115.Uplo...
method UploadByMultipart (line 255) | func (d *Pan115) UploadByMultipart(ctx context.Context, params *driver11...
function chunksProducer (line 408) | func chunksProducer(ch chan oss.FileChunk, chunks []oss.FileChunk) {
function SplitFile (line 414) | func SplitFile(fileSize int64) (chunks []oss.FileChunk, err error) {
function SplitFileByPartNum (line 439) | func SplitFileByPartNum(fileSize int64, chunkNum int) ([]oss.FileChunk, ...
function SplitFileByPartSize (line 467) | func SplitFileByPartSize(fileSize int64, chunkSize int64) ([]oss.FileChu...
FILE: drivers/115_open/driver.go
type Open115 (line 23) | type Open115 struct
method Config (line 30) | func (d *Open115) Config() driver.Config {
method GetAddition (line 34) | func (d *Open115) GetAddition() driver.Additional {
method Init (line 38) | func (d *Open115) Init(ctx context.Context) error {
method WaitLimit (line 65) | func (d *Open115) WaitLimit(ctx context.Context) error {
method Drop (line 72) | func (d *Open115) Drop(ctx context.Context) error {
method List (line 76) | func (d *Open115) List(ctx context.Context, dir model.Obj, args model....
method Link (line 108) | func (d *Open115) Link(ctx context.Context, file model.Obj, args model...
method MakeDir (line 140) | func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, di...
method Move (line 159) | func (d *Open115) Move(ctx context.Context, srcObj, dstDir model.Obj) ...
method Rename (line 173) | func (d *Open115) Rename(ctx context.Context, srcObj model.Obj, newNam...
method Copy (line 191) | func (d *Open115) Copy(ctx context.Context, srcObj, dstDir model.Obj) ...
method Remove (line 206) | func (d *Open115) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 224) | func (d *Open115) Put(ctx context.Context, dstDir model.Obj, file mode...
method OfflineDownload (line 313) | func (d *Open115) OfflineDownload(ctx context.Context, uris []string, ...
method DeleteOfflineTask (line 317) | func (d *Open115) DeleteOfflineTask(ctx context.Context, infoHash stri...
method OfflineList (line 321) | func (d *Open115) OfflineList(ctx context.Context) (*sdk.OfflineTaskLi...
method GetDetails (line 329) | func (d *Open115) GetDetails(ctx context.Context) (*model.StorageDetai...
FILE: drivers/115_open/meta.go
type Addition (line 8) | type Addition struct
function init (line 26) | func init() {
FILE: drivers/115_open/types.go
type Obj (line 11) | type Obj
method Thumb (line 14) | func (o *Obj) Thumb() string {
method CreateTime (line 19) | func (o *Obj) CreateTime() time.Time {
method GetHash (line 24) | func (o *Obj) GetHash() utils.HashInfo {
method GetID (line 29) | func (o *Obj) GetID() string {
method GetName (line 34) | func (o *Obj) GetName() string {
method GetPath (line 39) | func (o *Obj) GetPath() string {
method GetSize (line 44) | func (o *Obj) GetSize() int64 {
method IsDir (line 49) | func (o *Obj) IsDir() bool {
method ModTime (line 54) | func (o *Obj) ModTime() time.Time {
FILE: drivers/115_open/upload.go
function calPartSize (line 19) | func calPartSize(fileSize int64) int64 {
method singleUpload (line 39) | func (d *Open115) singleUpload(ctx context.Context, tempF model.File, to...
method multpartUpload (line 73) | func (d *Open115) multpartUpload(ctx context.Context, stream model.FileS...
FILE: drivers/115_open/util.go
function ParseInt64 (line 5) | func ParseInt64(v json.Number) (int64, error) {
FILE: drivers/115_share/driver.go
type Pan115Share (line 15) | type Pan115Share struct
method Config (line 22) | func (d *Pan115Share) Config() driver.Config {
method GetAddition (line 26) | func (d *Pan115Share) GetAddition() driver.Additional {
method Init (line 30) | func (d *Pan115Share) Init(ctx context.Context) error {
method WaitLimit (line 38) | func (d *Pan115Share) WaitLimit(ctx context.Context) error {
method Drop (line 45) | func (d *Pan115Share) Drop(ctx context.Context) error {
method List (line 49) | func (d *Pan115Share) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 84) | func (d *Pan115Share) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 103) | func (d *Pan115Share) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 107) | func (d *Pan115Share) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 111) | func (d *Pan115Share) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 115) | func (d *Pan115Share) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 119) | func (d *Pan115Share) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 123) | func (d *Pan115Share) Put(ctx context.Context, dstDir model.Obj, strea...
FILE: drivers/115_share/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/115_share/utils.go
type FileObj (line 17) | type FileObj struct
method CreateTime (line 27) | func (f *FileObj) CreateTime() time.Time {
method GetHash (line 31) | func (f *FileObj) GetHash() utils.HashInfo {
method GetSize (line 35) | func (f *FileObj) GetSize() int64 {
method GetName (line 39) | func (f *FileObj) GetName() string {
method ModTime (line 43) | func (f *FileObj) ModTime() time.Time {
method IsDir (line 47) | func (f *FileObj) IsDir() bool {
method GetID (line 51) | func (f *FileObj) GetID() string {
method GetPath (line 55) | func (f *FileObj) GetPath() string {
method Thumb (line 59) | func (f *FileObj) Thumb() string {
function transFunc (line 63) | func transFunc(sf driver115.ShareFile) (model.Obj, error) {
method login (line 87) | func (d *Pan115Share) login() error {
FILE: drivers/123/driver.go
type Pan123 (line 29) | type Pan123 struct
method Config (line 35) | func (d *Pan123) Config() driver.Config {
method GetAddition (line 39) | func (d *Pan123) GetAddition() driver.Additional {
method Init (line 43) | func (d *Pan123) Init(ctx context.Context) error {
method Drop (line 50) | func (d *Pan123) Drop(ctx context.Context) error {
method List (line 57) | func (d *Pan123) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 67) | func (d *Pan123) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 124) | func (d *Pan123) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 139) | func (d *Pan123) Move(ctx context.Context, srcObj, dstDir model.Obj) e...
method Rename (line 150) | func (d *Pan123) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 162) | func (d *Pan123) Copy(ctx context.Context, srcObj, dstDir model.Obj) e...
method Remove (line 166) | func (d *Pan123) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 182) | func (d *Pan123) Put(ctx context.Context, dstDir model.Obj, file model...
method APIRateLimit (line 250) | func (d *Pan123) APIRateLimit(ctx context.Context, api string) error {
method GetDetails (line 258) | func (d *Pan123) GetDetails(ctx context.Context) (*model.StorageDetail...
FILE: drivers/123/meta.go
type Addition (line 8) | type Addition struct
function init (line 26) | func init() {
FILE: drivers/123/types.go
type File (line 15) | type File struct
method CreateTime (line 26) | func (f File) CreateTime() time.Time {
method GetHash (line 30) | func (f File) GetHash() utils.HashInfo {
method GetPath (line 34) | func (f File) GetPath() string {
method GetSize (line 38) | func (f File) GetSize() int64 {
method GetName (line 42) | func (f File) GetName() string {
method ModTime (line 46) | func (f File) ModTime() time.Time {
method IsDir (line 50) | func (f File) IsDir() bool {
method GetID (line 54) | func (f File) GetID() string {
method Thumb (line 58) | func (f File) Thumb() string {
type Files (line 88) | type Files struct
type UploadResp (line 104) | type UploadResp struct
type S3PreSignedURLs (line 120) | type S3PreSignedURLs struct
type UserInfoResp (line 126) | type UserInfoResp struct
type offlineResolveResp (line 137) | type offlineResolveResp struct
type offlineSubmitResp (line 151) | type offlineSubmitResp struct
type offlineTaskListResp (line 160) | type offlineTaskListResp struct
type offlineTask (line 168) | type offlineTask struct
FILE: drivers/123/upload.go
method getS3PreSignedUrls (line 22) | func (d *Pan123) getS3PreSignedUrls(ctx context.Context, upReq *UploadRe...
method getS3Auth (line 41) | func (d *Pan123) getS3Auth(ctx context.Context, upReq *UploadResp, start...
method completeS3 (line 60) | func (d *Pan123) completeS3(ctx context.Context, upReq *UploadResp, file...
method newUpload (line 76) | func (d *Pan123) newUpload(ctx context.Context, upReq *UploadResp, file ...
FILE: drivers/123/util.go
constant Api (line 27) | Api = "https://www.123pan.com/api"
constant AApi (line 28) | AApi = "https://www.123pan.com/a/api"
constant BApi (line 29) | BApi = "https://www.123pan.com/b/api"
constant LoginApi (line 30) | LoginApi = "https://login.123pan.com/api"
constant MainApi (line 31) | MainApi = BApi
constant SignIn (line 32) | SignIn = LoginApi + "/user/sign_in"
constant Logout (line 33) | Logout = MainApi + "/user/logout"
constant UserInfo (line 34) | UserInfo = MainApi + "/user/info"
constant FileList (line 35) | FileList = MainApi + "/file/list/new"
constant DownloadInfo (line 36) | DownloadInfo = MainApi + "/file/download_info"
constant Mkdir (line 37) | Mkdir = MainApi + "/file/upload_request"
constant Move (line 38) | Move = MainApi + "/file/mod_pid"
constant Rename (line 39) | Rename = MainApi + "/file/rename"
constant Trash (line 40) | Trash = MainApi + "/file/trash"
constant UploadRequest (line 41) | UploadRequest = MainApi + "/file/upload_request"
constant UploadComplete (line 42) | UploadComplete = MainApi + "/file/upload_complete"
constant S3PreSignedUrls (line 43) | S3PreSignedUrls = MainApi + "/file/s3_repare_upload_parts_batch"
constant S3Auth (line 44) | S3Auth = MainApi + "/file/s3_upload_object/auth"
constant UploadCompleteV2 (line 45) | UploadCompleteV2 = MainApi + "/file/upload_complete/v2"
constant S3Complete (line 46) | S3Complete = MainApi + "/file/s3_complete_multipart_upload"
constant OfflineResolve (line 48) | OfflineResolve = MainApi + "/v2/offline_download/task/resolve"
constant OfflineSubmit (line 49) | OfflineSubmit = MainApi + "/v2/offline_download/task/submit"
constant OfflineTaskList (line 50) | OfflineTaskList = MainApi + "/offline_download/task/list"
constant OfflineTaskDelete (line 51) | OfflineTaskDelete = MainApi + "/offline_download/task/delete"
function signPath (line 57) | func signPath(path string, os string, version string) (k string, v strin...
function GetApi (line 72) | func GetApi(rawUrl string) string {
method login (line 155) | func (d *Pan123) login() error {
method Request (line 205) | func (d *Pan123) Request(url string, method string, callback base.ReqCal...
method OfflineDownload (line 249) | func (d *Pan123) OfflineDownload(ctx context.Context, uri string, dstDir...
method GetOfflineTask (line 314) | func (d *Pan123) GetOfflineTask(ctx context.Context, taskID int64) (*off...
method DeleteOfflineTasks (line 346) | func (d *Pan123) DeleteOfflineTasks(ctx context.Context, taskIDs []int64...
method getFiles (line 358) | func (d *Pan123) getFiles(ctx context.Context, parentId string, name str...
method getUserInfo (line 403) | func (d *Pan123) getUserInfo(ctx context.Context) (*UserInfoResp, error) {
FILE: drivers/123_link/driver.go
type Pan123Link (line 14) | type Pan123Link struct
method Config (line 20) | func (d *Pan123Link) Config() driver.Config {
method GetAddition (line 24) | func (d *Pan123Link) GetAddition() driver.Additional {
method Init (line 28) | func (d *Pan123Link) Init(ctx context.Context) error {
method Drop (line 38) | func (d *Pan123Link) Drop(ctx context.Context) error {
method Get (line 46) | func (d *Pan123Link) Get(ctx context.Context, path string) (model.Obj,...
method List (line 51) | func (d *Pan123Link) List(ctx context.Context, dir model.Obj, args mod...
method Link (line 64) | func (d *Pan123Link) Link(ctx context.Context, file model.Obj, args mo...
method GetRootPath (line 42) | func (Addition) GetRootPath() string {
FILE: drivers/123_link/meta.go
type Addition (line 8) | type Addition struct
function init (line 19) | func init() {
FILE: drivers/123_link/parse.go
function BuildTree (line 32) | func BuildTree(text string) (*Node, error) {
function isFolder (line 88) | func isFolder(line string) bool {
function parseFileLine (line 94) | func parseFileLine(line string) (*Node, error) {
function splitPath (line 141) | func splitPath(path string) []string {
function GetNodeFromRootByPath (line 150) | func GetNodeFromRootByPath(root *Node, path string) *Node {
FILE: drivers/123_link/types.go
type Node (line 11) | type Node struct
method getByPath (line 20) | func (node *Node) getByPath(paths []string) *Node {
method isFile (line 39) | func (node *Node) isFile() bool {
method calSize (line 43) | func (node *Node) calSize() int64 {
function nodeToObj (line 55) | func nodeToObj(node *Node, path string) (model.Obj, error) {
FILE: drivers/123_link/util.go
function SignURL (line 11) | func SignURL(originURL, privateKey string, uid uint64, validDuration tim...
FILE: drivers/123_open/driver.go
type Open123 (line 17) | type Open123 struct
method Config (line 24) | func (d *Open123) Config() driver.Config {
method GetAddition (line 28) | func (d *Open123) GetAddition() driver.Additional {
method Init (line 32) | func (d *Open123) Init(ctx context.Context) error {
method Drop (line 58) | func (d *Open123) Drop(ctx context.Context) error {
method List (line 63) | func (d *Open123) List(ctx context.Context, dir model.Obj, args model....
method Link (line 89) | func (d *Open123) Link(ctx context.Context, file model.Obj, args model...
method MakeDir (line 133) | func (d *Open123) MakeDir(ctx context.Context, parentDir model.Obj, di...
method Move (line 139) | func (d *Open123) Move(ctx context.Context, srcObj, dstDir model.Obj) ...
method Rename (line 145) | func (d *Open123) Rename(ctx context.Context, srcObj model.Obj, newNam...
method Copy (line 151) | func (d *Open123) Copy(ctx context.Context, srcObj, dstDir model.Obj) ...
method Remove (line 171) | func (d *Open123) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 177) | func (d *Open123) Put(ctx context.Context, dstDir model.Obj, file mode...
method GetDetails (line 252) | func (d *Open123) GetDetails(ctx context.Context) (*model.StorageDetai...
method OfflineDownload (line 265) | func (d *Open123) OfflineDownload(ctx context.Context, url string, dir...
method OfflineDownloadProcess (line 269) | func (d *Open123) OfflineDownloadProcess(ctx context.Context, taskID i...
FILE: drivers/123_open/meta.go
type Addition (line 8) | type Addition struct
function init (line 41) | func init() {
FILE: drivers/123_open/token.go
type tokenManager (line 20) | type tokenManager struct
method getAccessToken (line 27) | func (d *Open123) getAccessToken(forceRefresh bool) (string, error) {
method flushAccessToken (line 45) | func (d *Open123) flushAccessToken() error {
FILE: drivers/123_open/types.go
type ApiInfo (line 11) | type ApiInfo struct
method Require (line 17) | func (a *ApiInfo) Require() {
method Release (line 23) | func (a *ApiInfo) Release() {
method SetQPS (line 31) | func (a *ApiInfo) SetQPS(qps int) {
method NowLen (line 36) | func (a *ApiInfo) NowLen() int {
function InitApiInfo (line 40) | func InitApiInfo(url string, qps int) *ApiInfo {
type File (line 48) | type File struct
method GetHash (line 64) | func (f File) GetHash() utils.HashInfo {
method GetPath (line 71) | func (f File) GetPath() string {
method GetSize (line 75) | func (f File) GetSize() int64 {
method GetName (line 79) | func (f File) GetName() string {
method CreateTime (line 83) | func (f File) CreateTime() time.Time {
method ModTime (line 93) | func (f File) ModTime() time.Time {
method IsDir (line 103) | func (f File) IsDir() bool {
method GetID (line 107) | func (f File) GetID() string {
type BaseResp (line 113) | type BaseResp struct
type AccessTokenResp (line 119) | type AccessTokenResp struct
type RefreshTokenResp (line 127) | type RefreshTokenResp struct
type UserInfoResp (line 135) | type UserInfoResp struct
type FileListResp (line 154) | type FileListResp struct
type DownloadInfoResp (line 162) | type DownloadInfoResp struct
type DirectLinkResp (line 169) | type DirectLinkResp struct
type UploadCreateResp (line 177) | type UploadCreateResp struct
type UploadCompleteResp (line 189) | type UploadCompleteResp struct
type SHA1ReuseResp (line 197) | type SHA1ReuseResp struct
type OfflineDownloadResp (line 205) | type OfflineDownloadResp struct
type OfflineDownloadProcessResp (line 212) | type OfflineDownloadProcessResp struct
FILE: drivers/123_open/upload.go
method create (line 26) | func (d *Open123) create(parentFileID int64, filename string, etag strin...
method Upload (line 45) | func (d *Open123) Upload(ctx context.Context, file model.FileStreamer, c...
method complete (line 174) | func (d *Open123) complete(preuploadID string) (*UploadCompleteResp, err...
method sha1Reuse (line 188) | func (d *Open123) sha1Reuse(parentFileID int64, filename string, sha1Has...
FILE: drivers/123_open/util.go
method Request (line 40) | func (d *Open123) Request(apiInfo *ApiInfo, method string, callback base...
method SignURL (line 92) | func (d *Open123) SignURL(originURL, privateKey string, uid uint64, vali...
method getUserInfo (line 119) | func (d *Open123) getUserInfo(ctx context.Context) (*UserInfoResp, error) {
method getUID (line 131) | func (d *Open123) getUID(ctx context.Context) (uint64, error) {
method getFiles (line 143) | func (d *Open123) getFiles(parentFileId int64, limit int, lastFileId int...
method getDownloadInfo (line 164) | func (d *Open123) getDownloadInfo(fileId int64) (*DownloadInfoResp, erro...
method getDirectLink (line 179) | func (d *Open123) getDirectLink(fileId int64) (*DirectLinkResp, error) {
method mkdir (line 194) | func (d *Open123) mkdir(parentID int64, name string) error {
method move (line 208) | func (d *Open123) move(fileID, toParentFileID int64) error {
method rename (line 222) | func (d *Open123) rename(fileId int64, fileName string) error {
method trash (line 236) | func (d *Open123) trash(fileId int64) error {
method createOfflineDownloadTask (line 249) | func (d *Open123) createOfflineDownloadTask(ctx context.Context, url str...
method queryOfflineDownloadStatus (line 267) | func (d *Open123) queryOfflineDownloadStatus(ctx context.Context, taskID...
FILE: drivers/123_share/driver.go
type Pan123Share (line 24) | type Pan123Share struct
method Config (line 31) | func (d *Pan123Share) Config() driver.Config {
method GetAddition (line 35) | func (d *Pan123Share) GetAddition() driver.Additional {
method Init (line 39) | func (d *Pan123Share) Init(ctx context.Context) error {
method InitReference (line 45) | func (d *Pan123Share) InitReference(storage driver.Driver) error {
method Drop (line 54) | func (d *Pan123Share) Drop(ctx context.Context) error {
method List (line 59) | func (d *Pan123Share) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 70) | func (d *Pan123Share) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 126) | func (d *Pan123Share) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 131) | func (d *Pan123Share) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 136) | func (d *Pan123Share) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 141) | func (d *Pan123Share) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 146) | func (d *Pan123Share) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 151) | func (d *Pan123Share) Put(ctx context.Context, dstDir model.Obj, strea...
method APIRateLimit (line 160) | func (d *Pan123Share) APIRateLimit(ctx context.Context, api string) er...
FILE: drivers/123_share/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/123_share/types.go
type File (line 15) | type File struct
method GetHash (line 26) | func (f File) GetHash() utils.HashInfo {
method GetPath (line 30) | func (f File) GetPath() string {
method GetSize (line 34) | func (f File) GetSize() int64 {
method GetName (line 38) | func (f File) GetName() string {
method ModTime (line 42) | func (f File) ModTime() time.Time {
method CreateTime (line 45) | func (f File) CreateTime() time.Time {
method IsDir (line 49) | func (f File) IsDir() bool {
method GetID (line 53) | func (f File) GetID() string {
method Thumb (line 57) | func (f File) Thumb() string {
type Files (line 87) | type Files struct
FILE: drivers/123_share/util.go
constant Api (line 23) | Api = "https://www.123pan.com/api"
constant AApi (line 24) | AApi = "https://www.123pan.com/a/api"
constant BApi (line 25) | BApi = "https://www.123pan.com/b/api"
constant MainApi (line 26) | MainApi = BApi
constant FileList (line 27) | FileList = MainApi + "/share/get"
constant DownloadInfo (line 28) | DownloadInfo = MainApi + "/share/download/info"
function signPath (line 32) | func signPath(path string, os string, version string) (k string, v strin...
function GetApi (line 47) | func GetApi(rawUrl string) string {
method request (line 55) | func (d *Pan123Share) request(url string, method string, callback base.R...
method getFiles (line 87) | func (d *Pan123Share) getFiles(ctx context.Context, parentId string) ([]...
FILE: drivers/139/driver.go
type Yun139 (line 25) | type Yun139 struct
method Config (line 35) | func (d *Yun139) Config() driver.Config {
method GetAddition (line 39) | func (d *Yun139) GetAddition() driver.Additional {
method Init (line 43) | func (d *Yun139) Init(ctx context.Context) error {
method InitReference (line 128) | func (d *Yun139) InitReference(storage driver.Driver) error {
method Drop (line 137) | func (d *Yun139) Drop(ctx context.Context) error {
method List (line 145) | func (d *Yun139) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 160) | func (d *Yun139) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 181) | func (d *Yun139) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 238) | func (d *Yun139) Move(ctx context.Context, srcObj, dstDir model.Obj) (...
method Rename (line 349) | func (d *Yun139) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 458) | func (d *Yun139) Copy(ctx context.Context, srcObj, dstDir model.Obj) e...
method Remove (line 527) | func (d *Yun139) Remove(ctx context.Context, obj model.Obj) error {
method getPartSize (line 606) | func (d *Yun139) getPartSize(size int64) int64 {
method Put (line 617) | func (d *Yun139) Put(ctx context.Context, dstDir model.Obj, stream mod...
method Other (line 918) | func (d *Yun139) Other(ctx context.Context, args model.OtherArgs) (int...
method GetDetails (line 943) | func (d *Yun139) GetDetails(ctx context.Context) (*model.StorageDetail...
FILE: drivers/139/meta.go
type Addition (line 8) | type Addition struct
function init (line 29) | func init() {
FILE: drivers/139/types.go
constant MetaPersonal (line 8) | MetaPersonal string = "personal"
constant MetaFamily (line 9) | MetaFamily string = "family"
constant MetaGroup (line 10) | MetaGroup string = "group"
constant MetaPersonalNew (line 11) | MetaPersonalNew string = "personal_new"
type BaseResp (line 14) | type BaseResp struct
type Catalog (line 20) | type Catalog struct
type Content (line 50) | type Content struct
type GetDiskResp (line 105) | type GetDiskResp struct
type UploadResp (line 122) | type UploadResp struct
type InterLayerUploadResult (line 146) | type InterLayerUploadResult struct
type CloudContent (line 153) | type CloudContent struct
type CloudCatalog (line 183) | type CloudCatalog struct
type QueryContentListResp (line 193) | type QueryContentListResp struct
type QueryGroupContentListResp (line 208) | type QueryGroupContentListResp struct
type ParallelHashCtx (line 229) | type ParallelHashCtx struct
type PartInfo (line 233) | type PartInfo struct
type PersonalThumbnail (line 239) | type PersonalThumbnail struct
type PersonalFileItem (line 244) | type PersonalFileItem struct
type PersonalListResp (line 254) | type PersonalListResp struct
type PersonalPartInfo (line 262) | type PersonalPartInfo struct
type PersonalUploadResp (line 267) | type PersonalUploadResp struct
type PersonalUploadUrlResp (line 279) | type PersonalUploadUrlResp struct
type QueryRoutePolicyResp (line 288) | type QueryRoutePolicyResp struct
type RefreshTokenResp (line 307) | type RefreshTokenResp struct
type PersonalDiskInfoResp (line 316) | type PersonalDiskInfoResp struct
type FamilyDiskInfoResp (line 325) | type FamilyDiskInfoResp struct
type AndAlbumUploadResp (line 333) | type AndAlbumUploadResp struct
type ModifyCloudDocV2Req (line 348) | type ModifyCloudDocV2Req struct
type ModifyCloudDocV2Resp (line 360) | type ModifyCloudDocV2Resp struct
type CreateBatchOprTaskReq (line 367) | type CreateBatchOprTaskReq struct
type CreateBatchOprTaskResp (line 384) | type CreateBatchOprTaskResp struct
FILE: drivers/139/util.go
constant KEY_HEX_1 (line 37) | KEY_HEX_1 = "73634235495062495331515373756c734e7253306c673d3d"
constant KEY_HEX_2 (line 38) | KEY_HEX_2 = "7150714477323633586746674c337538"
method isFamily (line 42) | func (d *Yun139) isFamily() bool {
function encodeURIComponent (line 46) | func encodeURIComponent(str string) string {
function calSign (line 57) | func calSign(body, ts, randStr string) string {
function getTime (line 68) | func getTime(t string) time.Time {
method refreshToken (line 73) | func (d *Yun139) refreshToken() error {
method request (line 127) | func (d *Yun139) request(url string, method string, callback base.ReqCal...
method requestRoute (line 200) | func (d *Yun139) requestRoute(data interface{}, resp interface{}) ([]byt...
method post (line 257) | func (d *Yun139) post(pathname string, data interface{}, resp interface{...
method getFiles (line 263) | func (d *Yun139) getFiles(catalogID string) ([]model.Obj, error) {
method newJson (line 319) | func (d *Yun139) newJson(data map[string]interface{}) base.Json {
method familyGetFiles (line 332) | func (d *Yun139) familyGetFiles(catalogID string) ([]model.Obj, error) {
method groupGetFiles (line 389) | func (d *Yun139) groupGetFiles(catalogID string) ([]model.Obj, error) {
method getLink (line 447) | func (d *Yun139) getLink(contentId string) (string, error) {
method familyGetLink (line 464) | func (d *Yun139) familyGetLink(contentId string, path string) (string, e...
method groupGetLink (line 477) | func (d *Yun139) groupGetLink(contentId string, path string) (string, er...
function unicode (line 491) | func unicode(str string) string {
method personalRequest (line 497) | func (d *Yun139) personalRequest(pathname string, method string, callbac...
method personalPost (line 559) | func (d *Yun139) personalPost(pathname string, data interface{}, resp in...
method isboPost (line 565) | func (d *Yun139) isboPost(pathname string, data interface{}, resp interf...
function getPersonalTime (line 572) | func getPersonalTime(t string) time.Time {
method personalGetFiles (line 580) | func (d *Yun139) personalGetFiles(fileId string) ([]model.Obj, error) {
method personalGetLink (line 647) | func (d *Yun139) personalGetLink(fileId string) (string, error) {
method getAuthorization (line 664) | func (d *Yun139) getAuthorization() string {
method getAccount (line 671) | func (d *Yun139) getAccount() string {
method getPersonalCloudHost (line 678) | func (d *Yun139) getPersonalCloudHost() string {
method uploadPersonalParts (line 685) | func (d *Yun139) uploadPersonalParts(ctx context.Context, partInfos []Pa...
method getPersonalDiskInfo (line 729) | func (d *Yun139) getPersonalDiskInfo(ctx context.Context) (*PersonalDisk...
method getFamilyDiskInfo (line 744) | func (d *Yun139) getFamilyDiskInfo(ctx context.Context) (*FamilyDiskInfo...
function getMd5 (line 759) | func getMd5(dataStr string) string {
method step1_password_login (line 764) | func (d *Yun139) step1_password_login() (string, error) {
method step2_get_single_token (line 884) | func (d *Yun139) step2_get_single_token(sid string) (string, error) {
function sha1Hash (line 939) | func sha1Hash(data string) string {
function pkcs7_pad (line 946) | func pkcs7_pad(data []byte, blockSize int) []byte {
function pkcs7_unpad (line 953) | func pkcs7_unpad(data []byte) ([]byte, error) {
function aes_ecb_decrypt (line 966) | func aes_ecb_decrypt(ciphertext []byte, key []byte) ([]byte, error) {
function aesCbcEncrypt (line 987) | func aesCbcEncrypt(plaintext []byte, key []byte, iv []byte) ([]byte, err...
function aesCbcDecrypt (line 1002) | func aesCbcDecrypt(ciphertext []byte, key []byte, iv []byte) ([]byte, er...
function sortedJsonStringify (line 1020) | func sortedJsonStringify(obj interface{}) (string, error) {
method yun139EncryptedRequest (line 1076) | func (d *Yun139) yun139EncryptedRequest(url string, body interface{}, he...
method step3_third_party_login (line 1154) | func (d *Yun139) step3_third_party_login(dycpwd string) (string, error) {
method loginWithPassword (line 1233) | func (d *Yun139) loginWithPassword() (string, error) {
method andAlbumRequest (line 1261) | func (d *Yun139) andAlbumRequest(pathname string, body interface{}, resp...
method handleMetaGroupCopy (line 1282) | func (d *Yun139) handleMetaGroupCopy(ctx context.Context, srcObj, dstDir...
method getGroupRootByCloudID (line 1313) | func (d *Yun139) getGroupRootByCloudID(cloudID string) (string, error) {
method getFamilyRootPath (line 1352) | func (d *Yun139) getFamilyRootPath(cloudID string) (string, error) {
FILE: drivers/189/driver.go
type Cloud189 (line 16) | type Cloud189 struct
method Config (line 24) | func (d *Cloud189) Config() driver.Config {
method GetAddition (line 28) | func (d *Cloud189) GetAddition() driver.Additional {
method Init (line 32) | func (d *Cloud189) Init(ctx context.Context) error {
method Drop (line 38) | func (d *Cloud189) Drop(ctx context.Context) error {
method List (line 42) | func (d *Cloud189) List(ctx context.Context, dir model.Obj, args model...
method Link (line 46) | func (d *Cloud189) Link(ctx context.Context, file model.Obj, args mode...
method MakeDir (line 82) | func (d *Cloud189) MakeDir(ctx context.Context, parentDir model.Obj, d...
method Move (line 93) | func (d *Cloud189) Move(ctx context.Context, srcObj, dstDir model.Obj)...
method Rename (line 120) | func (d *Cloud189) Rename(ctx context.Context, srcObj model.Obj, newNa...
method Copy (line 139) | func (d *Cloud189) Copy(ctx context.Context, srcObj, dstDir model.Obj)...
method Remove (line 166) | func (d *Cloud189) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 193) | func (d *Cloud189) Put(ctx context.Context, dstDir model.Obj, stream m...
method GetDetails (line 197) | func (d *Cloud189) GetDetails(ctx context.Context) (*model.StorageDeta...
FILE: drivers/189/help.go
function random (line 25) | func random() string {
function RsaEncode (line 29) | func RsaEncode(origData []byte, j_rsakey string, hex bool) string {
function int2char (line 49) | func int2char(a int) string {
function b64tohex (line 53) | func b64tohex(a string) string {
function qs (line 87) | func qs(form map[string]string) string {
function EncodeParam (line 100) | func EncodeParam(v url.Values) string {
function encode (line 127) | func encode(str string) string {
function AesEncrypt (line 135) | func AesEncrypt(data, key []byte) []byte {
function PKCS7Padding (line 149) | func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
function hmacSha1 (line 155) | func hmacSha1(data string, secret string) string {
function getMd5 (line 161) | func getMd5(data []byte) []byte {
function decodeURIComponent (line 167) | func decodeURIComponent(str string) string {
function Random (line 173) | func Random(v string) string {
FILE: drivers/189/login.go
type AppConf (line 11) | type AppConf struct
type EncryptConf (line 35) | type EncryptConf struct
method newLogin (line 45) | func (d *Cloud189) newLogin() error {
FILE: drivers/189/meta.go
type Addition (line 8) | type Addition struct
function init (line 22) | func init() {
FILE: drivers/189/types.go
type LoginResp (line 3) | type LoginResp struct
type Error (line 9) | type Error struct
type File (line 14) | type File struct
type Folder (line 26) | type Folder struct
type Files (line 32) | type Files struct
type UploadUrlsResp (line 42) | type UploadUrlsResp struct
type Part (line 47) | type Part struct
type Rsa (line 52) | type Rsa struct
type Down (line 58) | type Down struct
type DownResp (line 64) | type DownResp struct
type CapacityResp (line 70) | type CapacityResp struct
FILE: drivers/189/util.go
method request (line 143) | func (d *Cloud189) request(url string, method string, callback base.ReqC...
method getFiles (line 176) | func (d *Cloud189) getFiles(fileId string) ([]model.Obj, error) {
method oldUpload (line 225) | func (d *Cloud189) oldUpload(dstDir model.Obj, file model.FileStreamer) ...
method getSessionKey (line 242) | func (d *Cloud189) getSessionKey() (string, error) {
method getResKey (line 251) | func (d *Cloud189) getResKey() (string, string, error) {
method uploadRequest (line 266) | func (d *Cloud189) uploadRequest(uri string, form map[string]string, res...
method newUpload (line 307) | func (d *Cloud189) newUpload(ctx context.Context, dstDir model.Obj, file...
method getCapacityInfo (line 399) | func (d *Cloud189) getCapacityInfo(ctx context.Context) (*CapacityResp, ...
FILE: drivers/189_tv/driver.go
type Cloud189TV (line 18) | type Cloud189TV struct
method Config (line 30) | func (y *Cloud189TV) Config() driver.Config {
method GetAddition (line 37) | func (y *Cloud189TV) GetAddition() driver.Additional {
method Init (line 41) | func (y *Cloud189TV) Init(ctx context.Context) (err error) {
method Drop (line 89) | func (y *Cloud189TV) Drop(ctx context.Context) error {
method List (line 97) | func (y *Cloud189TV) List(ctx context.Context, dir model.Obj, args mod...
method Link (line 101) | func (y *Cloud189TV) Link(ctx context.Context, file model.Obj, args mo...
method MakeDir (line 152) | func (y *Cloud189TV) MakeDir(ctx context.Context, parentDir model.Obj,...
method Move (line 184) | func (y *Cloud189TV) Move(ctx context.Context, srcObj, dstDir model.Ob...
method Rename (line 202) | func (y *Cloud189TV) Rename(ctx context.Context, srcObj model.Obj, new...
method Copy (line 238) | func (y *Cloud189TV) Copy(ctx context.Context, srcObj, dstDir model.Ob...
method Remove (line 253) | func (y *Cloud189TV) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 268) | func (y *Cloud189TV) Put(ctx context.Context, dstDir model.Obj, stream...
method GetDetails (line 282) | func (y *Cloud189TV) GetDetails(ctx context.Context) (*model.StorageDe...
FILE: drivers/189_tv/help.go
function clientSuffix (line 16) | func clientSuffix() map[string]string {
function SessionKeySignatureOfHmac (line 31) | func SessionKeySignatureOfHmac(sessionSecret, sessionKey, operate, fullU...
function AppKeySignatureOfHmac (line 40) | func AppKeySignatureOfHmac(sessionSecret, appKey, operate, fullUrl strin...
function getHttpDateStr (line 49) | func getHttpDateStr() string {
function timestamp (line 54) | func timestamp() int64 {
type Time (line 58) | type Time
method UnmarshalJSON (line 60) | func (t *Time) UnmarshalJSON(b []byte) error { return t.Unmarshal(b) }
method UnmarshalXML (line 61) | func (t *Time) UnmarshalXML(e *xml.Decoder, ee xml.StartElement) error {
method Unmarshal (line 73) | func (t *Time) Unmarshal(b []byte) error {
type String (line 87) | type String
method UnmarshalJSON (line 89) | func (t *String) UnmarshalJSON(b []byte) error { return t.Unmarshal(b) }
method UnmarshalXML (line 90) | func (t *String) UnmarshalXML(e *xml.Decoder, ee xml.StartElement) err...
method Unmarshal (line 102) | func (s *String) Unmarshal(b []byte) error {
function toFamilyOrderBy (line 107) | func toFamilyOrderBy(o string) string {
function toDesc (line 120) | func toDesc(o string) string {
function ParseHttpHeader (line 131) | func ParseHttpHeader(str string) map[string]string {
function MustString (line 141) | func MustString(str string, err error) string {
function BoolToNumber (line 145) | func BoolToNumber(b bool) int {
function isBool (line 152) | func isBool(bs ...bool) bool {
function IF (line 161) | func IF[V any](o bool, t V, f V) V {
FILE: drivers/189_tv/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/189_tv/types.go
type RespErr (line 12) | type RespErr struct
method HasError (line 27) | func (e *RespErr) HasError() bool {
method Error (line 37) | func (e *RespErr) Error() string {
type UserSessionResp (line 70) | type UserSessionResp struct
type UuidInfoResp (line 88) | type UuidInfoResp struct
type E189AccessTokenResp (line 92) | type E189AccessTokenResp struct
type AppSessionResp (line 98) | type AppSessionResp struct
type FamilyInfoListResp (line 110) | type FamilyInfoListResp struct
type FamilyInfoResp (line 113) | type FamilyInfoResp struct
type Cloud189File (line 125) | type Cloud189File struct
method CreateTime (line 150) | func (c *Cloud189File) CreateTime() time.Time {
method GetHash (line 154) | func (c *Cloud189File) GetHash() utils.HashInfo {
method GetSize (line 158) | func (c *Cloud189File) GetSize() int64 { return c.Size }
method GetName (line 159) | func (c *Cloud189File) GetName() string { return c.Name }
method ModTime (line 160) | func (c *Cloud189File) ModTime() time.Time { return time.Time(c.LastOp...
method IsDir (line 161) | func (c *Cloud189File) IsDir() bool { return false }
method GetID (line 162) | func (c *Cloud189File) GetID() string { return string(c.ID) }
method GetPath (line 163) | func (c *Cloud189File) GetPath() string { return "" }
method Thumb (line 164) | func (c *Cloud189File) Thumb() string { return c.Icon.SmallUrl }
type Cloud189Folder (line 167) | type Cloud189Folder struct
method CreateTime (line 182) | func (c *Cloud189Folder) CreateTime() time.Time {
method GetHash (line 186) | func (c *Cloud189Folder) GetHash() utils.HashInfo {
method GetSize (line 190) | func (c *Cloud189Folder) GetSize() int64 { return 0 }
method GetName (line 191) | func (c *Cloud189Folder) GetName() string { return c.Name }
method ModTime (line 192) | func (c *Cloud189Folder) ModTime() time.Time { return time.Time(c.Last...
method IsDir (line 193) | func (c *Cloud189Folder) IsDir() bool { return true }
method GetID (line 194) | func (c *Cloud189Folder) GetID() string { return string(c.ID) }
method GetPath (line 195) | func (c *Cloud189Folder) GetPath() string { return "" }
type Cloud189FilesResp (line 197) | type Cloud189FilesResp struct
type BatchTaskInfo (line 208) | type BatchTaskInfo struct
type InitMultiUploadResp (line 225) | type InitMultiUploadResp struct
type UploadUrlsResp (line 234) | type UploadUrlsResp struct
type UploadUrlsData (line 238) | type UploadUrlsData struct
type CreateUploadFileResp (line 244) | type CreateUploadFileResp struct
type GetUploadFileStatusResp (line 255) | type GetUploadFileStatusResp struct
method GetSize (line 263) | func (r *GetUploadFileStatusResp) GetSize() int64 {
type CommitMultiUploadFileResp (line 267) | type CommitMultiUploadFileResp struct
type OldCommitUploadFileResp (line 277) | type OldCommitUploadFileResp struct
method toFile (line 286) | func (f *OldCommitUploadFileResp) toFile() *Cloud189File {
type CreateBatchTaskResp (line 297) | type CreateBatchTaskResp struct
type BatchTaskStateResp (line 301) | type BatchTaskStateResp struct
type BatchTaskConflictTaskInfoResp (line 312) | type BatchTaskConflictTaskInfoResp struct
type CapacityResp (line 320) | type CapacityResp struct
FILE: drivers/189_tv/utils.go
constant TVAppKey (line 30) | TVAppKey = "600100885"
constant TVAppSignatureSecre (line 31) | TVAppSignatureSecre = "fe5734c74c2f96a38157f420b32dc995"
constant TvVersion (line 32) | TvVersion = "6.5.5"
constant AndroidTV (line 33) | AndroidTV = "FAMILY_TV"
constant TvChannelId (line 34) | TvChannelId = "home02"
constant ApiUrl (line 36) | ApiUrl = "https://api.cloud.189.cn"
method SignatureHeader (line 39) | func (y *Cloud189TV) SignatureHeader(url, method string, isFamily bool) ...
method AppKeySignatureHeader (line 57) | func (y *Cloud189TV) AppKeySignatureHeader(url, method string) map[strin...
method request (line 68) | func (y *Cloud189TV) request(url, method string, callback base.ReqCallba...
method requestWithRetry (line 72) | func (y *Cloud189TV) requestWithRetry(url, method string, callback base....
method get (line 126) | func (y *Cloud189TV) get(url string, callback base.ReqCallback, resp int...
method post (line 130) | func (y *Cloud189TV) post(url string, callback base.ReqCallback, resp in...
method put (line 134) | func (y *Cloud189TV) put(ctx context.Context, url string, headers map[st...
method getFiles (line 180) | func (y *Cloud189TV) getFiles(ctx context.Context, fileId string, isFami...
method login (line 232) | func (y *Cloud189TV) login() (err error) {
method refreshSession (line 319) | func (y *Cloud189TV) refreshSession() (err error) {
method keepAlive (line 341) | func (y *Cloud189TV) keepAlive() {
method RapidUpload (line 356) | func (y *Cloud189TV) RapidUpload(ctx context.Context, dstDir model.Obj, ...
method OldUpload (line 375) | func (y *Cloud189TV) OldUpload(ctx context.Context, dstDir model.Obj, fi...
method OldUploadCreate (line 449) | func (y *Cloud189TV) OldUploadCreate(ctx context.Context, parentID strin...
method OldUploadCommit (line 487) | func (y *Cloud189TV) OldUploadCommit(ctx context.Context, fileCommitUrl ...
method isFamily (line 512) | func (y *Cloud189TV) isFamily() bool {
method isLogin (line 516) | func (y *Cloud189TV) isLogin() bool {
method getFamilyInfoList (line 525) | func (y *Cloud189TV) getFamilyInfoList() ([]FamilyInfoResp, error) {
method getFamilyID (line 535) | func (y *Cloud189TV) getFamilyID() (string, error) {
method CreateBatchTask (line 551) | func (y *Cloud189TV) CreateBatchTask(aType string, familyID string, targ...
method CheckBatchTask (line 573) | func (y *Cloud189TV) CheckBatchTask(aType string, taskID string) (*Batch...
method GetConflictTaskInfo (line 588) | func (y *Cloud189TV) GetConflictTaskInfo(aType string, taskID string) (*...
method ManageBatchTask (line 603) | func (y *Cloud189TV) ManageBatchTask(aType string, taskID string, target...
method WaitBatchTask (line 618) | func (y *Cloud189TV) WaitBatchTask(aType string, taskID string, t time.D...
method getCapacityInfo (line 634) | func (y *Cloud189TV) getCapacityInfo(ctx context.Context) (*CapacityResp...
FILE: drivers/189pc/driver.go
type Cloud189PC (line 21) | type Cloud189PC struct
method Config (line 42) | func (y *Cloud189PC) Config() driver.Config {
method GetAddition (line 49) | func (y *Cloud189PC) GetAddition() driver.Additional {
method Init (line 53) | func (y *Cloud189PC) Init(ctx context.Context) (err error) {
method InitReference (line 130) | func (d *Cloud189PC) InitReference(storage driver.Driver) error {
method Drop (line 139) | func (y *Cloud189PC) Drop(ctx context.Context) error {
method List (line 148) | func (y *Cloud189PC) List(ctx context.Context, dir model.Obj, args mod...
method Link (line 152) | func (y *Cloud189PC) Link(ctx context.Context, file model.Obj, args mo...
method MakeDir (line 213) | func (y *Cloud189PC) MakeDir(ctx context.Context, parentDir model.Obj,...
method Move (line 245) | func (y *Cloud189PC) Move(ctx context.Context, srcObj, dstDir model.Ob...
method Rename (line 263) | func (y *Cloud189PC) Rename(ctx context.Context, srcObj model.Obj, new...
method Copy (line 299) | func (y *Cloud189PC) Copy(ctx context.Context, srcObj, dstDir model.Ob...
method Remove (line 314) | func (y *Cloud189PC) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 329) | func (y *Cloud189PC) Put(ctx context.Context, dstDir model.Obj, stream...
method GetDetails (line 414) | func (y *Cloud189PC) GetDetails(ctx context.Context) (*model.StorageDe...
FILE: drivers/189pc/help.go
function clientSuffix (line 25) | func clientSuffix() map[string]string {
function signatureOfHmac (line 36) | func signatureOfHmac(sessionSecret, sessionKey, operate, fullUrl, dateOf...
function RsaEncrypt (line 48) | func RsaEncrypt(publicKey, origData string) string {
function AesECBEncrypt (line 56) | func AesECBEncrypt(data, key string) string {
function PKCS7Padding (line 67) | func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
function getHttpDateStr (line 74) | func getHttpDateStr() string {
function timestamp (line 79) | func timestamp() int64 {
function formatDate (line 84) | func formatDate(t time.Time) string {
function MustParseTime (line 97) | func MustParseTime(str string) *time.Time {
type Time (line 102) | type Time
method UnmarshalJSON (line 104) | func (t *Time) UnmarshalJSON(b []byte) error { return t.Unmarshal(b) }
method UnmarshalXML (line 105) | func (t *Time) UnmarshalXML(e *xml.Decoder, ee xml.StartElement) error {
method Unmarshal (line 117) | func (t *Time) Unmarshal(b []byte) error {
type String (line 131) | type String
method UnmarshalJSON (line 133) | func (t *String) UnmarshalJSON(b []byte) error { return t.Unmarshal(b) }
method UnmarshalXML (line 134) | func (t *String) UnmarshalXML(e *xml.Decoder, ee xml.StartElement) err...
method Unmarshal (line 146) | func (s *String) Unmarshal(b []byte) error {
function toFamilyOrderBy (line 151) | func toFamilyOrderBy(o string) string {
function toDesc (line 164) | func toDesc(o string) string {
function ParseHttpHeader (line 175) | func ParseHttpHeader(str string) map[string]string {
function MustString (line 185) | func MustString(str string, err error) string {
function BoolToNumber (line 189) | func BoolToNumber(b bool) int {
function partSize (line 200) | func partSize(size int64) int64 {
function isBool (line 211) | func isBool(bs ...bool) bool {
function IF (line 220) | func IF[V any](o bool, t V, f V) V {
type WrapFileStreamer (line 227) | type WrapFileStreamer struct
method GetName (line 232) | func (w *WrapFileStreamer) GetName() string {
FILE: drivers/189pc/meta.go
type Addition (line 8) | type Addition struct
function init (line 32) | func init() {
FILE: drivers/189pc/types.go
type RespErr (line 14) | type RespErr struct
method HasError (line 29) | func (e *RespErr) HasError() bool {
method Error (line 39) | func (e *RespErr) Error() string {
type BaseLoginParam (line 71) | type BaseLoginParam struct
type QRLoginParam (line 84) | type QRLoginParam struct
type LoginParam (line 93) | type LoginParam struct
type EncryptConfResp (line 105) | type EncryptConfResp struct
type LoginResp (line 115) | type LoginResp struct
type UserSessionResp (line 122) | type UserSessionResp struct
type AppSessionResp (line 141) | type AppSessionResp struct
type FamilyInfoListResp (line 153) | type FamilyInfoListResp struct
type FamilyInfoResp (line 156) | type FamilyInfoResp struct
type Cloud189File (line 168) | type Cloud189File struct
method CreateTime (line 193) | func (c *Cloud189File) CreateTime() time.Time {
method GetHash (line 197) | func (c *Cloud189File) GetHash() utils.HashInfo {
method GetSize (line 201) | func (c *Cloud189File) GetSize() int64 { return c.Size }
method GetName (line 202) | func (c *Cloud189File) GetName() string { return c.Name }
method ModTime (line 203) | func (c *Cloud189File) ModTime() time.Time { return time.Time(c.LastOp...
method IsDir (line 204) | func (c *Cloud189File) IsDir() bool { return false }
method GetID (line 205) | func (c *Cloud189File) GetID() string { return string(c.ID) }
method GetPath (line 206) | func (c *Cloud189File) GetPath() string { return "" }
method Thumb (line 207) | func (c *Cloud189File) Thumb() string { return c.Icon.SmallUrl }
type Cloud189Folder (line 210) | type Cloud189Folder struct
method CreateTime (line 225) | func (c *Cloud189Folder) CreateTime() time.Time {
method GetHash (line 229) | func (c *Cloud189Folder) GetHash() utils.HashInfo {
method GetSize (line 233) | func (c *Cloud189Folder) GetSize() int64 { return 0 }
method GetName (line 234) | func (c *Cloud189Folder) GetName() string { return c.Name }
method ModTime (line 235) | func (c *Cloud189Folder) ModTime() time.Time { return time.Time(c.Last...
method IsDir (line 236) | func (c *Cloud189Folder) IsDir() bool { return true }
method GetID (line 237) | func (c *Cloud189Folder) GetID() string { return string(c.ID) }
method GetPath (line 238) | func (c *Cloud189Folder) GetPath() string { return "" }
type Cloud189FilesResp (line 240) | type Cloud189FilesResp struct
type BatchTaskInfo (line 251) | type BatchTaskInfo struct
type InitMultiUploadResp (line 268) | type InitMultiUploadResp struct
type UploadUrlsResp (line 277) | type UploadUrlsResp struct
type UploadUrlsData (line 281) | type UploadUrlsData struct
type UploadUrlInfo (line 286) | type UploadUrlInfo struct
type UploadProgress (line 292) | type UploadProgress struct
type CreateUploadFileResp (line 298) | type CreateUploadFileResp struct
type GetUploadFileStatusResp (line 309) | type GetUploadFileStatusResp struct
method GetSize (line 317) | func (r *GetUploadFileStatusResp) GetSize() int64 {
type CommitMultiUploadFileResp (line 321) | type CommitMultiUploadFileResp struct
method toFile (line 331) | func (f *CommitMultiUploadFileResp) toFile() *Cloud189File {
type OldCommitUploadFileResp (line 342) | type OldCommitUploadFileResp struct
method toFile (line 351) | func (f *OldCommitUploadFileResp) toFile() *Cloud189File {
type CreateBatchTaskResp (line 362) | type CreateBatchTaskResp struct
type BatchTaskStateResp (line 366) | type BatchTaskStateResp struct
type BatchTaskConflictTaskInfoResp (line 377) | type BatchTaskConflictTaskInfoResp struct
type Params (line 386) | type Params
method Set (line 388) | func (p Params) Set(k, v string) {
method Encode (line 392) | func (p Params) Encode() string {
type CapacityResp (line 413) | type CapacityResp struct
FILE: drivers/189pc/utils.go
constant ACCOUNT_TYPE (line 42) | ACCOUNT_TYPE = "02"
constant APP_ID (line 43) | APP_ID = "8025431004"
constant CLIENT_TYPE (line 44) | CLIENT_TYPE = "10020"
constant VERSION (line 45) | VERSION = "6.2"
constant WEB_URL (line 47) | WEB_URL = "https://cloud.189.cn"
constant AUTH_URL (line 48) | AUTH_URL = "https://open.e.189.cn"
constant API_URL (line 49) | API_URL = "https://api.cloud.189.cn"
constant UPLOAD_URL (line 50) | UPLOAD_URL = "https://upload.cloud.189.cn"
constant RETURN_URL (line 52) | RETURN_URL = "https://m.cloud.189.cn/zhuanti/2020/loginErrorPc/index.html"
constant PC (line 54) | PC = "TELEPC"
constant MAC (line 55) | MAC = "TELEMAC"
constant CHANNEL_ID (line 57) | CHANNEL_ID = "web_cloud.189.cn"
constant UserInvalidOpenTokenError (line 60) | UserInvalidOpenTokenError = "UserInvalidOpenToken"
method SignatureHeader (line 63) | func (y *Cloud189PC) SignatureHeader(url, method, params string, isFamil...
method EncryptParams (line 81) | func (y *Cloud189PC) EncryptParams(params Params, isFamily bool) string {
method request (line 92) | func (y *Cloud189PC) request(url, method string, callback base.ReqCallba...
method get (line 143) | func (y *Cloud189PC) get(url string, callback base.ReqCallback, resp int...
method post (line 147) | func (y *Cloud189PC) post(url string, callback base.ReqCallback, resp in...
method put (line 151) | func (y *Cloud189PC) put(ctx context.Context, url string, headers map[st...
method getFiles (line 196) | func (y *Cloud189PC) getFiles(ctx context.Context, fileId string, isFami...
method getFilesWithPage (line 218) | func (y *Cloud189PC) getFilesWithPage(ctx context.Context, fileId string...
method findFileByName (line 256) | func (y *Cloud189PC) findFileByName(ctx context.Context, searchName stri...
method login (line 275) | func (y *Cloud189PC) login() error {
method loginByPassword (line 282) | func (y *Cloud189PC) loginByPassword() (err error) {
method loginByQRCode (line 365) | func (y *Cloud189PC) loginByQRCode() error {
method genQRCode (line 434) | func (y *Cloud189PC) genQRCode(text string) error {
method initBaseParams (line 456) | func (y *Cloud189PC) initBaseParams() (*BaseLoginParam, error) {
method initLoginParam (line 484) | func (y *Cloud189PC) initLoginParam() error {
method initQRCodeParam (line 555) | func (y *Cloud189PC) initQRCodeParam() (err error) {
method refreshSession (line 579) | func (y *Cloud189PC) refreshSession() (err error) {
method refreshSessionWithRetry (line 583) | func (y *Cloud189PC) refreshSessionWithRetry(retryCount int) (err error) {
method refreshToken (line 614) | func (y *Cloud189PC) refreshToken() (err error) {
method refreshTokenWithRetry (line 618) | func (y *Cloud189PC) refreshTokenWithRetry(retryCount int) (err error) {
method keepAlive (line 670) | func (y *Cloud189PC) keepAlive() {
method StreamUpload (line 687) | func (y *Cloud189PC) StreamUpload(ctx context.Context, dstDir model.Obj,...
method RapidUpload (line 830) | func (y *Cloud189PC) RapidUpload(ctx context.Context, dstDir model.Obj, ...
method FastUpload (line 849) | func (y *Cloud189PC) FastUpload(ctx context.Context, dstDir model.Obj, f...
method GetMultiUploadUrls (line 1026) | func (y *Cloud189PC) GetMultiUploadUrls(ctx context.Context, isFamily bo...
method OldUpload (line 1070) | func (y *Cloud189PC) OldUpload(ctx context.Context, dstDir model.Obj, fi...
method OldUploadCreate (line 1134) | func (y *Cloud189PC) OldUploadCreate(ctx context.Context, parentID strin...
method OldUploadCommit (line 1172) | func (y *Cloud189PC) OldUploadCommit(ctx context.Context, fileCommitUrl ...
method isFamily (line 1197) | func (y *Cloud189PC) isFamily() bool {
method isLogin (line 1201) | func (y *Cloud189PC) isLogin() bool {
method createFamilyTransferFolder (line 1210) | func (y *Cloud189PC) createFamilyTransferFolder() error {
method cleanFamilyTransfer (line 1226) | func (y *Cloud189PC) cleanFamilyTransfer(ctx context.Context) error {
method getFamilyInfoList (line 1279) | func (y *Cloud189PC) getFamilyInfoList() ([]FamilyInfoResp, error) {
method getFamilyID (line 1289) | func (y *Cloud189PC) getFamilyID() (string, error) {
method SaveFamilyFileToPersonCloud (line 1306) | func (y *Cloud189PC) SaveFamilyFileToPersonCloud(ctx context.Context, fa...
method Delete (line 1351) | func (y *Cloud189PC) Delete(ctx context.Context, familyId string, srcObj...
method CreateBatchTask (line 1378) | func (y *Cloud189PC) CreateBatchTask(aType string, familyID string, targ...
method CheckBatchTask (line 1400) | func (y *Cloud189PC) CheckBatchTask(aType string, taskID string) (*Batch...
method GetConflictTaskInfo (line 1415) | func (y *Cloud189PC) GetConflictTaskInfo(aType string, taskID string) (*...
method ManageBatchTask (line 1430) | func (y *Cloud189PC) ManageBatchTask(aType string, taskID string, target...
method WaitBatchTask (line 1445) | func (y *Cloud189PC) WaitBatchTask(aType string, taskID string, t time.D...
method getTokenInfo (line 1461) | func (y *Cloud189PC) getTokenInfo() *AppSessionResp {
method getClient (line 1468) | func (y *Cloud189PC) getClient() *resty.Client {
method getCapacityInfo (line 1475) | func (y *Cloud189PC) getCapacityInfo(ctx context.Context) (*CapacityResp...
FILE: drivers/alias/driver.go
type Alias (line 25) | type Alias struct
method Config (line 33) | func (d *Alias) Config() driver.Config {
method GetAddition (line 37) | func (d *Alias) GetAddition() driver.Additional {
method Init (line 41) | func (d *Alias) Init(ctx context.Context) error {
method Drop (line 99) | func (d *Alias) Drop(ctx context.Context) error {
method GetRoot (line 106) | func (d *Alias) GetRoot(ctx context.Context) (model.Obj, error) {
method Get (line 114) | func (d *Alias) Get(ctx context.Context, path string) (model.Obj, erro...
method List (line 172) | func (d *Alias) List(ctx context.Context, dir model.Obj, args model.Li...
method Link (line 244) | func (d *Alias) Link(ctx context.Context, file model.Obj, args model.L...
method Other (line 336) | func (d *Alias) Other(ctx context.Context, args model.OtherArgs) (inte...
method MakeDir (line 350) | func (d *Alias) MakeDir(ctx context.Context, parentDir model.Obj, dirN...
method Move (line 360) | func (d *Alias) Move(ctx context.Context, srcObj, dstDir model.Obj) er...
method Rename (line 377) | func (d *Alias) Rename(ctx context.Context, srcObj model.Obj, newName ...
method Copy (line 387) | func (d *Alias) Copy(ctx context.Context, srcObj, dstDir model.Obj) er...
method Remove (line 399) | func (d *Alias) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 409) | func (d *Alias) Put(ctx context.Context, dstDir model.Obj, s model.Fil...
method PutURL (line 447) | func (d *Alias) PutURL(ctx context.Context, dstDir model.Obj, name, ur...
method GetArchiveMeta (line 458) | func (d *Alias) GetArchiveMeta(ctx context.Context, obj model.Obj, arg...
method ListArchive (line 470) | func (d *Alias) ListArchive(ctx context.Context, obj model.Obj, args m...
method Extract (line 482) | func (d *Alias) Extract(ctx context.Context, obj model.Obj, args model...
method ArchiveDecompress (line 509) | func (d *Alias) ArchiveDecompress(ctx context.Context, srcObj, dstDir ...
method GetDetails (line 521) | func (d *Alias) GetDetails(ctx context.Context) (*model.StorageDetails...
method ResolveLinkCacheMode (line 547) | func (d *Alias) ResolveLinkCacheMode(path string) driver.LinkCacheMode {
FILE: drivers/alias/meta.go
type Addition (line 8) | type Addition struct
function init (line 30) | func init() {
FILE: drivers/alias/types.go
constant DisabledWP (line 12) | DisabledWP = "disabled"
constant FirstRWP (line 13) | FirstRWP = "first"
constant DeterministicWP (line 14) | DeterministicWP = "deterministic"
constant DeterministicOrAllWP (line 15) | DeterministicOrAllWP = "deterministic_or_all"
constant AllRWP (line 16) | AllRWP = "all"
constant AllStrictWP (line 17) | AllStrictWP = "all_strict"
constant RandomBalancedRP (line 18) | RandomBalancedRP = "random"
constant BalancedByQuotaP (line 19) | BalancedByQuotaP = "quota"
constant BalancedByQuotaStrictP (line 20) | BalancedByQuotaStrictP = "quota_strict"
type BalancedObjs (line 38) | type BalancedObjs
method GetSize (line 40) | func (b BalancedObjs) GetSize() int64 {
method ModTime (line 44) | func (b BalancedObjs) ModTime() time.Time {
method CreateTime (line 48) | func (b BalancedObjs) CreateTime() time.Time {
method IsDir (line 52) | func (b BalancedObjs) IsDir() bool {
method GetHash (line 56) | func (b BalancedObjs) GetHash() utils.HashInfo {
method GetName (line 60) | func (b BalancedObjs) GetName() string {
method GetPath (line 64) | func (b BalancedObjs) GetPath() string {
method GetID (line 68) | func (b BalancedObjs) GetID() string {
method Unwrap (line 72) | func (b BalancedObjs) Unwrap() model.Obj {
type tempObj (line 78) | type tempObj struct
FILE: drivers/alias/util.go
type detailWithIndex (line 20) | type detailWithIndex struct
method listRoot (line 25) | func (d *Alias) listRoot(ctx context.Context, withDetails, refresh bool)...
function getPair (line 80) | func getPair(path string) (string, string) {
method getRootsAndPath (line 87) | func (d *Alias) getRootsAndPath(path string) (roots []string, sub string) {
method link (line 99) | func (d *Alias) link(ctx context.Context, reqPath string, args model.Lin...
function isConsistent (line 110) | func isConsistent(a, b model.Obj) bool {
method getAllObjs (line 123) | func (d *Alias) getAllObjs(ctx context.Context, bObj model.Obj, ifContin...
method getBalancedPath (line 175) | func (d *Alias) getBalancedPath(ctx context.Context, file model.Obj) str...
function getWriteAndPutFilterFunc (line 187) | func getWriteAndPutFilterFunc(policy string) func(error) (bool, error) {
method getWriteObjs (line 225) | func (d *Alias) getWriteObjs(ctx context.Context, obj model.Obj) (Balanc...
method getPutObjs (line 232) | func (d *Alias) getPutObjs(ctx context.Context, obj model.Obj) (Balanced...
function getRandomObjByQuotaBalanced (line 259) | func getRandomObjByQuotaBalanced(ctx context.Context, reqPath BalancedOb...
function selectRandom (line 320) | func selectRandom[Item any](arr []Item, getWeight func(Item) uint64) (in...
method getCopyObjs (line 339) | func (d *Alias) getCopyObjs(ctx context.Context, srcObj, dstDir model.Ob...
method getMoveObjs (line 390) | func (d *Alias) getMoveObjs(ctx context.Context, srcObj, dstDir model.Ob...
method getArchiveMeta (line 447) | func (d *Alias) getArchiveMeta(ctx context.Context, reqPath string, args...
method listArchive (line 461) | func (d *Alias) listArchive(ctx context.Context, reqPath string, args mo...
method extract (line 475) | func (d *Alias) extract(ctx context.Context, reqPath string, args model....
function getAllSort (line 494) | func getAllSort(dirs []model.Obj) model.Sort {
FILE: drivers/alist_v3/driver.go
type AListV3 (line 23) | type AListV3 struct
method Config (line 28) | func (d *AListV3) Config() driver.Config {
method GetAddition (line 32) | func (d *AListV3) GetAddition() driver.Additional {
method Init (line 36) | func (d *AListV3) Init(ctx context.Context) error {
method Drop (line 73) | func (d *AListV3) Drop(ctx context.Context) error {
method List (line 77) | func (d *AListV3) List(ctx context.Context, dir model.Obj, args model....
method Link (line 111) | func (d *AListV3) Link(ctx context.Context, file model.Obj, args model...
method MakeDir (line 145) | func (d *AListV3) MakeDir(ctx context.Context, parentDir model.Obj, di...
method Move (line 154) | func (d *AListV3) Move(ctx context.Context, srcObj, dstDir model.Obj) ...
method Rename (line 165) | func (d *AListV3) Rename(ctx context.Context, srcObj model.Obj, newNam...
method Copy (line 175) | func (d *AListV3) Copy(ctx context.Context, srcObj, dstDir model.Obj) ...
method Remove (line 186) | func (d *AListV3) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 196) | func (d *AListV3) Put(ctx context.Context, dstDir model.Obj, s model.F...
method GetArchiveMeta (line 247) | func (d *AListV3) GetArchiveMeta(ctx context.Context, obj model.Obj, a...
method ListArchive (line 280) | func (d *AListV3) ListArchive(ctx context.Context, obj model.Obj, args...
method Extract (line 324) | func (d *AListV3) Extract(ctx context.Context, obj model.Obj, args mod...
method ArchiveDecompress (line 349) | func (d *AListV3) ArchiveDecompress(ctx context.Context, srcObj, dstDi...
method ResolveLinkCacheMode (line 368) | func (d *AListV3) ResolveLinkCacheMode(_ string) driver.LinkCacheMode {
FILE: drivers/alist_v3/meta.go
type Addition (line 8) | type Addition struct
function init (line 28) | func init() {
FILE: drivers/alist_v3/types.go
type ListReq (line 11) | type ListReq struct
type ObjResp (line 18) | type ObjResp struct
type FsListResp (line 30) | type FsListResp struct
type FsGetReq (line 38) | type FsGetReq struct
type FsGetResp (line 43) | type FsGetResp struct
type MkdirOrLinkReq (line 51) | type MkdirOrLinkReq struct
type MoveCopyReq (line 55) | type MoveCopyReq struct
type RenameReq (line 61) | type RenameReq struct
type RemoveReq (line 66) | type RemoveReq struct
type LoginResp (line 71) | type LoginResp struct
type MeResp (line 75) | type MeResp struct
type IntSlice (line 87) | type IntSlice
method UnmarshalJSON (line 89) | func (s *IntSlice) UnmarshalJSON(b []byte) error {
type ArchiveMetaReq (line 98) | type ArchiveMetaReq struct
type TreeResp (line 105) | type TreeResp struct
method GetSize (line 111) | func (t *TreeResp) GetSize() int64 {
method GetName (line 115) | func (t *TreeResp) GetName() string {
method ModTime (line 119) | func (t *TreeResp) ModTime() time.Time {
method CreateTime (line 123) | func (t *TreeResp) CreateTime() time.Time {
method IsDir (line 127) | func (t *TreeResp) IsDir() bool {
method GetHash (line 131) | func (t *TreeResp) GetHash() utils.HashInfo {
method GetID (line 135) | func (t *TreeResp) GetID() string {
method GetPath (line 139) | func (t *TreeResp) GetPath() string {
method GetChildren (line 143) | func (t *TreeResp) GetChildren() []model.ObjTree {
method Thumb (line 151) | func (t *TreeResp) Thumb() string {
type ArchiveMetaResp (line 155) | type ArchiveMetaResp struct
type ArchiveListReq (line 163) | type ArchiveListReq struct
type ArchiveListResp (line 169) | type ArchiveListResp struct
type DecompressReq (line 174) | type DecompressReq struct
FILE: drivers/alist_v3/util.go
method login (line 15) | func (d *AListV3) login() error {
method request (line 34) | func (d *AListV3) request(api, method string, callback base.ReqCallback,...
FILE: drivers/aliyundrive/driver.go
type AliDrive (line 29) | type AliDrive struct
method Config (line 38) | func (d *AliDrive) Config() driver.Config {
method GetAddition (line 42) | func (d *AliDrive) GetAddition() driver.Additional {
method Init (line 46) | func (d *AliDrive) Init(ctx context.Context) error {
method Drop (line 85) | func (d *AliDrive) Drop(ctx context.Context) error {
method List (line 92) | func (d *AliDrive) List(ctx context.Context, dir model.Obj, args model...
method Link (line 102) | func (d *AliDrive) Link(ctx context.Context, file model.Obj, args mode...
method MakeDir (line 122) | func (d *AliDrive) MakeDir(ctx context.Context, parentDir model.Obj, d...
method Move (line 135) | func (d *AliDrive) Move(ctx context.Context, srcObj, dstDir model.Obj)...
method Rename (line 140) | func (d *AliDrive) Rename(ctx context.Context, srcObj model.Obj, newNa...
method Copy (line 152) | func (d *AliDrive) Copy(ctx context.Context, srcObj, dstDir model.Obj)...
method Remove (line 157) | func (d *AliDrive) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 167) | func (d *AliDrive) Put(ctx context.Context, dstDir model.Obj, streamer...
method GetDetails (line 330) | func (d *AliDrive) GetDetails(ctx context.Context) (*model.StorageDeta...
method Other (line 347) | func (d *AliDrive) Other(ctx context.Context, args model.OtherArgs) (i...
FILE: drivers/aliyundrive/global.go
type State (line 9) | type State struct
FILE: drivers/aliyundrive/help.go
function NewPrivateKey (line 12) | func NewPrivateKey() (*ecdsa.PrivateKey, error) {
function NewPrivateKeyFromHex (line 17) | func NewPrivateKeyFromHex(hex_ string) (*ecdsa.PrivateKey, error) {
function NewPrivateKeyFromBytes (line 26) | func NewPrivateKeyFromBytes(priv []byte) *ecdsa.PrivateKey {
function PrivateKeyToHex (line 39) | func PrivateKeyToHex(private *ecdsa.PrivateKey) string {
function PrivateKeyToBytes (line 43) | func PrivateKeyToBytes(private *ecdsa.PrivateKey) []byte {
function PublicKeyToHex (line 47) | func PublicKeyToHex(public *ecdsa.PublicKey) string {
function PublicKeyToBytes (line 51) | func PublicKeyToBytes(public *ecdsa.PublicKey) []byte {
FILE: drivers/aliyundrive/meta.go
type Addition (line 8) | type Addition struct
function init (line 26) | func init() {
FILE: drivers/aliyundrive/types.go
type RespErr (line 9) | type RespErr struct
type Files (line 14) | type Files struct
type File (line 19) | type File struct
function fileToObj (line 34) | func fileToObj(f File) *model.ObjThumb {
type UploadResp (line 47) | type UploadResp struct
FILE: drivers/aliyundrive/util.go
method createSession (line 18) | func (d *AliDrive) createSession() error {
method sign (line 49) | func (d *AliDrive) sign() {
method refreshToken (line 60) | func (d *AliDrive) refreshToken() error {
method request (line 84) | func (d *AliDrive) request(url, method string, callback base.ReqCallback...
method getFiles (line 140) | func (d *AliDrive) getFiles(fileId string) ([]File, error) {
method batch (line 174) | func (d *AliDrive) batch(srcId, dstId string, url string) error {
FILE: drivers/aliyundrive_open/driver.go
type AliyundriveOpen (line 19) | type AliyundriveOpen struct
method Config (line 29) | func (d *AliyundriveOpen) Config() driver.Config {
method GetAddition (line 33) | func (d *AliyundriveOpen) GetAddition() driver.Additional {
method Init (line 37) | func (d *AliyundriveOpen) Init(ctx context.Context) error {
method InitReference (line 58) | func (d *AliyundriveOpen) InitReference(storage driver.Driver) error {
method Drop (line 67) | func (d *AliyundriveOpen) Drop(ctx context.Context) error {
method GetRoot (line 75) | func (d *AliyundriveOpen) GetRoot(ctx context.Context) (model.Obj, err...
method List (line 85) | func (d *AliyundriveOpen) List(ctx context.Context, dir model.Obj, arg...
method Link (line 103) | func (d *AliyundriveOpen) Link(ctx context.Context, file model.Obj, ar...
method MakeDir (line 128) | func (d *AliyundriveOpen) MakeDir(ctx context.Context, parentDir model...
method Move (line 155) | func (d *AliyundriveOpen) Move(ctx context.Context, srcObj, dstDir mod...
method Rename (line 185) | func (d *AliyundriveOpen) Rename(ctx context.Context, srcObj model.Obj...
method Copy (line 217) | func (d *AliyundriveOpen) Copy(ctx context.Context, srcObj, dstDir mod...
method Remove (line 240) | func (d *AliyundriveOpen) Remove(ctx context.Context, obj model.Obj) e...
method Put (line 254) | func (d *AliyundriveOpen) Put(ctx context.Context, dstDir model.Obj, s...
method Other (line 269) | func (d *AliyundriveOpen) Other(ctx context.Context, args model.OtherA...
method GetDetails (line 293) | func (d *AliyundriveOpen) GetDetails(ctx context.Context) (*model.Stor...
FILE: drivers/aliyundrive_open/limiter.go
type limiterType (line 15) | type limiterType
constant limiterList (line 18) | limiterList limiterType = iota
constant limiterLink (line 19) | limiterLink
constant limiterOther (line 20) | limiterOther
constant listRateLimit (line 24) | listRateLimit = 3.9
constant linkRateLimit (line 25) | linkRateLimit = 0.9
constant otherRateLimit (line 26) | otherRateLimit = 14.9
constant globalLimiterUserID (line 27) | globalLimiterUserID = ""
type limiter (line 30) | type limiter struct
method wait (line 65) | func (l *limiter) wait(ctx context.Context, typ limiterType) error {
method free (line 80) | func (l *limiter) free() {
function getLimiterForUser (line 40) | func getLimiterForUser(userid string) *limiter {
method wait (line 88) | func (d *AliyundriveOpen) wait(ctx context.Context, typ limiterType) err...
FILE: drivers/aliyundrive_open/meta.go
type Addition (line 8) | type Addition struct
function init (line 33) | func init() {
FILE: drivers/aliyundrive_open/types.go
type ErrResp (line 11) | type ErrResp struct
type Files (line 16) | type Files struct
type File (line 21) | type File struct
function fileToObj (line 40) | func fileToObj(f File) *model.ObjThumb {
type PartInfo (line 58) | type PartInfo struct
type CreateResp (line 66) | type CreateResp struct
type MoveOrCopyResp (line 81) | type MoveOrCopyResp struct
FILE: drivers/aliyundrive_open/upload.go
function makePartInfos (line 25) | func makePartInfos(size int) []base.Json {
function calPartSize (line 33) | func calPartSize(fileSize int64) int64 {
method getUploadUrl (line 53) | func (d *AliyundriveOpen) getUploadUrl(ctx context.Context, count int, f...
method uploadPart (line 67) | func (d *AliyundriveOpen) uploadPart(ctx context.Context, r io.Reader, p...
method completeUpload (line 87) | func (d *AliyundriveOpen) completeUpload(ctx context.Context, fileId, up...
type ProofRange (line 103) | type ProofRange struct
function getProofRange (line 108) | func getProofRange(input string, size int64) (*ProofRange, error) {
method calProofCode (line 128) | func (d *AliyundriveOpen) calProofCode(stream model.FileStreamer) (strin...
method upload (line 146) | func (d *AliyundriveOpen) upload(ctx context.Context, dstDir model.Obj, ...
FILE: drivers/aliyundrive_open/util.go
method _refreshToken (line 22) | func (d *AliyundriveOpen) _refreshToken(ctx context.Context) (string, st...
function getSub (line 106) | func getSub(token string) (string, error) {
method refreshToken (line 118) | func (d *AliyundriveOpen) refreshToken(ctx context.Context) error {
method request (line 140) | func (d *AliyundriveOpen) request(ctx context.Context, limitTy limiterTy...
method requestReturnErrResp (line 145) | func (d *AliyundriveOpen) requestReturnErrResp(ctx context.Context, limi...
method list (line 182) | func (d *AliyundriveOpen) list(ctx context.Context, data base.Json) (*Fi...
method getFiles (line 193) | func (d *AliyundriveOpen) getFiles(ctx context.Context, fileId string) (...
function getNowTime (line 223) | func getNowTime() (time.Time, string) {
method getAccessToken (line 229) | func (d *AliyundriveOpen) getAccessToken() string {
method removeDuplicateFiles (line 238) | func (d *AliyundriveOpen) removeDuplicateFiles(ctx context.Context, pare...
FILE: drivers/aliyundrive_share/driver.go
type AliyundriveShare (line 18) | type AliyundriveShare struct
method Config (line 29) | func (d *AliyundriveShare) Config() driver.Config {
method GetAddition (line 33) | func (d *AliyundriveShare) GetAddition() driver.Additional {
method Init (line 37) | func (d *AliyundriveShare) Init(ctx context.Context) error {
method Drop (line 61) | func (d *AliyundriveShare) Drop(ctx context.Context) error {
method List (line 71) | func (d *AliyundriveShare) List(ctx context.Context, dir model.Obj, ar...
method Link (line 81) | func (d *AliyundriveShare) Link(ctx context.Context, file model.Obj, a...
method Other (line 104) | func (d *AliyundriveShare) Other(ctx context.Context, args model.Other...
FILE: drivers/aliyundrive_share/limiter.go
type limiterType (line 13) | type limiterType
constant limiterList (line 16) | limiterList limiterType = iota
constant limiterLink (line 17) | limiterLink
constant limiterOther (line 18) | limiterOther
constant listRateLimit (line 22) | listRateLimit = 3.9
constant linkRateLimit (line 23) | linkRateLimit = 0.9
constant otherRateLimit (line 24) | otherRateLimit = 14.9
type limiter (line 27) | type limiter struct
method wait (line 41) | func (l *limiter) wait(ctx context.Context, typ limiterType) error {
method free (line 56) | func (l *limiter) free() {
function getLimiter (line 33) | func getLimiter() *limiter {
method wait (line 59) | func (d *AliyundriveShare) wait(ctx context.Context, typ limiterType) er...
FILE: drivers/aliyundrive_share/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/aliyundrive_share/types.go
type ErrorResp (line 9) | type ErrorResp struct
type ShareTokenResp (line 14) | type ShareTokenResp struct
type ListResp (line 20) | type ListResp struct
type File (line 26) | type File struct
function fileToObj (line 40) | func fileToObj(f File) *model.ObjThumb {
type ShareLinkResp (line 54) | type ShareLinkResp struct
FILE: drivers/aliyundrive_share/util.go
constant CanaryHeaderKey (line 15) | CanaryHeaderKey = "X-Canary"
constant CanaryHeaderValue (line 16) | CanaryHeaderValue = "client=web,app=share,version=v2.3.1"
method refreshToken (line 19) | func (d *AliyundriveShare) refreshToken(ctx context.Context) error {
method getShareToken (line 44) | func (d *AliyundriveShare) getShareToken(ctx context.Context) error {
method request (line 70) | func (d *AliyundriveShare) request(ctx context.Context, limitTy limiterT...
method getFiles (line 109) | func (d *AliyundriveShare) getFiles(ctx context.Context, fileId string) ...
FILE: drivers/all.go
function All (line 88) | func All() {
FILE: drivers/autoindex/driver.go
type AutoIndex (line 18) | type AutoIndex struct
method Config (line 28) | func (d *AutoIndex) Config() driver.Config {
method GetAddition (line 32) | func (d *AutoIndex) GetAddition() driver.Additional {
method Init (line 36) | func (d *AutoIndex) Init(ctx context.Context) error {
method Drop (line 81) | func (d *AutoIndex) Drop(ctx context.Context) error {
method GetRoot (line 85) | func (d *AutoIndex) GetRoot(ctx context.Context) (model.Obj, error) {
method List (line 95) | func (d *AutoIndex) List(ctx context.Context, dir model.Obj, args mode...
method Link (line 151) | func (d *AutoIndex) Link(ctx context.Context, file model.Obj, args mod...
FILE: drivers/autoindex/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/autoindex/types.go
type exactSizeObj (line 13) | type exactSizeObj struct
FILE: drivers/autoindex/util.go
function splitUnit (line 35) | func splitUnit(s string) (string, string) {
function parseSize (line 44) | func parseSize(a any) (int64, bool, error) {
function parseString (line 84) | func parseString(res any) (string, error) {
function parseTime (line 105) | func parseTime(res any, format string) (time.Time, error) {
FILE: drivers/autoindex/util_test.go
type wantType (line 7) | type wantType struct
function TestParseSize (line 13) | func TestParseSize(t *testing.T) {
FILE: drivers/azure_blob/driver.go
type AzureBlob (line 23) | type AzureBlob struct
method Config (line 31) | func (d *AzureBlob) Config() driver.Config {
method GetAddition (line 36) | func (d *AzureBlob) GetAddition() driver.Additional {
method Init (line 41) | func (d *AzureBlob) Init(ctx context.Context) error {
method Drop (line 80) | func (d *AzureBlob) Drop(ctx context.Context) error {
method List (line 86) | func (d *AzureBlob) List(ctx context.Context, dir model.Obj, args mode...
method Link (line 134) | func (d *AzureBlob) Link(ctx context.Context, file model.Obj, args mod...
method MakeDir (line 146) | func (d *AzureBlob) MakeDir(ctx context.Context, parentDir model.Obj, ...
method Move (line 160) | func (d *AzureBlob) Move(ctx context.Context, srcObj, dstDir model.Obj...
method Rename (line 178) | func (d *AzureBlob) Rename(ctx context.Context, srcObj model.Obj, newN...
method Copy (line 196) | func (d *AzureBlob) Copy(ctx context.Context, srcObj, dstDir model.Obj...
method Remove (line 266) | func (d *AzureBlob) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 279) | func (d *AzureBlob) Put(ctx context.Context, dstDir model.Obj, stream ...
FILE: drivers/azure_blob/meta.go
type Addition (line 8) | type Addition struct
function init (line 22) | func init() {
FILE: drivers/azure_blob/types.go
type progressTracker (line 6) | type progressTracker struct
method Write (line 13) | func (pt *progressTracker) Write(p []byte) (n int, err error) {
FILE: drivers/azure_blob/util.go
constant MaxRetries (line 26) | MaxRetries = 3
constant RetryDelay (line 28) | RetryDelay = 3 * time.Second
constant MaxBatchSize (line 30) | MaxBatchSize = 128
function extractAccountName (line 34) | func extractAccountName(endpoint string) string {
function isNotFoundError (line 49) | func isNotFoundError(err error) bool {
method flattenListBlobs (line 59) | func (d *AzureBlob) flattenListBlobs(ctx context.Context, prefix string)...
method batchDeleteBlobs (line 86) | func (d *AzureBlob) batchDeleteBlobs(ctx context.Context, blobPaths []st...
method deleteFolder (line 132) | func (d *AzureBlob) deleteFolder(ctx context.Context, prefix string) err...
method deleteFile (line 194) | func (d *AzureBlob) deleteFile(ctx context.Context, path string, isDir b...
method copyFile (line 204) | func (d *AzureBlob) copyFile(ctx context.Context, srcPath, dstPath strin...
method createContainerIfNotExists (line 222) | func (d *AzureBlob) createContainerIfNotExists(ctx context.Context, cont...
method mkDir (line 240) | func (d *AzureBlob) mkDir(ctx context.Context, fullDirName string) error {
function ensureTrailingSlash (line 260) | func ensureTrailingSlash(path string) string {
method moveOrRename (line 268) | func (d *AzureBlob) moveOrRename(ctx context.Context, srcPath, dstPath s...
function optimizedUploadOptions (line 331) | func optimizedUploadOptions(fileSize int64) *azblob.UploadStreamOptions {
function isDirectory (line 354) | func isDirectory(blob container.BlobItem) bool {
method deleteEmptyDirectory (line 383) | func (d *AzureBlob) deleteEmptyDirectory(ctx context.Context, dirPath st...
FILE: drivers/baidu_netdisk/driver.go
type BaiduNetdisk (line 31) | type BaiduNetdisk struct
method Config (line 41) | func (d *BaiduNetdisk) Config() driver.Config {
method GetAddition (line 45) | func (d *BaiduNetdisk) GetAddition() driver.Additional {
method Init (line 49) | func (d *BaiduNetdisk) Init(ctx context.Context) error {
method Drop (line 72) | func (d *BaiduNetdisk) Drop(ctx context.Context) error {
method List (line 76) | func (d *BaiduNetdisk) List(ctx context.Context, dir model.Obj, args m...
method Link (line 86) | func (d *BaiduNetdisk) Link(ctx context.Context, file model.Obj, args ...
method MakeDir (line 96) | func (d *BaiduNetdisk) MakeDir(ctx context.Context, parentDir model.Ob...
method Move (line 105) | func (d *BaiduNetdisk) Move(ctx context.Context, srcObj, dstDir model....
method Rename (line 125) | func (d *BaiduNetdisk) Rename(ctx context.Context, srcObj model.Obj, n...
method Copy (line 146) | func (d *BaiduNetdisk) Copy(ctx context.Context, srcObj, dstDir model....
method Remove (line 158) | func (d *BaiduNetdisk) Remove(ctx context.Context, obj model.Obj) error {
method PutRapid (line 164) | func (d *BaiduNetdisk) PutRapid(ctx context.Context, dstDir model.Obj,...
method Put (line 191) | func (d *BaiduNetdisk) Put(ctx context.Context, dstDir model.Obj, stre...
method precreate (line 396) | func (d *BaiduNetdisk) precreate(ctx context.Context, path string, str...
method uploadSlice (line 430) | func (d *BaiduNetdisk) uploadSlice(ctx context.Context, uploadUrl stri...
method GetDetails (line 492) | func (d *BaiduNetdisk) GetDetails(ctx context.Context) (*model.Storage...
FILE: drivers/baidu_netdisk/meta.go
type Addition (line 10) | type Addition struct
constant UPLOAD_FALLBACK_API (line 32) | UPLOAD_FALLBACK_API = "https://d.pcs.baidu.com"
constant UPLOAD_URL_EXPIRE_TIME (line 33) | UPLOAD_URL_EXPIRE_TIME = time.Minute * 60
constant DEFAULT_UPLOAD_SLICE_TIMEOUT (line 34) | DEFAULT_UPLOAD_SLICE_TIMEOUT = time.Second * 60
constant UPLOAD_RETRY_COUNT (line 35) | UPLOAD_RETRY_COUNT = 3
constant UPLOAD_RETRY_WAIT_TIME (line 36) | UPLOAD_RETRY_WAIT_TIME = time.Second * 1
constant UPLOAD_RETRY_MAX_WAIT_TIME (line 37) | UPLOAD_RETRY_MAX_WAIT_TIME = time.Second * 5
function init (line 46) | func init() {
FILE: drivers/baidu_netdisk/types.go
type TokenErrResp (line 16) | type TokenErrResp struct
type File (line 21) | type File struct
function fileToObj (line 59) | func fileToObj(f File) *model.ObjThumb {
type ListResp (line 84) | type ListResp struct
type DownloadResp (line 92) | type DownloadResp struct
type DownloadResp2 (line 122) | type DownloadResp2 struct
type PrecreateResp (line 181) | type PrecreateResp struct
type UploadServerResp (line 197) | type UploadServerResp struct
type QuotaResp (line 221) | type QuotaResp struct
FILE: drivers/baidu_netdisk/util.go
method refreshToken (line 26) | func (d *BaiduNetdisk) refreshToken() error {
method _refreshToken (line 34) | func (d *BaiduNetdisk) _refreshToken() error {
method request (line 97) | func (d *BaiduNetdisk) request(furl string, method string, callback base...
method get (line 140) | func (d *BaiduNetdisk) get(pathname string, params map[string]string, re...
method postForm (line 146) | func (d *BaiduNetdisk) postForm(pathname string, params map[string]strin...
method getFiles (line 153) | func (d *BaiduNetdisk) getFiles(dir string) ([]File, error) {
method linkOfficial (line 198) | func (d *BaiduNetdisk) linkOfficial(file model.Obj, _ model.LinkArgs) (*...
method linkCrack (line 226) | func (d *BaiduNetdisk) linkCrack(file model.Obj, _ model.LinkArgs) (*mod...
method linkCrackVideo (line 249) | func (d *BaiduNetdisk) linkCrackVideo(file model.Obj, _ model.LinkArgs) ...
method manage (line 277) | func (d *BaiduNetdisk) manage(opera string, filelist any) ([]byte, error) {
method create (line 290) | func (d *BaiduNetdisk) create(path string, size int64, isdir int, upload...
function joinTime (line 313) | func joinTime(form map[string]string, ctime, mtime int64) {
constant DefaultSliceSize (line 319) | DefaultSliceSize int64 = 4 * utils.MB
constant VipSliceSize (line 320) | VipSliceSize int64 = 16 * utils.MB
constant SVipSliceSize (line 321) | SVipSliceSize int64 = 32 * utils.MB
constant MaxSliceNum (line 323) | MaxSliceNum = 2048
constant SliceStep (line 324) | SliceStep int64 = 1 * utils.MB
method getSliceSize (line 327) | func (d *BaiduNetdisk) getSliceSize(filesize int64) int64 {
method quota (line 388) | func (d *BaiduNetdisk) quota(ctx context.Context) (model.DiskUsage, erro...
method getUploadUrl (line 401) | func (d *BaiduNetdisk) getUploadUrl(path, uploadId string) string {
method requestForUploadUrl (line 416) | func (d *BaiduNetdisk) requestForUploadUrl(path, uploadId string) (strin...
function DecryptMd5 (line 451) | func DecryptMd5(encryptMd5 string) string {
function EncryptMd5 (line 471) | func EncryptMd5(originalMd5 string) string {
FILE: drivers/baidu_photo/driver.go
type BaiduPhoto (line 27) | type BaiduPhoto struct
method Config (line 39) | func (d *BaiduPhoto) Config() driver.Config {
method GetAddition (line 43) | func (d *BaiduPhoto) GetAddition() driver.Additional {
method Init (line 47) | func (d *BaiduPhoto) Init(ctx context.Context) error {
method GetRoot (line 86) | func (d *BaiduPhoto) GetRoot(ctx context.Context) (model.Obj, error) {
method Drop (line 90) | func (d *BaiduPhoto) Drop(ctx context.Context) error {
method List (line 97) | func (d *BaiduPhoto) List(ctx context.Context, dir model.Obj, args mod...
method Link (line 141) | func (d *BaiduPhoto) Link(ctx context.Context, file model.Obj, args mo...
method MakeDir (line 164) | func (d *BaiduPhoto) MakeDir(ctx context.Context, parentDir model.Obj,...
method Copy (line 175) | func (d *BaiduPhoto) Copy(ctx context.Context, srcObj, dstDir model.Ob...
method Move (line 199) | func (d *BaiduPhoto) Move(ctx context.Context, srcObj, dstDir model.Ob...
method Rename (line 215) | func (d *BaiduPhoto) Rename(ctx context.Context, srcObj model.Obj, new...
method Remove (line 223) | func (d *BaiduPhoto) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 235) | func (d *BaiduPhoto) Put(ctx context.Context, dstDir model.Obj, stream...
FILE: drivers/baidu_photo/help.go
function getTid (line 14) | func getTid() string {
function toTime (line 18) | func toTime(t int64) *time.Time {
function fsidsFormatNotUk (line 23) | func fsidsFormatNotUk(ids ...int64) string {
function getFileName (line 30) | func getFileName(path string) string {
function MustString (line 34) | func MustString(str string, err error) string {
function copyFile (line 42) | func copyFile(file *AlbumFile, cf *CopyFile) *File {
function moveFileToAlbumFile (line 53) | func moveFileToAlbumFile(file *File, album *Album, uk int64) *AlbumFile {
function renameAlbum (line 62) | func renameAlbum(album *Album, newName string) *Album {
function BoolToIntStr (line 73) | func BoolToIntStr(b bool) string {
FILE: drivers/baidu_photo/meta.go
type Addition (line 8) | type Addition struct
function init (line 26) | func init() {
FILE: drivers/baidu_photo/types.go
type TokenErrResp (line 12) | type TokenErrResp struct
method Error (line 17) | func (e *TokenErrResp) Error() string {
type Erron (line 21) | type Erron struct
type UInfo (line 27) | type UInfo struct
type Page (line 32) | type Page struct
method HasNextPage (line 37) | func (p Page) HasNextPage() bool {
type FileListResp (line 44) | type FileListResp struct
type File (line 49) | type File struct
method GetSize (line 60) | func (c *File) GetSize() int64 { return c.Size }
method GetName (line 61) | func (c *File) GetName() string { return getFileName(c.Path) }
method CreateTime (line 62) | func (c *File) CreateTime() time.Time { return time.Unix(c.Ctime, 0) }
method ModTime (line 63) | func (c *File) ModTime() time.Time { return time.Unix(c.Mtime, 0) }
method IsDir (line 64) | func (c *File) IsDir() bool { return false }
method GetID (line 65) | func (c *File) GetID() string { return "" }
method GetPath (line 66) | func (c *File) GetPath() string { return "" }
method Thumb (line 67) | func (c *File) Thumb() string {
method GetHash (line 74) | func (c *File) GetHash() utils.HashInfo {
type AlbumListResp (line 80) | type AlbumListResp struct
type Album (line 87) | type Album struct
method GetHash (line 113) | func (a *Album) GetHash() utils.HashInfo {
method GetSize (line 117) | func (a *Album) GetSize() int64 { return 0 }
method GetName (line 118) | func (a *Album) GetName() string { return a.Title }
method CreateTime (line 119) | func (a *Album) CreateTime() time.Time { return time.Unix(a.CreationTi...
method ModTime (line 120) | func (a *Album) ModTime() time.Time { return time.Unix(a.Mtime, 0) }
method IsDir (line 121) | func (a *Album) IsDir() bool { return true }
method GetID (line 122) | func (a *Album) GetID() string { return "" }
method GetPath (line 123) | func (a *Album) GetPath() string { return "" }
type AlbumFileListResp (line 98) | type AlbumFileListResp struct
type AlbumFile (line 105) | type AlbumFile struct
type CopyFileResp (line 126) | type CopyFileResp struct
type CopyFile (line 129) | type CopyFile struct
type UploadFile (line 140) | type UploadFile struct
method toFile (line 170) | func (f *UploadFile) toFile() *File {
type CreateFileResp (line 154) | type CreateFileResp struct
type PrecreateResp (line 158) | type PrecreateResp struct
type InviteResp (line 182) | type InviteResp struct
type JoinOrCreateAlbumResp (line 193) | type JoinOrCreateAlbumResp struct
FILE: drivers/baidu_photo/utils.go
constant API_URL (line 19) | API_URL = "https://photo.baidu.com/youai"
constant USER_API_URL (line 20) | USER_API_URL = API_URL + "/user/v1"
constant ALBUM_API_URL (line 21) | ALBUM_API_URL = API_URL + "/album/v1"
constant FILE_API_URL_V1 (line 22) | FILE_API_URL_V1 = API_URL + "/file/v1"
constant FILE_API_URL_V2 (line 23) | FILE_API_URL_V2 = API_URL + "/file/v2"
method Request (line 26) | func (d *BaiduPhoto) Request(client *resty.Client, furl string, method s...
method Get (line 93) | func (d *BaiduPhoto) Get(furl string, callback base.ReqCallback, resp in...
method Post (line 97) | func (d *BaiduPhoto) Post(furl string, callback base.ReqCallback, resp i...
method GetAllFile (line 102) | func (d *BaiduPhoto) GetAllFile(ctx context.Context) (files []File, err ...
method DeleteFile (line 127) | func (d *BaiduPhoto) DeleteFile(ctx context.Context, file *File) error {
method GetAllAlbum (line 138) | func (d *BaiduPhoto) GetAllAlbum(ctx context.Context) (albums []Album, e...
method GetAllAlbumFile (line 167) | func (d *BaiduPhoto) GetAllAlbumFile(ctx context.Context, album *Album, ...
method CreateAlbum (line 198) | func (d *BaiduPhoto) CreateAlbum(ctx context.Context, name string) (*Alb...
method SetAlbumName (line 215) | func (d *BaiduPhoto) SetAlbumName(ctx context.Context, album *Album, nam...
method DeleteAlbum (line 231) | func (d *BaiduPhoto) DeleteAlbum(ctx context.Context, album *Album) error {
method DeleteAlbumFile (line 244) | func (d *BaiduPhoto) DeleteAlbumFile(ctx context.Context, file *AlbumFil...
method AddAlbumFile (line 258) | func (d *BaiduPhoto) AddAlbumFile(ctx context.Context, album *Album, fil...
method CopyAlbumFile (line 274) | func (d *BaiduPhoto) CopyAlbumFile(ctx context.Context, file *AlbumFile)...
method JoinAlbum (line 293) | func (d *BaiduPhoto) JoinAlbum(ctx context.Context, code string) (*Album...
method GetAlbumDetail (line 319) | func (d *BaiduPhoto) GetAlbumDetail(ctx context.Context, albumID string)...
method linkAlbum (line 333) | func (d *BaiduPhoto) linkAlbum(ctx context.Context, file *AlbumFile, arg...
method linkFile (line 375) | func (d *BaiduPhoto) linkFile(ctx context.Context, file *File, args mode...
method uInfo (line 468) | func (d *BaiduPhoto) uInfo() (*UInfo, error) {
method getBDStoken (line 479) | func (d *BaiduPhoto) getBDStoken() (string, error) {
function DecryptMd5 (line 494) | func DecryptMd5(encryptMd5 string) string {
function EncryptMd5 (line 514) | func EncryptMd5(originalMd5 string) string {
FILE: drivers/base/client.go
constant UserAgent (line 21) | UserAgent = "Mozilla/5.0 (Macintosh; Apple macOS 26_1_0) AppleWebKit/537...
constant UserAgentNT (line 22) | UserAgentNT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537...
function InitClient (line 24) | func InitClient() {
function NewRestyClient (line 37) | func NewRestyClient() *resty.Client {
FILE: drivers/base/types.go
type Json (line 5) | type Json
type TokenResp (line 7) | type TokenResp struct
type ReqCallback (line 12) | type ReqCallback
FILE: drivers/base/upload.go
function SaveUploadProgress (line 16) | func SaveUploadProgress(driver driver.Driver, state any, keys ...string)...
function GetUploadProgress (line 25) | func GetUploadProgress[T any](driver driver.Driver, keys ...string) (sta...
FILE: drivers/chaoxing/driver.go
type ChaoXing (line 27) | type ChaoXing struct
method Config (line 35) | func (d *ChaoXing) Config() driver.Config {
method GetAddition (line 39) | func (d *ChaoXing) GetAddition() driver.Additional {
method refreshCookie (line 43) | func (d *ChaoXing) refreshCookie() error {
method Init (line 55) | func (d *ChaoXing) Init(ctx context.Context) error {
method Drop (line 70) | func (d *ChaoXing) Drop(ctx context.Context) error {
method List (line 77) | func (d *ChaoXing) List(ctx context.Context, dir model.Obj, args model...
method Link (line 87) | func (d *ChaoXing) Link(ctx context.Context, file model.Obj, args mode...
method MakeDir (line 110) | func (d *ChaoXing) MakeDir(ctx context.Context, parentDir model.Obj, d...
method Move (line 130) | func (d *ChaoXing) Move(ctx context.Context, srcObj, dstDir model.Obj)...
method Rename (line 157) | func (d *ChaoXing) Rename(ctx context.Context, srcObj model.Obj, newNa...
method Copy (line 187) | func (d *ChaoXing) Copy(ctx context.Context, srcObj, dstDir model.Obj)...
method Remove (line 192) | func (d *ChaoXing) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 219) | func (d *ChaoXing) Put(ctx context.Context, dstDir model.Obj, file mod...
FILE: drivers/chaoxing/meta.go
type Addition (line 11) | type Addition struct
type Conf (line 22) | type Conf struct
function init (line 29) | func init() {
FILE: drivers/chaoxing/types.go
type Resp (line 12) | type Resp struct
type UserAuth (line 16) | type UserAuth struct
type int_str (line 96) | type int_str
method UnmarshalJSON (line 99) | func (ios *int_str) UnmarshalJSON(data []byte) error {
type File (line 108) | type File struct
type ListFileResp (line 161) | type ListFileResp struct
type DownResp (line 169) | type DownResp struct
type UploadDataRsp (line 178) | type UploadDataRsp struct
type UploadFileDataRsp (line 186) | type UploadFileDataRsp struct
type UploadDoneParam (line 224) | type UploadDoneParam struct
function fileToObj (line 258) | func fileToObj(f File) *model.Object {
FILE: drivers/chaoxing/util.go
method requestDownload (line 19) | func (d *ChaoXing) requestDownload(pathname string, method string, callb...
method request (line 42) | func (d *ChaoXing) request(pathname string, method string, callback base...
method GetFiles (line 68) | func (d *ChaoXing) GetFiles(parent string) ([]File, error) {
function EncryptByAES (line 111) | func EncryptByAES(message, key string) (string, error) {
function CookiesToString (line 131) | func CookiesToString(cookies []*http.Cookie) string {
method Login (line 142) | func (d *ChaoXing) Login() (string, error) {
FILE: drivers/chunk/driver.go
type Chunk (line 28) | type Chunk struct
method Config (line 33) | func (d *Chunk) Config() driver.Config {
method GetAddition (line 37) | func (d *Chunk) GetAddition() driver.Additional {
method Init (line 41) | func (d *Chunk) Init(ctx context.Context) error {
method Drop (line 52) | func (d *Chunk) Drop(ctx context.Context) error {
method Get (line 60) | func (d *Chunk) Get(ctx context.Context, path string) (model.Obj, erro...
method List (line 138) | func (d *Chunk) List(ctx context.Context, dir model.Obj, args model.Li...
method Link (line 254) | func (d *Chunk) Link(ctx context.Context, file model.Obj, args model.L...
method MakeDir (line 383) | func (d *Chunk) MakeDir(ctx context.Context, parentDir model.Obj, dirN...
method Move (line 388) | func (d *Chunk) Move(ctx context.Context, srcObj, dstDir model.Obj) er...
method Rename (line 395) | func (d *Chunk) Rename(ctx context.Context, srcObj model.Obj, newName ...
method Copy (line 402) | func (d *Chunk) Copy(ctx context.Context, srcObj, dstDir model.Obj) er...
method Remove (line 409) | func (d *Chunk) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 413) | func (d *Chunk) Put(ctx context.Context, dstDir model.Obj, file model....
method getPartName (line 478) | func (d *Chunk) getPartName(part int) string {
method GetDetails (line 482) | func (d *Chunk) GetDetails(ctx context.Context) (*model.StorageDetails...
method GetRootPath (line 56) | func (Addition) GetRootPath() string {
FILE: drivers/chunk/meta.go
type Addition (line 8) | type Addition struct
function init (line 30) | func init() {
FILE: drivers/chunk/obj.go
type chunkObject (line 5) | type chunkObject struct
FILE: drivers/cloudreve/driver.go
type Cloudreve (line 18) | type Cloudreve struct
method Config (line 24) | func (d *Cloudreve) Config() driver.Config {
method GetAddition (line 28) | func (d *Cloudreve) GetAddition() driver.Additional {
method Init (line 32) | func (d *Cloudreve) Init(ctx context.Context) error {
method InitReference (line 41) | func (d *Cloudreve) InitReference(storage driver.Driver) error {
method Drop (line 50) | func (d *Cloudreve) Drop(ctx context.Context) error {
method List (line 56) | func (d *Cloudreve) List(ctx context.Context, dir model.Obj, args mode...
method Link (line 81) | func (d *Cloudreve) Link(ctx context.Context, file model.Obj, args mod...
method MakeDir (line 95) | func (d *Cloudreve) MakeDir(ctx context.Context, parentDir model.Obj, ...
method Move (line 103) | func (d *Cloudreve) Move(ctx context.Context, srcObj, dstDir model.Obj...
method Rename (line 115) | func (d *Cloudreve) Rename(ctx context.Context, srcObj model.Obj, newN...
method Copy (line 126) | func (d *Cloudreve) Copy(ctx context.Context, srcObj, dstDir model.Obj...
method Remove (line 137) | func (d *Cloudreve) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 145) | func (d *Cloudreve) Put(ctx context.Context, dstDir model.Obj, stream ...
method create (line 194) | func (d *Cloudreve) create(ctx context.Context, dir model.Obj, file mo...
method GetDetails (line 207) | func (d *Cloudreve) GetDetails(ctx context.Context) (*model.StorageDet...
FILE: drivers/cloudreve/meta.go
type Addition (line 8) | type Addition struct
function init (line 26) | func init() {
FILE: drivers/cloudreve/types.go
type Resp (line 9) | type Resp struct
type Policy (line 15) | type Policy struct
type UploadInfo (line 23) | type UploadInfo struct
type DirectoryResp (line 32) | type DirectoryResp struct
type Object (line 38) | type Object struct
type DirectoryProp (line 50) | type DirectoryProp struct
function objectToObj (line 54) | func objectToObj(f Object, t model.Thumbnail) *model.ObjThumb {
type Config (line 68) | type Config struct
type StorageDetails (line 73) | type StorageDetails struct
FILE: drivers/cloudreve/util.go
constant loginPath (line 31) | loginPath = "/user/session"
method getUA (line 33) | func (d *Cloudreve) getUA() string {
method request (line 40) | func (d *Cloudreve) request(method string, path string, callback base.Re...
method login (line 101) | func (d *Cloudreve) login() error {
method doLogin (line 119) | func (d *Cloudreve) doLogin(needCaptcha bool) error {
function convertSrc (line 155) | func convertSrc(obj model.Obj) map[string]interface{} {
method GetThumb (line 169) | func (d *Cloudreve) GetThumb(file Object) (model.Thumbnail, error) {
method upLocal (line 188) | func (d *Cloudreve) upLocal(ctx context.Context, stream model.FileStream...
method upRemote (line 239) | func (d *Cloudreve) upRemote(ctx context.Context, stream model.FileStrea...
method upOneDrive (line 310) | func (d *Cloudreve) upOneDrive(ctx context.Context, stream model.FileStr...
method upS3 (line 374) | func (d *Cloudreve) upS3(ctx context.Context, stream model.FileStreamer,...
FILE: drivers/cloudreve_v4/driver.go
type CloudreveV4 (line 20) | type CloudreveV4 struct
method Config (line 28) | func (d *CloudreveV4) Config() driver.Config {
method GetAddition (line 38) | func (d *CloudreveV4) GetAddition() driver.Additional {
method Init (line 42) | func (d *CloudreveV4) Init(ctx context.Context) error {
method InitReference (line 62) | func (d *CloudreveV4) InitReference(storage driver.Driver) error {
method Drop (line 71) | func (d *CloudreveV4) Drop(ctx context.Context) error {
method List (line 76) | func (d *CloudreveV4) List(ctx context.Context, dir model.Obj, args mo...
method Get (line 138) | func (d *CloudreveV4) Get(ctx context.Context, path string) (model.Obj...
method Link (line 149) | func (d *CloudreveV4) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 170) | func (d *CloudreveV4) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 180) | func (d *CloudreveV4) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 190) | func (d *CloudreveV4) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 199) | func (d *CloudreveV4) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 209) | func (d *CloudreveV4) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 249) | func (d *CloudreveV4) Put(ctx context.Context, dstDir model.Obj, file ...
method GetArchiveMeta (line 325) | func (d *CloudreveV4) GetArchiveMeta(ctx context.Context, obj model.Ob...
method ListArchive (line 330) | func (d *CloudreveV4) ListArchive(ctx context.Context, obj model.Obj, ...
method Extract (line 335) | func (d *CloudreveV4) Extract(ctx context.Context, obj model.Obj, args...
method ArchiveDecompress (line 340) | func (d *CloudreveV4) ArchiveDecompress(ctx context.Context, srcObj, d...
method GetDetails (line 347) | func (d *CloudreveV4) GetDetails(ctx context.Context) (*model.StorageD...
FILE: drivers/cloudreve_v4/meta.go
type Addition (line 8) | type Addition struct
function init (line 34) | func init() {
FILE: drivers/cloudreve_v4/types.go
constant MetadataUploadSessionID (line 10) | MetadataUploadSessionID = "sys:upload_session_id"
constant MetadataThumbDisabled (line 11) | MetadataThumbDisabled = "thumb:disabled"
type Object (line 14) | type Object struct
type Resp (line 19) | type Resp struct
type BasicConfigResp (line 25) | type BasicConfigResp struct
type SiteLoginConfigResp (line 48) | type SiteLoginConfigResp struct
type PrepareLoginResp (line 59) | type PrepareLoginResp struct
type CaptchaResp (line 64) | type CaptchaResp struct
type AccessJWT (line 69) | type AccessJWT struct
type RefreshJWT (line 76) | type RefreshJWT struct
type Token (line 85) | type Token struct
type TokenResponse (line 92) | type TokenResponse struct
type File (line 111) | type File struct
function fileToObject (line 125) | func fileToObject(f *File) *model.Object {
type StoragePolicy (line 137) | type StoragePolicy struct
type Pagination (line 145) | type Pagination struct
type Props (line 152) | type Props struct
type FileResp (line 159) | type FileResp struct
type FileUrlResp (line 169) | type FileUrlResp struct
type FileUploadResp (line 176) | type FileUploadResp struct
type FileDeleteResp (line 189) | type FileDeleteResp struct
type FileThumbResp (line 204) | type FileThumbResp struct
type FolderSummaryResp (line 209) | type FolderSummaryResp struct
type CapacityResp (line 220) | type CapacityResp struct
FILE: drivers/cloudreve_v4/util.go
constant CodeLoginRequired (line 33) | CodeLoginRequired = http.StatusUnauthorized
constant CodePathNotExist (line 34) | CodePathNotExist = 40016
constant CodeCredentialInvalid (line 35) | CodeCredentialInvalid = 40020
method getUA (line 42) | func (d *CloudreveV4) getUA() string {
method request (line 49) | func (d *CloudreveV4) request(method string, path string, callback base....
method _request (line 65) | func (d *CloudreveV4) _request(method string, path string, callback base...
method canLogin (line 127) | func (d *CloudreveV4) canLogin() bool {
method login (line 131) | func (d *CloudreveV4) login() error {
method doLogin (line 160) | func (d *CloudreveV4) doLogin(needCaptcha bool) error {
method refreshToken (line 214) | func (d *CloudreveV4) refreshToken() error {
method parseJWT (line 264) | func (d *CloudreveV4) parseJWT(token string, jwt any) error {
method isTokenExpired (line 282) | func (d *CloudreveV4) isTokenExpired() bool {
method upLocal (line 346) | func (d *CloudreveV4) upLocal(ctx context.Context, file model.FileStream...
method upRemote (line 400) | func (d *CloudreveV4) upRemote(ctx context.Context, file model.FileStrea...
method upOneDrive (line 472) | func (d *CloudreveV4) upOneDrive(ctx context.Context, file model.FileStr...
method upS3 (line 537) | func (d *CloudreveV4) upS3(ctx context.Context, file model.FileStreamer,...
FILE: drivers/cnb_releases/driver.go
type CnbReleases (line 20) | type CnbReleases struct
method Config (line 26) | func (d *CnbReleases) Config() driver.Config {
method GetAddition (line 30) | func (d *CnbReleases) GetAddition() driver.Additional {
method Init (line 34) | func (d *CnbReleases) Init(ctx context.Context) error {
method InitReference (line 38) | func (d *CnbReleases) InitReference(storage driver.Driver) error {
method Drop (line 47) | func (d *CnbReleases) Drop(ctx context.Context) error {
method List (line 52) | func (d *CnbReleases) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 107) | func (d *CnbReleases) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 113) | func (d *CnbReleases) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 132) | func (d *CnbReleases) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 136) | func (d *CnbReleases) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 149) | func (d *CnbReleases) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 153) | func (d *CnbReleases) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 171) | func (d *CnbReleases) Put(ctx context.Context, dstDir model.Obj, file ...
FILE: drivers/cnb_releases/meta.go
type Addition (line 8) | type Addition struct
function init (line 21) | func init() {
FILE: drivers/cnb_releases/types.go
type Object (line 9) | type Object struct
type TagList (line 14) | type TagList
type Tag (line 16) | type Tag struct
type UserInfo (line 30) | type UserInfo struct
type CommitObject (line 36) | type CommitObject struct
type Signature (line 45) | type Signature struct
type CommitObjectTree (line 51) | type CommitObjectTree struct
type CommitObjectVerification (line 55) | type CommitObjectVerification struct
type ReleaseList (line 67) | type ReleaseList
type Release (line 69) | type Release struct
type ReleaseAsset (line 85) | type ReleaseAsset struct
type ReleaseAssetUploadURL (line 96) | type ReleaseAssetUploadURL struct
FILE: drivers/cnb_releases/util.go
method Request (line 15) | func (d *CnbReleases) Request(method string, path string, callback base....
method sumAssetsSize (line 52) | func (d *CnbReleases) sumAssetsSize(assets []ReleaseAsset) int64 {
FILE: drivers/crypt/driver.go
type Crypt (line 30) | type Crypt struct
method Config (line 38) | func (d *Crypt) Config() driver.Config {
method GetAddition (line 42) | func (d *Crypt) GetAddition() driver.Additional {
method Init (line 46) | func (d *Crypt) Init(ctx context.Context) error {
method updateObfusParm (line 85) | func (d *Crypt) updateObfusParm(str *string) error {
method Drop (line 98) | func (d *Crypt) Drop(ctx context.Context) error {
method List (line 102) | func (d *Crypt) List(ctx context.Context, dir model.Obj, args model.Li...
method Get (line 173) | func (d *Crypt) Get(ctx context.Context, path string) (model.Obj, erro...
method Link (line 237) | func (d *Crypt) Link(ctx context.Context, file model.Obj, _ model.Link...
method MakeDir (line 313) | func (d *Crypt) MakeDir(ctx context.Context, parentDir model.Obj, dirN...
method Move (line 322) | func (d *Crypt) Move(ctx context.Context, srcObj, dstDir model.Obj) er...
method Rename (line 327) | func (d *Crypt) Rename(ctx context.Context, srcObj model.Obj, newName ...
method Copy (line 341) | func (d *Crypt) Copy(ctx context.Context, srcObj, dstDir model.Obj) er...
method Remove (line 346) | func (d *Crypt) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 354) | func (d *Crypt) Put(ctx context.Context, dstDir model.Obj, streamer mo...
method GetDetails (line 384) | func (d *Crypt) GetDetails(ctx context.Context) (*model.StorageDetails...
constant obfuscatedPrefix (line 36) | obfuscatedPrefix = "___Obfuscated___"
method GetRootPath (line 169) | func (a Addition) GetRootPath() string {
constant fileHeaderSize (line 235) | fileHeaderSize = 32
FILE: drivers/crypt/meta.go
type Addition (line 8) | type Addition struct
function init (line 33) | func init() {
FILE: drivers/crypt/util.go
function guessPath (line 10) | func guessPath(path string) (isFolder, secondTry bool) {
method encryptPath (line 23) | func (d *Crypt) encryptPath(path string, isFolder bool) string {
FILE: drivers/degoo/driver.go
type Degoo (line 17) | type Degoo struct
method Config (line 23) | func (d *Degoo) Config() driver.Config {
method GetAddition (line 27) | func (d *Degoo) GetAddition() driver.Additional {
method Init (line 31) | func (d *Degoo) Init(ctx context.Context) error {
method Drop (line 43) | func (d *Degoo) Drop(ctx context.Context) error {
method List (line 47) | func (d *Degoo) List(ctx context.Context, dir model.Obj, args model.Li...
method Link (line 74) | func (d *Degoo) Link(ctx context.Context, file model.Obj, args model.L...
method MakeDir (line 83) | func (d *Degoo) MakeDir(ctx context.Context, parentDir model.Obj, dirN...
method Move (line 108) | func (d *Degoo) Move(ctx context.Context, srcObj, dstDir model.Obj) (m...
method Rename (line 126) | func (d *Degoo) Rename(ctx context.Context, srcObj model.Obj, newName ...
method Copy (line 146) | func (d *Degoo) Copy(ctx context.Context, srcObj, dstDir model.Obj) (m...
method Remove (line 151) | func (d *Degoo) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 165) | func (d *Degoo) Put(ctx context.Context, dstDir model.Obj, file model....
method GetDetails (line 205) | func (d *Degoo) GetDetails(ctx context.Context) (*model.StorageDetails...
FILE: drivers/degoo/meta.go
type Addition (line 8) | type Addition struct
function init (line 23) | func init() {
FILE: drivers/degoo/types.go
type DegooLoginRequest (line 8) | type DegooLoginRequest struct
type DegooLoginResponse (line 15) | type DegooLoginResponse struct
type DegooAccessTokenRequest (line 21) | type DegooAccessTokenRequest struct
type DegooAccessTokenResponse (line 26) | type DegooAccessTokenResponse struct
type DegooFileItem (line 31) | type DegooFileItem struct
type DegooErrors (line 47) | type DegooErrors struct
type DegooGraphqlResponse (line 56) | type DegooGraphqlResponse struct
type DegooGetChildren5Data (line 62) | type DegooGetChildren5Data struct
type DegooGetOverlay4Data (line 70) | type DegooGetOverlay4Data struct
type DegooFileRenameInfo (line 75) | type DegooFileRenameInfo struct
type DegooFileIDs (line 81) | type DegooFileIDs struct
type DegooGetBucketWriteAuth4Data (line 86) | type DegooGetBucketWriteAuth4Data struct
type DegooSetUploadFile3Data (line 108) | type DegooSetUploadFile3Data struct
type DegooGetUserInfo3Data (line 112) | type DegooGetUserInfo3Data struct
FILE: drivers/degoo/upload.go
method getBucketWriteAuth4 (line 21) | func (d *Degoo) getBucketWriteAuth4(ctx context.Context, file model.File...
method checkSum (line 75) | func (d *Degoo) checkSum(file io.Reader) (string, error) {
method uploadS3 (line 93) | func (d *Degoo) uploadS3(ctx context.Context, auths *DegooGetBucketWrite...
method SetUploadFile3 (line 171) | func (d *Degoo) SetUploadFile3(ctx context.Context, file model.FileStrea...
FILE: drivers/degoo/util.go
constant loginURL (line 23) | loginURL = "https://rest-api.degoo.com/login"
constant accessTokenURL (line 24) | accessTokenURL = "https://rest-api.degoo.com/access-token/v2"
constant apiURL (line 25) | apiURL = "https://production-appsync.degoo.com/graphql"
constant apiKey (line 28) | apiKey = "da2-vs6twz5vnjdavpqndtbzg3prra"
constant folderChecksum (line 29) | folderChecksum = "CgAQAg"
constant tokenRefreshThreshold (line 32) | tokenRefreshThreshold = 5 * time.Minute
constant minRequestInterval (line 35) | minRequestInterval = 1 * time.Second
constant errRateLimited (line 38) | errRateLimited = "rate limited (429), please try again later"
constant errUnauthorized (line 39) | errUnauthorized = "unauthorized access"
type JWTPayload (line 49) | type JWTPayload struct
function applyRateLimit (line 58) | func applyRateLimit() {
function createJSONRequest (line 73) | func createJSONRequest(ctx context.Context, method, url string, body int...
function checkHTTPResponse (line 90) | func checkHTTPResponse(resp *http.Response, operation string) error {
method isTokenExpired (line 101) | func (d *Degoo) isTokenExpired() bool {
function extractJWTPayload (line 117) | func extractJWTPayload(token string) (*JWTPayload, error) {
method refreshToken (line 138) | func (d *Degoo) refreshToken(ctx context.Context) error {
method ensureValidToken (line 179) | func (d *Degoo) ensureValidToken(ctx context.Context) error {
method login (line 202) | func (d *Degoo) login(ctx context.Context) error {
method apiCall (line 286) | func (d *Degoo) apiCall(ctx context.Context, operationName, query string...
method updateTokenInVariables (line 302) | func (d *Degoo) updateTokenInVariables(variables map[string]interface{}) {
method executeGraphQLRequest (line 311) | func (d *Degoo) executeGraphQLRequest(ctx context.Context, operationName...
method handleGraphQLError (line 357) | func (d *Degoo) handleGraphQLError(ctx context.Context, gqlError DegooEr...
function humanReadableTimes (line 373) | func humanReadableTimes(creation, modification, upload string) (cTime, m...
method getDevices (line 387) | func (d *Degoo) getDevices(ctx context.Context) error {
method getAllFileChildren5 (line 413) | func (d *Degoo) getAllFileChildren5(ctx context.Context, parentID string...
method getOverlay4 (line 445) | func (d *Degoo) getOverlay4(ctx context.Context, id string) (DegooFileIt...
method getUserInfo (line 464) | func (d *Degoo) getUserInfo(ctx context.Context) (DegooGetUserInfo3Data,...
FILE: drivers/doubao/driver.go
type Doubao (line 21) | type Doubao struct
method Config (line 30) | func (d *Doubao) Config() driver.Config {
method GetAddition (line 34) | func (d *Doubao) GetAddition() driver.Additional {
method Init (line 38) | func (d *Doubao) Init(ctx context.Context) error {
method WaitLimit (line 73) | func (d *Doubao) WaitLimit(ctx context.Context) error {
method Drop (line 80) | func (d *Doubao) Drop(ctx context.Context) error {
method List (line 84) | func (d *Doubao) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 114) | func (d *Doubao) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 183) | func (d *Doubao) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 204) | func (d *Doubao) Move(ctx context.Context, srcObj, dstDir model.Obj) e...
method Rename (line 222) | func (d *Doubao) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 237) | func (d *Doubao) Copy(ctx context.Context, srcObj, dstDir model.Obj) (...
method Remove (line 242) | func (d *Doubao) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 254) | func (d *Doubao) Put(ctx context.Context, dstDir model.Obj, file model...
method GetArchiveMeta (line 286) | func (d *Doubao) GetArchiveMeta(ctx context.Context, obj model.Obj, ar...
method ListArchive (line 291) | func (d *Doubao) ListArchive(ctx context.Context, obj model.Obj, args ...
method Extract (line 296) | func (d *Doubao) Extract(ctx context.Context, obj model.Obj, args mode...
method ArchiveDecompress (line 301) | func (d *Doubao) ArchiveDecompress(ctx context.Context, srcObj, dstDir...
FILE: drivers/doubao/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/doubao/types.go
type BaseResp (line 11) | type BaseResp struct
type NodeInfoResp (line 16) | type NodeInfoResp struct
type File (line 26) | type File struct
type GetDownloadInfoResp (line 42) | type GetDownloadInfoResp struct
type GetFileUrlResp (line 53) | type GetFileUrlResp struct
type GetVideoFileUrlResp (line 64) | type GetVideoFileUrlResp struct
type UploadNodeResp (line 97) | type UploadNodeResp struct
type Object (line 111) | type Object struct
type UserInfoResp (line 117) | type UserInfoResp struct
type AppUserInfo (line 121) | type AppUserInfo struct
type AuditInfo (line 124) | type AuditInfo struct
type Details (line 126) | type Details struct
type BuiAuditInfo (line 128) | type BuiAuditInfo struct
type Connects (line 136) | type Connects struct
type OperStaffRelationInfo (line 150) | type OperStaffRelationInfo struct
type UserInfo (line 156) | type UserInfo struct
type UploadToken (line 195) | type UploadToken struct
type UploadAuthToken (line 201) | type UploadAuthToken struct
type MediaUploadAuthToken (line 215) | type MediaUploadAuthToken struct
type UploadAuthTokenResp (line 229) | type UploadAuthTokenResp struct
type MediaUploadAuthTokenResp (line 234) | type MediaUploadAuthTokenResp struct
type ResponseMetadata (line 239) | type ResponseMetadata struct
type UploadConfig (line 252) | type UploadConfig struct
type UploadConfigResp (line 260) | type UploadConfigResp struct
type StoreInfo (line 266) | type StoreInfo struct
type UploadAddress (line 275) | type UploadAddress struct
type FallbackUploadAddress (line 284) | type FallbackUploadAddress struct
type UploadNode (line 293) | type UploadNode struct
type AdvanceOption (line 309) | type AdvanceOption struct
type InnerUploadAddress (line 317) | type InnerUploadAddress struct
type UploadPart (line 323) | type UploadPart struct
type UploadResp (line 332) | type UploadResp struct
type VideoCommitUpload (line 339) | type VideoCommitUpload struct
type VideoCommitUploadResp (line 361) | type VideoCommitUploadResp struct
type CommonResp (line 369) | type CommonResp struct
method IsSuccess (line 382) | func (r *CommonResp) IsSuccess() bool {
method GetError (line 387) | func (r *CommonResp) GetError() error {
method UnmarshalData (line 405) | func (r *CommonResp) UnmarshalData(v interface{}) error {
FILE: drivers/doubao/util.go
constant DirectoryType (line 35) | DirectoryType = 1
constant FileType (line 36) | FileType = 2
constant LinkType (line 37) | LinkType = 3
constant ImageType (line 38) | ImageType = 4
constant PagesType (line 39) | PagesType = 5
constant VideoType (line 40) | VideoType = 6
constant AudioType (line 41) | AudioType = 7
constant MeetingMinutesType (line 42) | MeetingMinutesType = 8
constant BaseURL (line 57) | BaseURL = "https://www.doubao.com"
constant FileDataType (line 58) | FileDataType = "file"
constant ImgDataType (line 59) | ImgDataType = "image"
constant VideoDataType (line 60) | VideoDataType = "video"
constant DefaultChunkSize (line 61) | DefaultChunkSize = int64(5 * 1024 * 1024)
constant MaxRetryAttempts (line 62) | MaxRetryAttempts = 3
constant UserAgent (line 63) | UserAgent = base.UserAgentNT
constant Region (line 64) | Region = "cn-north-1"
constant UploadTimeout (line 65) | UploadTimeout = 3 * time.Minute
method request (line 69) | func (d *Doubao) request(path string, method string, callback base.ReqCa...
method getFiles (line 104) | func (d *Doubao) getFiles(dirId, cursor string) (resp []File, err error) {
method getUserInfo (line 142) | func (d *Doubao) getUserInfo() (UserInfo, error) {
method signRequest (line 154) | func (d *Doubao) signRequest(req *resty.Request, method, tokenType, uplo...
method requestApi (line 243) | func (d *Doubao) requestApi(url, method, tokenType string, callback base...
method initUploadToken (line 275) | func (d *Doubao) initUploadToken() (*UploadToken, error) {
method getUploadAuthToken (line 303) | func (d *Doubao) getUploadAuthToken(dataType string) (ut UploadAuthToken...
method getSamantaUploadAuthToken (line 315) | func (d *Doubao) getSamantaUploadAuthToken() (mt MediaUploadAuthToken, e...
method getUploadConfig (line 325) | func (d *Doubao) getUploadConfig(upConfig *UploadConfig, dataType string...
method uploadNode (line 405) | func (d *Doubao) uploadNode(uploadConfig *UploadConfig, dir model.Obj, f...
method Upload (line 449) | func (d *Doubao) Upload(ctx context.Context, config *UploadConfig, dstDi...
method UploadByMultipart (line 524) | func (d *Doubao) UploadByMultipart(ctx context.Context, config *UploadCo...
method uploadRequest (line 689) | func (d *Doubao) uploadRequest(uploadUrl string, method string, storeInf...
method initMultipartUpload (line 728) | func (d *Doubao) initMultipartUpload(config *UploadConfig, uploadUrl str...
method completeMultipartUpload (line 750) | func (d *Doubao) completeMultipartUpload(config *UploadConfig, uploadUrl...
method commitMultipartUpload (line 785) | func (d *Doubao) commitMultipartUpload(uploadConfig *UploadConfig) error {
method _retryOperation (line 818) | func (d *Doubao) _retryOperation(operation string, fn func() error) error {
function _convertUploadParts (line 832) | func _convertUploadParts(parts []UploadPart) string {
function getCanonicalQueryString (line 850) | func getCanonicalQueryString(query url.Values) string {
function urlEncode (line 872) | func urlEncode(s string) string {
function getCanonicalHeadersFromMap (line 879) | func getCanonicalHeadersFromMap(headers map[string][]string) (string, st...
function hmacSHA256 (line 924) | func hmacSHA256(key []byte, data string) []byte {
function hmacSHA256Hex (line 931) | func hmacSHA256Hex(key []byte, data string) string {
function hashSHA256 (line 936) | func hashSHA256(data string) string {
function getSigningKey (line 943) | func getSigningKey(secretKey, dateStamp, region, service string) []byte {
function randomString (line 951) | func randomString() string {
FILE: drivers/doubao_share/driver.go
type DoubaoShare (line 16) | type DoubaoShare struct
method Config (line 22) | func (d *DoubaoShare) Config() driver.Config {
method GetAddition (line 26) | func (d *DoubaoShare) GetAddition() driver.Additional {
method Init (line 30) | func (d *DoubaoShare) Init(ctx context.Context) error {
method Drop (line 39) | func (d *DoubaoShare) Drop(ctx context.Context) error {
method List (line 44) | func (d *DoubaoShare) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 75) | func (d *DoubaoShare) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 123) | func (d *DoubaoShare) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 128) | func (d *DoubaoShare) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 133) | func (d *DoubaoShare) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 138) | func (d *DoubaoShare) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 143) | func (d *DoubaoShare) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 148) | func (d *DoubaoShare) Put(ctx context.Context, dstDir model.Obj, file ...
method GetArchiveMeta (line 153) | func (d *DoubaoShare) GetArchiveMeta(ctx context.Context, obj model.Ob...
method ListArchive (line 158) | func (d *DoubaoShare) ListArchive(ctx context.Context, obj model.Obj, ...
method Extract (line 163) | func (d *DoubaoShare) Extract(ctx context.Context, obj model.Obj, args...
method ArchiveDecompress (line 168) | func (d *DoubaoShare) ArchiveDecompress(ctx context.Context, srcObj, d...
FILE: drivers/doubao_share/meta.go
type Addition (line 8) | type Addition struct
function init (line 21) | func init() {
FILE: drivers/doubao_share/types.go
type BaseResp (line 10) | type BaseResp struct
type NodeInfoData (line 15) | type NodeInfoData struct
type NodeInfoResp (line 26) | type NodeInfoResp struct
type RootFileList (line 31) | type RootFileList struct
type File (line 38) | type File struct
type FileObject (line 54) | type FileObject struct
type ShareInfo (line 62) | type ShareInfo struct
type CreatorInfo (line 91) | type CreatorInfo struct
type FilePath (line 102) | type FilePath
type GetDownloadInfoResp (line 118) | type GetDownloadInfoResp struct
type GetVideoFileUrlResp (line 129) | type GetVideoFileUrlResp struct
type CommonResp (line 162) | type CommonResp struct
method IsSuccess (line 175) | func (r *CommonResp) IsSuccess() bool {
method GetError (line 180) | func (r *CommonResp) GetError() error {
method UnmarshalData (line 198) | func (r *CommonResp) UnmarshalData(v interface{}) error {
FILE: drivers/doubao_share/util.go
constant DirectoryType (line 20) | DirectoryType = 1
constant FileType (line 21) | FileType = 2
constant LinkType (line 22) | LinkType = 3
constant ImageType (line 23) | ImageType = 4
constant PagesType (line 24) | PagesType = 5
constant VideoType (line 25) | VideoType = 6
constant AudioType (line 26) | AudioType = 7
constant MeetingMinutesType (line 27) | MeetingMinutesType = 8
constant BaseURL (line 42) | BaseURL = "https://www.doubao.com"
constant FileDataType (line 43) | FileDataType = "file"
constant ImgDataType (line 44) | ImgDataType = "image"
constant VideoDataType (line 45) | VideoDataType = "video"
constant UserAgent (line 46) | UserAgent = base.UserAgentNT
method request (line 49) | func (d *DoubaoShare) request(path string, method string, callback base....
method getFiles (line 94) | func (d *DoubaoShare) getFiles(dirId, nodeId, cursor string) (resp []Fil...
method getShareOverview (line 133) | func (d *DoubaoShare) getShareOverview(shareId, cursor string) (resp []F...
method getShareOverviewWithHistory (line 137) | func (d *DoubaoShare) getShareOverviewWithHistory(shareId, cursor string...
method initShareList (line 183) | func (d *DoubaoShare) initShareList() error {
method _parseShareConfigs (line 215) | func (d *DoubaoShare) _parseShareConfigs() (map[string]string, []string,...
method _detectPathConflicts (line 265) | func (d *DoubaoShare) _detectPathConflicts(shareConfigs map[string]strin...
method _buildTreeStructure (line 298) | func (d *DoubaoShare) _buildTreeStructure(shareConfigs map[string]string...
method _extractTopLevelNodes (line 336) | func (d *DoubaoShare) _extractTopLevelNodes(rootMap map[string]*RootFile...
function _ensurePathExists (line 375) | func _ensurePathExists(rootMap map[string]*RootFileList, path string) {
function _extractShareId (line 410) | func _extractShareId(input string) string {
function _findRootFileByShareID (line 423) | func _findRootFileByShareID(rootFiles []RootFileList, shareID string) *R...
function _findNodeByPath (line 438) | func _findNodeByPath(rootFiles []RootFileList, path string) *RootFileList {
function _findShareByPath (line 453) | func _findShareByPath(rootFiles []RootFileList, path string) (*RootFileL...
method _findShareAndPath (line 498) | func (d *DoubaoShare) _findShareAndPath(dir model.Obj) (string, string, ...
method convertToFileObject (line 556) | func (d *DoubaoShare) convertToFileObject(file File, shareId string, rel...
method getFilesInPath (line 578) | func (d *DoubaoShare) getFilesInPath(ctx context.Context, shareId, nodeI...
method listRootDirectory (line 614) | func (d *DoubaoShare) listRootDirectory(ctx context.Context) ([]model.Ob...
method listVirtualDirectoryContent (line 670) | func (d *DoubaoShare) listVirtualDirectoryContent(dir model.Obj) ([]mode...
FILE: drivers/dropbox/driver.go
type Dropbox (line 19) | type Dropbox struct
method Config (line 26) | func (d *Dropbox) Config() driver.Config {
method GetAddition (line 30) | func (d *Dropbox) GetAddition() driver.Additional {
method Init (line 34) | func (d *Dropbox) Init(ctx context.Context) error {
method GetRootNamespaceId (line 53) | func (d *Dropbox) GetRootNamespaceId(ctx context.Context) (string, err...
method Drop (line 69) | func (d *Dropbox) Drop(ctx context.Context) error {
method List (line 73) | func (d *Dropbox) List(ctx context.Context, dir model.Obj, args model....
method Link (line 83) | func (d *Dropbox) Link(ctx context.Context, file model.Obj, args model...
method MakeDir (line 100) | func (d *Dropbox) MakeDir(ctx context.Context, parentDir model.Obj, di...
method Move (line 110) | func (d *Dropbox) Move(ctx context.Context, srcObj, dstDir model.Obj) ...
method Rename (line 125) | func (d *Dropbox) Rename(ctx context.Context, srcObj model.Obj, newNam...
method Copy (line 142) | func (d *Dropbox) Copy(ctx context.Context, srcObj, dstDir model.Obj) ...
method Remove (line 156) | func (d *Dropbox) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 166) | func (d *Dropbox) Put(ctx context.Context, dstDir model.Obj, stream mo...
FILE: drivers/dropbox/meta.go
type Addition (line 8) | type Addition struct
function init (line 24) | func init() {
FILE: drivers/dropbox/types.go
type TokenResp (line 9) | type TokenResp struct
type ErrorResp (line 15) | type ErrorResp struct
type RefreshTokenErrorResp (line 22) | type RefreshTokenErrorResp struct
type CurrentAccountResp (line 27) | type CurrentAccountResp struct
type File (line 34) | type File struct
type ListResp (line 48) | type ListResp struct
type UploadCursor (line 54) | type UploadCursor struct
type UploadAppendArgs (line 59) | type UploadAppendArgs struct
type UploadFinishArgs (line 64) | type UploadFinishArgs struct
function fileToObj (line 75) | func fileToObj(f File) *model.ObjThumb {
FILE: drivers/dropbox/util.go
method refreshToken (line 17) | func (d *Dropbox) refreshToken() error {
method request (line 73) | func (d *Dropbox) request(uri, method string, callback base.ReqCallback,...
method list (line 117) | func (d *Dropbox) list(ctx context.Context, data base.Json, isContinue b...
method getFiles (line 132) | func (d *Dropbox) getFiles(ctx context.Context, path string) ([]File, er...
method finishUploadSession (line 169) | func (d *Dropbox) finishUploadSession(ctx context.Context, toPath string...
method startUploadSession (line 220) | func (d *Dropbox) startUploadSession(ctx context.Context) (string, error) {
method buildPathRootHeader (line 250) | func (d *Dropbox) buildPathRootHeader() (string, error) {
FILE: drivers/febbox/driver.go
type FebBox (line 16) | type FebBox struct
method Config (line 23) | func (d *FebBox) Config() driver.Config {
method GetAddition (line 27) | func (d *FebBox) GetAddition() driver.Additional {
method Init (line 31) | func (d *FebBox) Init(ctx context.Context) error {
method Drop (line 53) | func (d *FebBox) Drop(ctx context.Context) error {
method List (line 57) | func (d *FebBox) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 67) | func (d *FebBox) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 84) | func (d *FebBox) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 93) | func (d *FebBox) Move(ctx context.Context, srcObj, dstDir model.Obj) (...
method Rename (line 102) | func (d *FebBox) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 111) | func (d *FebBox) Copy(ctx context.Context, srcObj, dstDir model.Obj) (...
method Remove (line 120) | func (d *FebBox) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 129) | func (d *FebBox) Put(ctx context.Context, dstDir model.Obj, stream mod...
FILE: drivers/febbox/meta.go
type Addition (line 8) | type Addition struct
function init (line 25) | func init() {
FILE: drivers/febbox/oauth2.go
type customTokenSource (line 16) | type customTokenSource struct
method Token (line 22) | func (c *customTokenSource) Token() (*oauth2.Token, error) {
method initializeOAuth2Token (line 82) | func (d *FebBox) initializeOAuth2Token(ctx context.Context, oauth2Config...
FILE: drivers/febbox/types.go
type ErrResp (line 13) | type ErrResp struct
method IsError (line 20) | func (e *ErrResp) IsError() bool {
method Error (line 24) | func (e *ErrResp) Error() string {
type FileListResp (line 28) | type FileListResp struct
type Rules (line 37) | type Rules struct
type File (line 45) | type File struct
function fileToObj (line 91) | func fileToObj(f File) *model.ObjThumb {
type FileDownloadResp (line 108) | type FileDownloadResp struct
FILE: drivers/febbox/util.go
method refreshTokenByOAuth2 (line 15) | func (d *FebBox) refreshTokenByOAuth2() error {
method request (line 27) | func (d *FebBox) request(url string, method string, callback base.ReqCal...
method getFilesList (line 69) | func (d *FebBox) getFilesList(id string) ([]File, error) {
method listWithLimit (line 80) | func (d *FebBox) listWithLimit(dirID string, pageLimit int64) (*[]File, ...
method getFiles (line 98) | func (d *FebBox) getFiles(dirID string, page, pageLimit int64) (*[]File,...
method getDownloadLink (line 122) | func (d *FebBox) getDownloadLink(id string, ip string) (string, error) {
method makeDir (line 147) | func (d *FebBox) makeDir(id string, name string) error {
method move (line 164) | func (d *FebBox) move(id string, id2 string) error {
method rename (line 181) | func (d *FebBox) rename(id string, name string) error {
method copy (line 198) | func (d *FebBox) copy(id string, id2 string) error {
method remove (line 215) | func (d *FebBox) remove(id string) error {
FILE: drivers/ftp/driver.go
type FTP (line 18) | type FTP struct
method Config (line 27) | func (d *FTP) Config() driver.Config {
method GetAddition (line 31) | func (d *FTP) GetAddition() driver.Additional {
method Init (line 35) | func (d *FTP) Init(ctx context.Context) error {
method Drop (line 42) | func (d *FTP) Drop(ctx context.Context) error {
method List (line 50) | func (d *FTP) List(ctx context.Context, dir model.Obj, args model.List...
method Link (line 76) | func (d *FTP) Link(ctx context.Context, file model.Obj, args model.Lin...
method MakeDir (line 123) | func (d *FTP) MakeDir(ctx context.Context, parentDir model.Obj, dirNam...
method Move (line 130) | func (d *FTP) Move(ctx context.Context, srcObj, dstDir model.Obj) error {
method Rename (line 140) | func (d *FTP) Rename(ctx context.Context, srcObj model.Obj, newName st...
method Copy (line 150) | func (d *FTP) Copy(ctx context.Context, srcObj, dstDir model.Obj) error {
method Remove (line 154) | func (d *FTP) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 166) | func (d *FTP) Put(ctx context.Context, dstDir model.Obj, s model.FileS...
FILE: drivers/ftp/meta.go
function encode (line 9) | func encode(str string, encoding string) string {
function decode (line 17) | func decode(str string, encoding string) string {
type Addition (line 25) | type Addition struct
function init (line 41) | func init() {
FILE: drivers/ftp/util.go
method login (line 14) | func (d *FTP) login() error {
method _login (line 32) | func (d *FTP) _login(ctx context.Context) (*ftp.ServerConn, error) {
FILE: drivers/github/driver.go
type Github (line 25) | type Github struct
method Config (line 40) | func (d *Github) Config() driver.Config {
method GetAddition (line 44) | func (d *Github) GetAddition() driver.Additional {
method Init (line 48) | func (d *Github) Init(ctx context.Context) error {
method Drop (line 130) | func (d *Github) Drop(ctx context.Context) error {
method List (line 134) | func (d *Github) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 168) | func (d *Github) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 186) | func (d *Github) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 247) | func (d *Github) Move(ctx context.Context, srcObj, dstDir model.Obj) e...
method Rename (line 471) | func (d *Github) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 524) | func (d *Github) Copy(ctx context.Context, srcObj, dstDir model.Obj) e...
method Remove (line 557) | func (d *Github) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 613) | func (d *Github) Put(ctx context.Context, dstDir model.Obj, stream mod...
method getContentApiUrl (line 669) | func (d *Github) getContentApiUrl(path string) string {
method get (line 674) | func (d *Github) get(path string) (*Object, error) {
method putBlob (line 687) | func (d *Github) putBlob(ctx context.Context, s model.FileStreamer, up...
method renewParentTrees (line 747) | func (d *Github) renewParentTrees(path, prevSha, curSha, until string)...
method getTree (line 774) | func (d *Github) getTree(sha string) (*TreeResp, error) {
method getTreeDirectly (line 789) | func (d *Github) getTreeDirectly(path string) (*TreeResp, string, erro...
method newTree (line 807) | func (d *Github) newTree(baseSha string, tree []interface{}) (string, ...
method commit (line 827) | func (d *Github) commit(message, treeSha string) error {
method getBranchHead (line 870) | func (d *Github) getBranchHead() (string, error) {
method copyWithoutRenewTree (line 885) | func (d *Github) copyWithoutRenewTree(srcObj, dstDir model.Obj) (dstSh...
method getRepo (line 930) | func (d *Github) getRepo() (*RepoResp, error) {
method getAuthenticatedUser (line 945) | func (d *Github) getAuthenticatedUser() (*UserResp, error) {
method addCommitterAndAuthor (line 960) | func (d *Github) addCommitterAndAuthor(m *map[string]interface{}) {
FILE: drivers/github/meta.go
type Addition (line 8) | type Addition struct
function init (line 35) | func init() {
FILE: drivers/github/types.go
type Links (line 10) | type Links struct
type Object (line 16) | type Object struct
method toModelObj (line 34) | func (o *Object) toModelObj() *model.Object {
type PutBlobResp (line 44) | type PutBlobResp struct
type ErrResp (line 49) | type ErrResp struct
type TreeObjReq (line 55) | type TreeObjReq struct
type TreeObjResp (line 62) | type TreeObjResp struct
method toModelObj (line 68) | func (o *TreeObjResp) toModelObj() *model.Object {
type TreeResp (line 78) | type TreeResp struct
type TreeReq (line 85) | type TreeReq struct
type CommitResp (line 90) | type CommitResp struct
type BranchResp (line 94) | type BranchResp struct
type UpdateRefReq (line 99) | type UpdateRefReq struct
type RepoResp (line 104) | type RepoResp struct
type UserResp (line 108) | type UserResp struct
FILE: drivers/github/util.go
type MessageTemplateVars (line 20) | type MessageTemplateVars struct
function getMessage (line 30) | func getMessage(tmpl *template.Template, vars *MessageTemplateVars, defa...
function calculateBase64Length (line 38) | func calculateBase64Length(inputLength int64) int64 {
function toErr (line 42) | func toErr(res *resty.Response) error {
function getPathCommonAncestor (line 61) | func getPathCommonAncestor(a, b string) (ancestor, aChildName, bChildNam...
function getUsername (line 99) | func getUsername(ctx context.Context) string {
function loadPrivateKey (line 107) | func loadPrivateKey(key, passphrase string) (*openpgp.Entity, error) {
function signCommit (line 133) | func signCommit(m *map[string]interface{}, entity *openpgp.Entity) (stri...
FILE: drivers/github_releases/driver.go
type GithubReleases (line 16) | type GithubReleases struct
method Config (line 23) | func (d *GithubReleases) Config() driver.Config {
method GetAddition (line 27) | func (d *GithubReleases) GetAddition() driver.Additional {
method Init (line 31) | func (d *GithubReleases) Init(ctx context.Context) error {
method Drop (line 36) | func (d *GithubReleases) Drop(ctx context.Context) error {
method List (line 40) | func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args...
method Link (line 137) | func (d *GithubReleases) Link(ctx context.Context, file model.Obj, arg...
method MakeDir (line 152) | func (d *GithubReleases) MakeDir(ctx context.Context, parentDir model....
method Move (line 157) | func (d *GithubReleases) Move(ctx context.Context, srcObj, dstDir mode...
method Rename (line 162) | func (d *GithubReleases) Rename(ctx context.Context, srcObj model.Obj,...
method Copy (line 167) | func (d *GithubReleases) Copy(ctx context.Context, srcObj, dstDir mode...
method Remove (line 172) | func (d *GithubReleases) Remove(ctx context.Context, obj model.Obj) er...
FILE: drivers/github_releases/meta.go
type Addition (line 8) | type Addition struct
function init (line 23) | func init() {
FILE: drivers/github_releases/models.go
type Release (line 3) | type Release struct
type User (line 25) | type User struct
type Asset (line 47) | type Asset struct
type Reactions (line 63) | type Reactions struct
type FileInfo (line 76) | type FileInfo struct
FILE: drivers/github_releases/types.go
type MountPoint (line 13) | type MountPoint struct
method RequestRelease (line 22) | func (m *MountPoint) RequestRelease(get func(url string) (*resty.Respo...
method RequestReleases (line 35) | func (m *MountPoint) RequestReleases(get func(url string) (*resty.Resp...
method GetLatestRelease (line 48) | func (m *MountPoint) GetLatestRelease() []File {
method GetLatestSize (line 65) | func (m *MountPoint) GetLatestSize() int64 {
method GetAllVersion (line 74) | func (m *MountPoint) GetAllVersion() []File {
method GetReleaseByTagName (line 95) | func (m *MountPoint) GetReleaseByTagName(tagName string) []File {
method GetSizeByTagName (line 117) | func (m *MountPoint) GetSizeByTagName(tagName string) int64 {
method GetAllVersionSize (line 134) | func (m *MountPoint) GetAllVersionSize() int64 {
method GetSourceCode (line 147) | func (m *MountPoint) GetSourceCode() []File {
method GetSourceCodeByTagName (line 173) | func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {
method GetOtherFile (line 201) | func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Respons...
type File (line 226) | type File struct
method GetHash (line 236) | func (f File) GetHash() utils.HashInfo {
method GetPath (line 240) | func (f File) GetPath() string {
method GetSize (line 244) | func (f File) GetSize() int64 {
method GetName (line 248) | func (f File) GetName() string {
method ModTime (line 252) | func (f File) ModTime() time.Time {
method CreateTime (line 257) | func (f File) CreateTime() time.Time {
method IsDir (line 262) | func (f File) IsDir() bool {
method GetID (line 266) | func (f File) GetID() string {
FILE: drivers/github_releases/util.go
method GetRequest (line 14) | func (d *GithubReleases) GetRequest(url string) (*resty.Response, error) {
method ParseRepos (line 32) | func (d *GithubReleases) ParseRepos(text string) ([]MountPoint, error) {
function GetNextDir (line 64) | func GetNextDir(wholePath string, basePath string) string {
function IsAncestorDir (line 81) | func IsAncestorDir(parentDir string, targetDir string) bool {
FILE: drivers/google_drive/driver.go
type GoogleDrive (line 17) | type GoogleDrive struct
method Config (line 25) | func (d *GoogleDrive) Config() driver.Config {
method GetAddition (line 29) | func (d *GoogleDrive) GetAddition() driver.Additional {
method Init (line 33) | func (d *GoogleDrive) Init(ctx context.Context) error {
method Drop (line 40) | func (d *GoogleDrive) Drop(ctx context.Context) error {
method List (line 44) | func (d *GoogleDrive) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 54) | func (d *GoogleDrive) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 69) | func (d *GoogleDrive) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 81) | func (d *GoogleDrive) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 93) | func (d *GoogleDrive) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 104) | func (d *GoogleDrive) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 108) | func (d *GoogleDrive) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 114) | func (d *GoogleDrive) Put(ctx context.Context, dstDir model.Obj, strea...
method GetDetails (line 170) | func (d *GoogleDrive) GetDetails(ctx context.Context) (*model.StorageD...
FILE: drivers/google_drive/meta.go
type Addition (line 8) | type Addition struct
function init (line 27) | func init() {
FILE: drivers/google_drive/types.go
type TokenError (line 12) | type TokenError struct
type Files (line 17) | type Files struct
type File (line 22) | type File struct
function fileToObj (line 40) | func fileToObj(f File) *model.ObjThumb {
type Error (line 68) | type Error struct
type AboutResp (line 82) | type AboutResp struct
FILE: drivers/google_drive/util.go
constant FilesListFields (line 33) | FilesListFields = "files(id,name,mimeType,size,modifiedTime,createdTime,...
constant FileInfoFields (line 35) | FileInfoFields = "id,name,mimeType,size,md5Checksum,sha1Checksum,sha256C...
type googleDriveServiceAccount (line 38) | type googleDriveServiceAccount struct
method refreshToken (line 51) | func (d *GoogleDrive) refreshToken() error {
method request (line 201) | func (d *GoogleDrive) request(url string, method string, callback base.R...
method getFiles (line 231) | func (d *GoogleDrive) getFiles(id string) ([]File, error) {
method getTargetFileInfo (line 303) | func (d *GoogleDrive) getTargetFileInfo(targetId string) (File, error) {
method batchGetTargetFilesInfo (line 319) | func (d *GoogleDrive) batchGetTargetFilesInfo(targetIds []string) map[st...
method chunkUpload (line 335) | func (d *GoogleDrive) chunkUpload(ctx context.Context, file model.FileSt...
method getAbout (line 398) | func (d *GoogleDrive) getAbout(ctx context.Context) (*AboutResp, error) {
FILE: drivers/google_photo/driver.go
type GooglePhoto (line 18) | type GooglePhoto struct
method Config (line 24) | func (d *GooglePhoto) Config() driver.Config {
method GetAddition (line 28) | func (d *GooglePhoto) GetAddition() driver.Additional {
method Init (line 32) | func (d *GooglePhoto) Init(ctx context.Context) error {
method Drop (line 36) | func (d *GooglePhoto) Drop(ctx context.Context) error {
method List (line 40) | func (d *GooglePhoto) List(ctx context.Context, dir model.Obj, args mo...
method Link (line 50) | func (d *GooglePhoto) Link(ctx context.Context, file model.Obj, args m...
method MakeDir (line 68) | func (d *GooglePhoto) MakeDir(ctx context.Context, parentDir model.Obj...
method Move (line 72) | func (d *GooglePhoto) Move(ctx context.Context, srcObj, dstDir model.O...
method Rename (line 76) | func (d *GooglePhoto) Rename(ctx context.Context, srcObj model.Obj, ne...
method Copy (line 80) | func (d *GooglePhoto) Copy(ctx context.Context, srcObj, dstDir model.O...
method Remove (line 84) | func (d *GooglePhoto) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 88) | func (d *GooglePhoto) Put(ctx context.Context, dstDir model.Obj, strea...
FILE: drivers/google_photo/meta.go
type Addition (line 8) | type Addition struct
function init (line 24) | func init() {
FILE: drivers/google_photo/types.go
type TokenError (line 10) | type TokenError struct
type Items (line 15) | type Items struct
type MediaItem (line 22) | type MediaItem struct
type MediaMetadata (line 32) | type MediaMetadata struct
type Photo (line 40) | type Photo struct
type Video (line 43) | type Video struct
function fileToObj (line 46) | func fileToObj(f MediaItem) *model.ObjThumb {
type Error (line 73) | type Error struct
FILE: drivers/google_photo/util.go
constant FETCH_ALL (line 14) | FETCH_ALL = "all"
constant FETCH_ALBUMS (line 15) | FETCH_ALBUMS = "albums"
constant FETCH_ROOT (line 16) | FETCH_ROOT = "root"
constant FETCH_SHARE_ALBUMS (line 17) | FETCH_SHARE_ALBUMS = "share_albums"
method refreshToken (line 20) | func (d *GooglePhoto) refreshToken() error {
method request (line 41) | func (d *GooglePhoto) request(url string, method string, callback base.R...
method getFiles (line 74) | func (d *GooglePhoto) getFiles(id string) ([]MediaItem, error) {
method getFakeRoot (line 89) | func (d *GooglePhoto) getFakeRoot() ([]MediaItem, error) {
method getAlbums (line 106) | func (d *GooglePhoto) getAlbums() ([]MediaItem, error) {
method getShareAlbums (line 117) | func (d *GooglePhoto) getShareAlbums() ([]MediaItem, error) {
method getMedias (line 128) | func (d *GooglePhoto) getMedias(albumId string) ([]MediaItem, error) {
method getAllMedias (line 139) | func (d *GooglePhoto) getAllMedias() ([]MediaItem, error) {
method getMedia (line 150) | func (d *GooglePhoto) getMedia(id string) (MediaItem, error) {
method fetchItems (line 166) | func (d *GooglePhoto) fetchItems(url string, query map[string]string, me...
FILE: drivers/halalcloud/driver.go
type HalalCloud (line 30) | type HalalCloud struct
method Config (line 38) | func (d *HalalCloud) Config() driver.Config {
method GetAddition (line 42) | func (d *HalalCloud) GetAddition() driver.Additional {
method Init (line 46) | func (d *HalalCloud) Init(ctx context.Context) error {
method Drop (line 107) | func (d *HalalCloud) Drop(ctx context.Context) error {
method List (line 111) | func (d *HalalCloud) List(ctx context.Context, dir model.Obj, args mod...
method Link (line 115) | func (d *HalalCloud) Link(ctx context.Context, file model.Obj, args mo...
method MakeDir (line 119) | func (d *HalalCloud) MakeDir(ctx context.Context, parentDir model.Obj,...
method Move (line 123) | func (d *HalalCloud) Move(ctx context.Context, srcObj, dstDir model.Ob...
method Rename (line 127) | func (d *HalalCloud) Rename(ctx context.Context, srcObj model.Obj, new...
method Copy (line 131) | func (d *HalalCloud) Copy(ctx context.Context, srcObj, dstDir model.Ob...
method Remove (line 135) | func (d *HalalCloud) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 139) | func (d *HalalCloud) Put(ctx context.Context, dstDir model.Obj, stream...
method IsLogin (line 143) | func (d *HalalCloud) IsLogin() bool {
method SetTokenResp (line 174) | func (d *HalalCloud) SetTokenResp(tr *TokenResp) {
method getFiles (line 178) | func (d *HalalCloud) getFiles(ctx context.Context, dir model.Obj) ([]m...
method getLink (line 212) | func (d *HalalCloud) getLink(ctx context.Context, file model.Obj, args...
method makeDir (line 286) | func (d *HalalCloud) makeDir(ctx context.Context, dir model.Obj, name ...
method move (line 294) | func (d *HalalCloud) move(ctx context.Context, obj model.Obj, dir mode...
method rename (line 312) | func (d *HalalCloud) rename(ctx context.Context, obj model.Obj, name s...
method copy (line 324) | func (d *HalalCloud) copy(ctx context.Context, obj model.Obj, dir mode...
method remove (line 346) | func (d *HalalCloud) remove(ctx context.Context, obj model.Obj) error {
method put (line 363) | func (d *HalalCloud) put(ctx context.Context, dstDir model.Obj, fileSt...
type HalalCommon (line 166) | type HalalCommon struct
FILE: drivers/halalcloud/meta.go
type Addition (line 8) | type Addition struct
function init (line 27) | func init() {
FILE: drivers/halalcloud/options.go
function defaultOptions (line 5) | func defaultOptions() halalOptions {
type HalalOption (line 15) | type HalalOption interface
type halalOptions (line 21) | type halalOptions struct
type funcDialOption (line 28) | type funcDialOption struct
method apply (line 32) | func (fdo *funcDialOption) apply(do *halalOptions) {
function newFuncDialOption (line 36) | func newFuncDialOption(f func(*halalOptions)) *funcDialOption {
function WithRefreshTokenRefreshedCallback (line 42) | func WithRefreshTokenRefreshedCallback(s func(accessToken string, access...
function WithGrpcDialOptions (line 48) | func WithGrpcDialOptions(opts ...grpc.DialOption) HalalOption {
FILE: drivers/halalcloud/types.go
type AuthService (line 13) | type AuthService struct
type TokenResp (line 22) | type TokenResp struct
type UserInfo (line 29) | type UserInfo struct
type OrderByInfo (line 36) | type OrderByInfo struct
type ListInfo (line 41) | type ListInfo struct
type FilesList (line 48) | type FilesList struct
type Files (line 55) | type Files
method GetSize (line 57) | func (f *Files) GetSize() int64 {
method GetName (line 61) | func (f *Files) GetName() string {
method ModTime (line 65) | func (f *Files) ModTime() time.Time {
method CreateTime (line 69) | func (f *Files) CreateTime() time.Time {
method IsDir (line 73) | func (f *Files) IsDir() bool {
method GetHash (line 77) | func (f *Files) GetHash() utils.HashInfo {
method GetID (line 81) | func (f *Files) GetID() string {
method GetPath (line 88) | func (f *Files) GetPath() string {
type SteamFile (line 92) | type SteamFile struct
method Read (line 96) | func (s *SteamFile) Read(p []byte) (n int, err error) {
FILE: drivers/halalcloud/util.go
constant AppID (line 33) | AppID = "alist/10001"
constant AppVersion (line 34) | AppVersion = "1.0.0"
constant AppSecret (line 35) | AppSecret = "bR4SJwOkvnG5WvVJ"
constant grpcServer (line 39) | grpcServer = "grpcuserapi.2dland.cn:443"
constant grpcServerAuth (line 40) | grpcServerAuth = "grpcuserapi.2dland.cn"
method NewAuthServiceWithOauth (line 43) | func (d *HalalCloud) NewAuthServiceWithOauth(options ...HalalOption) (*A...
method NewAuthService (line 91) | func (d *HalalCloud) NewAuthService(refreshToken string, options ...Hala...
method OnAccessTokenRefreshed (line 157) | func (s *AuthService) OnAccessTokenRefreshed(accessToken string, accessT...
method GetGrpcConnection (line 169) | func (s *AuthService) GetGrpcConnection() *grpc.ClientConn {
method Close (line 173) | func (s *AuthService) Close() {
method signContext (line 177) | func (s *AuthService) signContext(method string, ctx context.Context) co...
method GetCurrentOpDir (line 198) | func (d *HalalCloud) GetCurrentOpDir(dir model.Obj, args []string, index...
method GetCurrentDir (line 210) | func (d *HalalCloud) GetCurrentDir(dir model.Obj) string {
type Common (line 218) | type Common struct
function getRawFiles (line 221) | func getRawFiles(addr *pubUserFile.SliceDownloadInfo) ([]byte, error) {
type openObject (line 270) | type openObject struct
method getChunk (line 284) | func (oo *openObject) getChunk(ctx context.Context) (err error) {
method Read (line 302) | func (oo *openObject) Read(p []byte) (n int, err error) {
method Close (line 340) | func (oo *openObject) Close() (err error) {
method ChunkLocation (line 380) | func (oo *openObject) ChunkLocation(id int) (position int64, size int,...
function GetMD5Hash (line 355) | func GetMD5Hash(text string) string {
type chunkSize (line 361) | type chunkSize struct
function getChunkSizes (line 366) | func getChunkSizes(sliceSize []*pubUserFile.SliceSize) (chunks []chunkSi...
FILE: drivers/halalcloud_open/common.go
type halalCommon (line 15) | type halalCommon struct
method GetAccessToken (line 23) | func (m *halalCommon) GetAccessToken() (string, error) {
method GetRefreshToken (line 32) | func (m *halalCommon) GetRefreshToken() (string, error) {
method SetAccessToken (line 41) | func (m *halalCommon) SetAccessToken(token string) error {
method SetRefreshToken (line 47) | func (m *halalCommon) SetRefreshToken(token string) error {
method SetToken (line 56) | func (m *halalCommon) SetToken(accessToken string, refreshToken string...
method ClearConfigs (line 67) | func (m *halalCommon) ClearConfigs() error {
method DeleteConfig (line 73) | func (m *halalCommon) DeleteConfig(key string) error {
method GetConfig (line 83) | func (m *halalCommon) GetConfig(key string) (string, error) {
method ListConfigs (line 92) | func (m *halalCommon) ListConfigs() (map[string]string, error) {
method SetConfig (line 102) | func (m *halalCommon) SetConfig(key string, value string) error {
function NewHalalCommon (line 107) | func NewHalalCommon() *halalCommon {
FILE: drivers/halalcloud_open/driver.go
type HalalCloudOpen (line 11) | type HalalCloudOpen struct
method Config (line 21) | func (d *HalalCloudOpen) Config() driver.Config {
method GetAddition (line 25) | func (d *HalalCloudOpen) GetAddition() driver.Additional {
FILE: drivers/halalcloud_open/driver_curd_impl.go
method getFiles (line 11) | func (d *HalalCloudOpen) getFiles(ctx context.Context, dir model.Obj) ([...
method makeDir (line 42) | func (d *HalalCloudOpen) makeDir(ctx context.Context, dir model.Obj, nam...
method move (line 50) | func (d *HalalCloudOpen) move(ctx context.Context, obj model.Obj, dir mo...
method rename (line 66) | func (d *HalalCloudOpen) rename(ctx context.Context, obj model.Obj, name...
method copy (line 75) | func (d *HalalCloudOpen) copy(ctx context.Context, obj model.Obj, dir mo...
method remove (line 103) | func (d *HalalCloudOpen) remove(ctx context.Context, obj model.Obj) error {
method details (line 116) | func (d *HalalCloudOpen) details(ctx context.Context) (*model.StorageDet...
FILE: drivers/halalcloud_open/driver_get_link.go
method getLink (line 17) | func (d *HalalCloudOpen) getLink(ctx context.Context, file model.Obj, ar...
FILE: drivers/halalcloud_open/driver_init.go
method Init (line 13) | func (d *HalalCloudOpen) Init(ctx context.Context) error {
FILE: drivers/halalcloud_open/driver_interface.go
method Drop (line 10) | func (d *HalalCloudOpen) Drop(ctx context.Context) error {
method List (line 14) | func (d *HalalCloudOpen) List(ctx context.Context, dir model.Obj, args m...
method Link (line 18) | func (d *HalalCloudOpen) Link(ctx context.Context, file model.Obj, args ...
method MakeDir (line 22) | func (d *HalalCloudOpen) MakeDir(ctx context.Context, parentDir model.Ob...
method Move (line 26) | func (d *HalalCloudOpen) Move(ctx context.Context, srcObj, dstDir model....
method Rename (line 30) | func (d *HalalCloudOpen) Rename(ctx context.Context, srcObj model.Obj, n...
method Copy (line 34) | func (d *HalalCloudOpen) Copy(ctx context.Context, srcObj, dstDir model....
method Remove (line 38) | func (d *HalalCloudOpen) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 42) | func (d *HalalCloudOpen) Put(ctx context.Context, dstDir model.Obj, stre...
method GetDetails (line 46) | func (d *HalalCloudOpen) GetDetails(ctx context.Context) (*model.Storage...
FILE: drivers/halalcloud_open/halalcloud_upload.go
method put (line 22) | func (d *HalalCloudOpen) put(ctx context.Context, dstDir model.Obj, file...
function makeFile (line 99) | func makeFile(ctx context.Context, fileSlice []string, taskID string, up...
function doMakeFile (line 119) | func doMakeFile(fileSlice []string, taskID string, uploadAddress string)...
function postFileSlice (line 166) | func postFileSlice(ctx context.Context, fileSlice []byte, taskID string,...
function doPostFileSlice (line 181) | func doPostFileSlice(fileSlice []byte, taskID string, uploadAddress stri...
FILE: drivers/halalcloud_open/meta.go
type Addition (line 8) | type Addition struct
function init (line 28) | func init() {
type UploadedFile (line 34) | type UploadedFile struct
FILE: drivers/halalcloud_open/obj_file.go
type ObjFile (line 11) | type ObjFile struct
method GetSize (line 28) | func (f *ObjFile) GetSize() int64 {
method GetName (line 32) | func (f *ObjFile) GetName() string {
method ModTime (line 36) | func (f *ObjFile) ModTime() time.Time {
method IsDir (line 40) | func (f *ObjFile) IsDir() bool {
method GetHash (line 44) | func (f *ObjFile) GetHash() utils.HashInfo {
method GetID (line 50) | func (f *ObjFile) GetID() string {
method GetPath (line 54) | func (f *ObjFile) GetPath() string {
method CreateTime (line 58) | func (f *ObjFile) CreateTime() time.Time {
function NewObjFile (line 18) | func NewObjFile(f *sdkUserFile.File) model.Obj {
FILE: drivers/halalcloud_open/utils.go
function GetMD5Hash (line 90) | func GetMD5Hash(text string) string {
type chunkSize (line 95) | type chunkSize struct
type openObject (line 100) | type openObject struct
method getChunk (line 21) | func (oo *openObject) getChunk(_ context.Context) (err error) {
method Read (line 39) | func (oo *openObject) Read(p []byte) (n int, err error) {
method Close (line 75) | func (oo *openObject) Close() (err error) {
method ChunkLocation (line 130) | func (oo *openObject) ChunkLocation(id int) (position int64, size int,...
function getChunkSizes (line 113) | func getChunkSizes(sliceSize []*sdkUserFile.SliceSize) (chunks []chunkSi...
function getRawFiles (line 138) | func getRawFiles(addr *sdkUserFile.SliceDownloadInfo) ([]byte, error) {
FILE: drivers/ilanzou/driver.go
type ILanZou (line 26) | type ILanZou struct
method Config (line 37) | func (d *ILanZou) Config() driver.Config {
method GetAddition (line 41) | func (d *ILanZou) GetAddition() driver.Additional {
method Init (line 45) | func (d *ILanZou) Init(ctx context.Context) error {
method Drop (line 64) | func (d *ILanZou) Drop(ctx context.Context) error {
method List (line 68) | func (d *ILanZou) List(ctx context.Context, dir model.Obj, args model....
method Link (line 118) | func (d *ILanZou) Link(ctx context.Context, file model.Obj, args model...
method MakeDir (line 174) | func (d *ILanZou) MakeDir(ctx context.Context, parentDir model.Obj, di...
method Move (line 197) | func (d *ILanZou) Move(ctx context.Context, srcObj, dstDir model.Obj) ...
method Rename (line 217) | func (d *ILanZou) Rename(ctx context.Context, srcObj model.Obj, newNam...
method Copy (line 250) | func (d *ILanZou) Copy(ctx context.Context, srcObj, dstDir model.Obj) ...
method Remove (line 255) | func (d *ILanZou) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 274) | func (d *ILanZou) Put(ctx context.Context, dstDir model.Obj, s model.F...
method GetDetails (line 404) | func (d *ILanZou) GetDetails(ctx context.Context) (*model.StorageDetai...
constant DefaultPartSize (line 272) | DefaultPartSize = 1024 * 1024 * 8
FILE: drivers/ilanzou/meta.go
type Addition (line 8) | type Addition struct
type Conf (line 18) | type Conf struct
function init (line 28) | func init() {
FILE: drivers/ilanzou/types.go
type ListResp (line 3) | type ListResp struct
type ListItem (line 13) | type ListItem struct
type Part (line 41) | type Part struct
type UploadTokenRapidResp (line 46) | type UploadTokenRapidResp struct
type UploadResultResp (line 58) | type UploadResultResp struct
FILE: drivers/ilanzou/util.go
method login (line 19) | func (d *ILanZou) login() error {
function getTimestamp (line 36) | func getTimestamp(secret []byte) (int64, string, error) {
method request (line 46) | func (d *ILanZou) request(pathname, method string, callback base.ReqCall...
method unproved (line 110) | func (d *ILanZou) unproved(pathname, method string, callback base.ReqCal...
method proved (line 114) | func (d *ILanZou) proved(pathname, method string, callback base.ReqCallb...
FILE: drivers/ipfs_api/driver.go
type IPFS (line 15) | type IPFS struct
method Config (line 22) | func (d *IPFS) Config() driver.Config {
method GetAddition (line 26) | func (d *IPFS) GetAddition() driver.Additional {
method Init (line 30) | func (d *IPFS) Init(ctx context.Context) error {
method Drop (line 40) | func (d *IPFS) Drop(ctx context.Context) error {
method List (line 44) | func (d *IPFS) List(ctx context.Context, dir model.Obj, args model.Lis...
method Link (line 80) | func (d *IPFS) Link(ctx context.Context, file model.Obj, args model.Li...
method Get (line 86) | func (d *IPFS) Get(ctx context.Context, rawPath string) (model.Obj, er...
method MakeDir (line 110) | func (d *IPFS) MakeDir(ctx context.Context, parentDir model.Obj, dirNa...
method Move (line 126) | func (d *IPFS) Move(ctx context.Context, srcObj, dstDir model.Obj) (mo...
method Rename (line 136) | func (d *IPFS) Rename(ctx context.Context, srcObj model.Obj, newName s...
method Copy (line 146) | func (d *IPFS) Copy(ctx context.Context, srcObj, dstDir model.Obj) (mo...
method Remove (line 156) | func (d *IPFS) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 163) | func (d *IPFS) Put(ctx context.Context, dstDir model.Obj, s model.File...
FILE: drivers/ipfs_api/meta.go
type Addition (line 8) | type Addition struct
function init (line 22) | func init() {
FILE: drivers/kodbox/driver.go
type KodBox (line 17) | type KodBox struct
method Config (line 23) | func (d *KodBox) Config() driver.Config {
method GetAddition (line 27) | func (d *KodBox) GetAddition() driver.Additional {
method Init (line 31) | func (d *KodBox) Init(ctx context.Context) error {
method Drop (line 37) | func (d *KodBox) Drop(ctx context.Context) error {
method List (line 41) | func (d *KodBox) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 82) | func (d *KodBox) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 91) | func (d *KodBox) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 119) | func (d *KodBox) Move(ctx context.Context, srcObj, dstDir model.Obj) (...
method Rename (line 148) | func (d *KodBox) Rename(ctx context.Context, srcObj model.Obj, newName...
method Copy (line 174) | func (d *KodBox) Copy(ctx context.Context, srcObj, dstDir model.Obj) (...
method Remove (line 208) | func (d *KodBox) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 228) | func (d *KodBox) Put(ctx context.Context, dstDir model.Obj, s model.Fi...
method getFileOrFolderName (line 261) | func (d *KodBox) getFileOrFolderName(ctx context.Context, path string)...
FILE: drivers/kodbox/meta.go
type Addition (line 8) | type Addition struct
function init (line 20) | func init() {
FILE: drivers/kodbox/types.go
type CommonResp (line 3) | type CommonResp struct
type ListPathData (line 11) | type ListPathData struct
type FolderOrFile (line 16) | type FolderOrFile struct
FILE: drivers/kodbox/util.go
method getToken (line 12) | func (d *KodBox) getToken() error {
method request (line 36) | func (d *KodBox) request(method string, pathname string, callback base.R...
FILE: drivers/lanzou/driver.go
type LanZou (line 15) | type LanZou struct
method Config (line 24) | func (d *LanZou) Config() driver.Config {
method GetAddition (line 28) | func (d *LanZou) GetAddition() driver.Additional {
method Init (line 32) | func (d *LanZou) Init(ctx context.Context) (err error) {
method Drop (line 52) | func (d *LanZou) Drop(ctx context.Context) error {
method List (line 58) | func (d *LanZou) List(ctx context.Context, dir model.Obj, args model.L...
method Link (line 66) | func (d *LanZou) Link(ctx context.Context, file model.Obj, args model....
method MakeDir (line 126) | func (d *LanZou) MakeDir(ctx context.Context, parentDir model.Obj, dir...
method Move (line 148) | func (d *LanZou) Move(ctx context.Context, srcObj, dstDir model.Obj) (...
method Rename (line 168) | func (d *LanZou) Rename(ctx context.Context, srcObj model.Obj, newName...
method Remove (line 190) | func (d *LanZou) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 211) | func (d *LanZou) Put(ctx context.Context, dstDir model.Obj, s model.Fi...
FILE: drivers/lanzou/help.go
constant DAY (line 15) | DAY time.Duration = 84600000000000
function MustParseTime (line 21) | func MustParseTime(str string) time.Time {
function SizeStrToInt64 (line 52) | func SizeStrToInt64(size string) int64 {
function RemoveNotes (line 71) | func RemoveNotes(html string) string {
function RemoveJSComment (line 81) | func RemoveJSComment(data string) string {
function CalcAcwScV2 (line 124) | func CalcAcwScV2(htmlContent string) (string, error) {
function unbox (line 140) | func unbox(hex string) string {
function hexXor (line 151) | func hexXor(hex1, hex2 string) (string, error) {
function findJSVarFunc (line 172) | func findJSVarFunc(key, data string) string {
function findJSFunctionIndex (line 196) | func findJSFunctionIndex(data string, all bool) [][2]int {
function removeJSGlobalFunction (line 231) | func removeJSGlobalFunction(html string) string {
function getJSFunctionByName (line 243) | func getJSFunctionByName(html string, name string) (string, error) {
function htmlJsonToMap2 (line 255) | func htmlJsonToMap2(html string) (map[string]string, error) {
function htmlJsonToMap (line 270) | func htmlJsonToMap(html string) (map[string]string, error) {
function jsonToMap (line 278) | func jsonToMap(data, html string) map[string]string {
function IsNumber (line 292) | func IsNumber(str string) bool {
function htmlFormToMap (line 304) | func htmlFormToMap(html string) (map[string]string, error) {
function formToMap (line 312) | func formToMap(from string) map[string]string {
function GetExpirationTime (line 323) | func GetExpirationTime(url string) (etime time.Duration) {
function CookieToString (line 336) | func CookieToString(cookies []*http.Cookie) string {
FILE: drivers/lanzou/meta.go
type Addition (line 8) | type Addition struct
method IsCookie (line 24) | func (a *Addition) IsCookie() bool {
method IsAccount (line 28) | func (a *Addition) IsAccount() bool {
function init (line 38) | func init() {
FILE: drivers/lanzou/types.go
type RespText (line 16) | type RespText struct
type RespInfo (line 20) | type RespInfo struct
type FileOrFolder (line 27) | type FileOrFolder struct
method CreateTime (line 58) | func (f *FileOrFolder) CreateTime() time.Time {
method GetHash (line 62) | func (f *FileOrFolder) GetHash() utils.HashInfo {
method GetID (line 66) | func (f *FileOrFolder) GetID() string {
method GetName (line 72) | func (f *FileOrFolder) GetName() string {
method GetPath (line 78) | func (f *FileOrFolder) GetPath() string { return "" }
method GetSize (line 79) | func (f *FileOrFolder) GetSize() int64 {
method IsDir (line 86) | func (f *FileOrFolder) IsDir() bool { return f.FolID != "" }
method ModTime (line 87) | func (f *FileOrFolder) ModTime() time.Time {
method SetShareInfo (line 95) | func (f *FileOrFolder) SetShareInfo(fs *FileShare) {
method GetShareInfo (line 98) | func (f *FileOrFolder) GetShareInfo() *FileShare {
type FileShare (line 103) | type FileShare struct
type FileOrFolderByShareUrlResp (line 119) | type FileOrFolderByShareUrlResp struct
type FileOrFolderByShareUrl (line 122) | type FileOrFolderByShareUrl struct
method CreateTime (line 147) | func (f *FileOrFolderByShareUrl) CreateTime() time.Time {
method GetHash (line 151) | func (f *FileOrFolderByShareUrl) GetHash() utils.HashInfo {
method GetID (line 155) | func (f *FileOrFolderByShareUrl) GetID() string { return f.ID }
method GetName (line 156) | func (f *FileOrFolderByShareUrl) GetName() string { return f.NameAll }
method GetPath (line 157) | func (f *FileOrFolderByShareUrl) GetPath() string { return "" }
method GetSize (line 158) | func (f *FileOrFolderByShareUrl) GetSize() int64 {
method IsDir (line 165) | func (f *FileOrFolderByShareUrl) IsDir() bool { return f.IsFloder }
method ModTime (line 166) | func (f *FileOrFolderByShareUrl) ModTime() time.Time {
type FileShareInfoAndUrlResp (line 175) | type FileShareInfoAndUrlResp struct
method GetBaseUrl (line 181) | func (u *FileShareInfoAndUrlResp[T]) GetBaseUrl() string {
method GetDownloadUrl (line 185) | func (u *FileShareInfoAndUrlResp[T]) GetDownloadUrl() string {
FILE: drivers/lanzou/util.go
method doupload (line 27) | func (d *LanZou) doupload(callback base.ReqCallback, resp interface{}) (...
method get (line 39) | func (d *LanZou) get(url string, callback base.ReqCallback) ([]byte, err...
method post (line 43) | func (d *LanZou) post(url string, callback base.ReqCallback, resp interf...
method _post (line 64) | func (d *LanZou) _post(url string, callback base.ReqCallback, resp inter...
method request (line 99) | func (d *LanZou) request(url string, method string, callback base.ReqCal...
method Login (line 160) | func (d *LanZou) Login() ([]*http.Cookie, error) {
method GetAllFiles (line 187) | func (d *LanZou) GetAllFiles(folderID string) ([]model.Obj, error) {
method GetFolders (line 206) | func (d *LanZou) GetFolders(folderID string) ([]FileOrFolder, error) {
method GetFiles (line 221) | func (d *LanZou) GetFiles(folderID string) ([]FileOrFolder, error) {
method getFolderShareUrlByID (line 244) | func (d *LanZou) getFolderShareUrlByID(fileID string) (*FileShare, error) {
method getFileShareUrlByID (line 259) | func (d *LanZou) getFileShareUrlByID(fileID string) (*FileShare, error) {
method getShareUrlHtml (line 302) | func (d *LanZou) getShareUrlHtml(shareID string) (string, error) {
method GetFileOrFolderByShareUrl (line 340) | func (d *LanZou) GetFileOrFolderByShareUrl(shareID, pwd string) ([]model...
method GetFilesByShareUrl (line 366) | func (d *LanZou) GetFilesByShareUrl(shareID, pwd string) (file *FileOrFo...
method getFilesByShareUrl (line 374) | func (d *LanZou) getFilesByShareUrl(shareID, pwd string, sharePageData s...
method GetFolderByShareUrl (line 560) | func (d *LanZou) GetFolderByShareUrl(shareID, pwd string) ([]FileOrFolde...
method getFolderByShareUrl (line 568) | func (d *LanZou) getFolderByShareUrl(pwd string, sharePageData string) (...
method getFileRealInfo (line 611) | func (d *LanZou) getFileRealInfo(downURL string) (*int64, *time.Time) {
method getVeiAndUid (line 621) | func (d *LanZou) getVeiAndUid() (vei string, uid string, err error) {
FILE: drivers/lenovonas_share/driver.go
type LenovoNasShare (line 19) | type LenovoNasShare struct
method Config (line 26) | func (d *LenovoNasShare) Config() driver.Config {
method GetAddition (line 30) | func (d *LenovoNasShare) GetAddition() driver.Additional {
method Init (line 34) | func (d *LenovoNasShare) Init(ctx context.Context) error {
method Drop (line 45) | func (d *LenovoNasShare) Drop(ctx context.Context) error {
method List (line 49) | func (d *LenovoNasShare) List(ctx context.Context, dir model.Obj, args...
method checkStoken (line 90) | func (d *LenovoNasShare) checkStoken() { // 检查stoken是否过期
method getStoken (line 96) | func (d *LenovoNasShare) getStoken() error { // 获取stoken
method Link (line 119) | func (d *LenovoNasShare) Link(ctx context.Context, file model.Obj, arg...
method MakeDir (line 143) | func (d *LenovoNasShare) MakeDir(ctx context.Context, parentDir model....
method Move (line 147) | func (d *LenovoNasShare) Move(ctx context.Context, srcObj, dstDir mode...
method Rename (line 151) | func (d *LenovoNasShare) Rename(ctx context.Context, srcObj model.Obj,...
method Copy (line 155) | func (d *LenovoNasShare) Copy(ctx context.Context, srcObj, dstDir mode...
method Remove (line 159) | func (d *LenovoNasShare) Remove(ctx context.Context, obj model.Obj) er...
method Put (line 163) | func (d *LenovoNasShare) Put(ctx context.Context, dstDir model.Obj, st...
FILE: drivers/lenovonas_share/meta.go
type Addition (line 8) | type Addition struct
function init (line 22) | func init() {
FILE: drivers/lenovonas_share/types.go
type File (line 32) | type File struct
method UnmarshalJSON (line 12) | func (f *File) UnmarshalJSON(data []byte) error {
method GetHash (line 41) | func (f File) GetHash() utils.HashInfo {
method GetPath (line 45) | func (f File) GetPath() string {
method GetSize (line 49) | func (f File) GetSize() int64 {
method GetName (line 57) | func (f File) GetName() string {
method ModTime (line 61) | func (f File) ModTime() time.Time {
method CreateTime (line 65) | func (f File) CreateTime() time.Time {
method IsDir (line 69) | func (f File) IsDir() bool {
method GetID (line 73) | func (f File) GetID() string {
type Files (line 77) | type Files struct
FILE: drivers/lenovonas_share/util.go
method request (line 11) | func (d *LenovoNasShare) request(url string, method string, callback bas...
FILE: drivers/local/benchmark_calculatedirsize_test.go
function generatedTestDir (line 14) | func generatedTestDir(dir string, dep, filecount int) {
function generatedFiles (line 26) | func generatedFiles(path string, count int) error {
function BenchmarkCalculateDirSize (line 48) | func BenchmarkCalculateDirSize(t *testing.B) {
FILE: drivers/local/copy_namedpipes.go
function copyNamedPipe (line 11) | func copyNamedPipe(dstPath string, mode os.FileMode, dirMode os.FileMode...
FILE: drivers/local/copy_namedpipes_x.go
function copyNamedPipe (line 7) | func copyNamedPipe(_ string, _, _ os.FileMode) error {
FILE: drivers/local/driver.go
type Local (line 30) | type Local struct
method Config (line 47) | func (d *Local) Config() driver.Config {
method Init (line 51) | func (d *Local) Init(ctx context.Context) error {
method Drop (line 127) | func (d *Local) Drop(ctx context.Context) error {
method GetAddition (line 131) | func (d *Local) GetAddition() driver.Additional {
method List (line 135) | func (d *Local) List(ctx context.Context, dir model.Obj, args model.Li...
method FileInfoToObj (line 153) | func (d *Local) FileInfoToObj(ctx context.Context, f fs.FileInfo, reqP...
method Get (line 197) | func (d *Local) Get(ctx context.Context, path string) (model.Obj, erro...
method Link (line 234) | func (d *Local) Link(ctx context.Context, file model.Obj, args model.L...
method MakeDir (line 283) | func (d *Local) MakeDir(ctx context.Context, parentDir model.Obj, dirN...
method Move (line 292) | func (d *Local) Move(ctx context.Context, srcObj, dstDir model.Obj) er...
method Rename (line 318) | func (d *Local) Rename(ctx context.Context, srcObj model.Obj, newName ...
method Copy (line 336) | func (d *Local) Copy(_ context.Context, srcObj, dstDir model.Obj) error {
method Remove (line 359) | func (d *Local) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 408) | func (d *Local) Put(ctx context.Context, dstDir model.Obj, stream mode...
method GetDetails (line 436) | func (d *Local) GetDetails(ctx context.Context) (*model.StorageDetails...
FILE: drivers/local/meta.go
type Addition (line 8) | type Addition struct
function init (line 29) | func init() {
FILE: drivers/local/token_bucket.go
type TokenBucket (line 5) | type TokenBucket interface
type StaticTokenBucket (line 14) | type StaticTokenBucket struct
method Take (line 58) | func (b StaticTokenBucket) Take() <-chan struct{} {
method Put (line 62) | func (b StaticTokenBucket) Put() {
method Do (line 66) | func (b StaticTokenBucket) Do(ctx context.Context, f func() error) err...
function NewStaticTokenBucket (line 18) | func NewStaticTokenBucket(size int) StaticTokenBucket {
function NewStaticTokenBucketWithMigration (line 26) | func NewStaticTokenBucketWithMigration(oldBucket TokenBucket, size int) ...
type NopTokenBucket (line 79) | type NopTokenBucket struct
method Take (line 89) | func (b NopTokenBucket) Take() <-chan struct{} {
method Put (line 93) | func (b NopTokenBucket) Put() {}
method Do (line 95) | func (b NopTokenBucket) Do(_ context.Context, f func() error) error { ...
function NewNopTokenBucket (line 83) | func NewNopTokenBucket() NopTokenBucket {
FILE: drivers/local/util.go
function isSymlinkDir (line 27) | func isSymlinkDir(f fs.FileInfo, path string) bool {
method GetSnapshot (line 47) | func (d *Local) GetSnapshot(videoPath string) (imgData *bytes.Buffer, er...
function readDir (line 99) | func readDir(dirname string) ([]fs.FileInfo, error) {
method getThumb (line 113) | func (d *Local) getThumb(file model.Obj) (*bytes.Buffer, *string, error) {
type DirectoryMap (line 162) | type DirectoryMap struct
method Has (line 183) | func (m *DirectoryMap) Has(path string) bool {
method Get (line 189) | func (m *DirectoryMap) Get(path string) (*DirectoryNode, bool) {
method Set (line 203) | func (m *DirectoryMap) Set(path string, node *DirectoryNode) {
method Delete (line 207) | func (m *DirectoryMap) Delete(path string) {
method Clear (line 211) | func (m *DirectoryMap) Clear() {
method RecalculateDirSize (line 215) | func (m *DirectoryMap) RecalculateDirSize() error {
method CalculateDirSize (line 234) | func (m *DirectoryMap) CalculateDirSize(dirname string) (int64, error) {
method UpdateDirSize (line 321) | func (m *DirectoryMap) UpdateDirSize(dirname string) (int64, error) {
method UpdateDirParents (line 370) | func (m *DirectoryMap) UpdateDirParents(dirname string) error {
method DeleteDirNode (line 393) | func (m *DirectoryMap) DeleteDirNode(dirname string) error {
type DirectoryNode (line 167) | type DirectoryNode struct
type DirectoryTask (line 173) | type DirectoryTask struct
type DirectoryTaskCache (line 178) | type DirectoryTaskCache struct
method tryCopy (line 412) | func (d *Local) tryCopy(srcPath, dstPath string, info os.FileInfo) error {
method copySymlink (line 426) | func (d *Local) copySymlink(srcPath, dstPath string) error {
method recurAndTryCopy (line 450) | func (d *Local) recurAndTryCopy(srcPath, dstPath string) error {
function tryReflinkCopy (line 480) | func tryReflinkCopy(srcPath, dstPath string) error {
FILE: drivers/local/util_unix.go
function isHidden (line 15) | func isHidden(f fs.FileInfo, _ string) bool {
function getDiskUsage (line 19) | func getDiskUsage(path string) (model.DiskUsage, error) {
function isCrossDeviceError (line 33) | func isCrossDeviceError(err error) bool {
FILE: drivers/local/util_windows.go
function isHidden (line 15) | func isHidden(f fs.FileInfo, fullPath string) bool {
function getDiskUsage (line 28) | func getDiskUsage(path string) (model.DiskUsage, error) {
function isCrossDeviceError (line 53) | func isCrossDeviceError(err error) bool {
FILE: drivers/mediafire/driver.go
type Mediafire (line 34) | type Mediafire struct
method Config (line 53) | func (d *Mediafire) Config() driver.Config {
method GetAddition (line 57) | func (d *Mediafire) GetAddition() driver.Additional {
method Init (line 62) | func (d *Mediafire) Init(ctx context.Context) error {
method Drop (line 98) | func (d *Mediafire) Drop(ctx context.Context) error {
method List (line 109) | func (d *Mediafire) List(ctx context.Context, dir model.Obj, args mode...
method Link (line 120) | func (d *Mediafire) Link(ctx context.Context, file model.Obj, args mod...
method MakeDir (line 151) | func (d *Mediafire) MakeDir(ctx context.Context, parentDir model.Obj, ...
method Move (line 182) | func (d *Mediafire) Move(ctx context.Context, srcObj, dstDir model.Obj...
method Rename (line 220) | func (d *Mediafire) Rename(ctx context.Context, srcObj model.Obj, newN...
method Copy (line 265) | func (d *Mediafire) Copy(ctx context.Context, srcObj, dstDir model.Obj...
method Remove (line 321) | func (d *Mediafire) Remove(ctx context.Context, obj model.Obj) error {
method Put (line 353) | func (d *Mediafire) Put(ctx context.Context, dstDir model.Obj, file mo...
method GetDetails (line 409) | func (d *Mediafire) GetDetails(ctx context.Context) (*model.StorageDet...
FILE: drivers/mediafire/meta.go
type Addition (line 23) | type Addition struct
function init (line 50) | func init() {
FILE: drivers/mediafire/types.go
type MediafireRenewTokenResponse (line 11) | type MediafireRenewTokenResponse struct
type MediafireResponse (line 20) | type MediafireResponse struct
type MediafireFolder (line 36) | type MediafireFolder struct
type MediafireFile (line 43) | type MediafireFile struct
type File (line 52) | type File struct
type FolderContentResponse (line 60) | type FolderContentResponse struct
type MediafireLinksResponse (line 66) | type MediafireLinksResponse struct
type MediafireDirectDownloadResponse (line 85) | type MediafireDirectDownloadResponse struct
type MediafireFolderCreateResponse (line 98) | type MediafireFolderCreateResponse struct
type MediafireMoveResponse (line 120) | type MediafireMoveResponse struct
type MediafireRenameResponse (line 131) | type MediafireRenameResponse struct
type MediafireCopyResponse (line 141) | type MediafireCopyResponse struct
type MediafireRemoveResponse (line 155) | type MediafireRemoveResponse struct
type MediafireCheckResponse (line 165) | type MediafireCheckResponse struct
type MediafireActionTokenResponse (line 196) | type MediafireActionTokenResponse struct
type MediafirePollResponse (line 205) | type MediafirePollResponse struct
type MediafireFileSearchResponse (line 225) | type MediafireFileSearchResponse struct
type MediafireUserInfoResponse (line 234) | type MediafireUserInfoResponse struct
FILE: drivers/mediafire/util.go
function checkAPIResult (line 41) | func checkAPIResult(result string) error {
method getSessionToken (line 49) | func (d *Mediafire) getSessionToken(ctx context.Context) (string, error) {
method renewToken (line 153) | func (d *Mediafire) renewToken(ctx context.Context) error {
method getFiles (line 181) | func (d *Mediafire) getFiles(ctx context.Context, folderKey string) ([]F...
method getFolderContent (line 230) | func (d *Mediafire) getFolderContent(ctx context.Context, folderKey stri...
method getFolderContentByType (line 248) | func (d *Mediafire) getFolderContentByType(ctx context.Context, folderKe...
method fileToObj (line 276) | func (d *Mediafire) fileToObj(f File) *model.ObjThumb {
method setCommonHeaders (line 300) | func (d *Mediafire) setCommonHeaders(req *resty.Request) {
method apiRequest (line 310) | func (d *Mediafire) apiRequest(ctx context.Context, method, endpoint str...
method getForm (line 357) | func (d *Mediafire) getForm(ctx context.Context, endpoint string, query ...
method postForm (line 361) | func (d *Mediafire) postForm(ctx context.Context, endpoint string, data ...
method getDirectDownloadLink (line 365) | func (d *Mediafire) getDirectDownloadLink(ctx context.Context, fileID st...
method uploadCheck (line 390) | func (d *Mediafire) uploadCheck(ctx context.Context, filename string, fi...
method uploadUnits (line 425) | func (d *Mediafire) uploadUnits(ctx context.Context, file model.FileStre...
method getActionToken (line 623) | func (d *Mediafire) getActionToken(ctx context.Context) (string, error) {
method pollUpload (line 648) | func (d *Mediafire) pollUpload(ctx context.Context, key string) (*Mediaf...
method isUnitUploaded (line 680) | func (d *Mediafire) isUnitUploaded(words []int, unitID int) bool {
method getExistingFileInfo (line 689) | func (d *Mediafire) getExistingFileInfo(ctx context.Context, fileHash, f...
method getFileByHash (line 711) | func (d *Mediafire) getFileByHash(ctx context.Context, hash string) (*mo...
FILE: drivers/mediatrack/driver.go
type MediaTrack (line 26) | type MediaTrack struct
method Config (line 31) | func (d *MediaTrack) Config() driver.Config {
method GetAddition (line
Condensed preview — 744 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,731K chars).
[
{
"path": ".air.toml",
"chars": 748,
"preview": "root = \".\"\ntestdata_dir = \"testdata\"\ntmp_dir = \"tmp\"\n\n[build]\nargs_bin = [\"server\"]\nbin = \"./tmp/main\"\ncmd = \"go build -"
},
{
"path": ".github/FUNDING.yml",
"chars": 734,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/00-bug_report_zh.yml",
"chars": 2525,
"preview": "name: \"错误报告\"\ndescription: 错误报告 / 问题\ntitle: \"[BUG] 请修改标题为您遇到的问题\"\nlabels: [bug]\nbody:\n - type: markdown\n attributes:\n "
},
{
"path": ".github/ISSUE_TEMPLATE/01-bug_report_en.yml",
"chars": 3781,
"preview": "name: \"Bug Report\"\ndescription: Bug Report / Issue\ntitle: \"[BUG] Please modify the title to describe the issue you are f"
},
{
"path": ".github/ISSUE_TEMPLATE/02-feature_request_zh.yml",
"chars": 1489,
"preview": "name: \"功能请求\"\ndescription: 功能请求 / 增强\ntitle: \"[Feature] 请修改标题为您的功能名称\"\nlabels: [enhancement]\nbody:\n - type: checkboxes\n "
},
{
"path": ".github/ISSUE_TEMPLATE/03-feature_request_en.yml",
"chars": 2360,
"preview": "name: \"Feature Request\"\ndescription: Feature Request / Enhancement\ntitle: \"[Feature] Please modify the title to your fea"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 417,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: 问题和讨论\n url: https://github.com/OpenListTeam/OpenList/discussions\n"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 2397,
"preview": "<!--\n Provide a general summary of your changes in the Title above.\n The PR title must start with `feat(): `, `docs():"
},
{
"path": ".github/workflows/beta_release.yml",
"chars": 4533,
"preview": "name: Beta Release builds\n\non:\n push:\n branches: [\"main\"]\n workflow_dispatch:\n\nconcurrency:\n group: ${{ github.wor"
},
{
"path": ".github/workflows/build.yml",
"chars": 1869,
"preview": "name: Test Build\n\non:\n pull_request:\n branches: [\"main\"]\n workflow_dispatch:\n\nconcurrency:\n group: ${{ github.work"
},
{
"path": ".github/workflows/changelog.yml",
"chars": 527,
"preview": "name: Release Automatic changelog\n\non:\n push:\n tags:\n - 'v*'\n\npermissions:\n contents: write\n\njobs:\n changelog"
},
{
"path": ".github/workflows/issue_pr_comment.yml",
"chars": 5002,
"preview": "name: Issue or PR Auto Reply\n\non:\n issues:\n types: [opened]\n pull_request:\n types: [opened]\n\npermissions:\n issu"
},
{
"path": ".github/workflows/release.yml",
"chars": 2094,
"preview": "name: Release builds\n\non:\n release:\n types: [ published ]\n\npermissions:\n contents: write\n\njobs:\n # Set release to "
},
{
"path": ".github/workflows/release_docker.yml",
"chars": 9114,
"preview": "name: Release builds (Docker)\n\non:\n workflow_dispatch:\n inputs:\n manual_tag:\n description: 'Tag name (li"
},
{
"path": ".github/workflows/sync_repo.yml",
"chars": 952,
"preview": "name: Sync to Gitee\n\non:\n push:\n branches:\n - main\n workflow_dispatch:\n\njobs:\n sync:\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/test_docker.yml",
"chars": 4566,
"preview": "name: Beta Release (Docker)\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n pull_request:\n branches:\n "
},
{
"path": ".github/workflows/trigger-makefile-update.yml",
"chars": 1444,
"preview": "name: Trigger OpenWRT Update\n\non:\n push:\n tags:\n - 'v*'\n workflow_dispatch:\n inputs:\n tag:\n des"
},
{
"path": ".gitignore",
"chars": 423,
"preview": ".idea/\n.DS_Store\noutput/\n/dist/\n\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n*.db\n*.bin\n\n# Test "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5245,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTING.md",
"chars": 1973,
"preview": "# Contributing\n\n## Setup your machine\n\n`OpenList` is written in [Go](https://golang.org/) and [SolidJS](https://www.soli"
},
{
"path": "Dockerfile",
"chars": 1005,
"preview": "### Default image is base. You can add other support by modifying BASE_IMAGE_TAG. The following parameters are supported"
},
{
"path": "Dockerfile.ci",
"chars": 666,
"preview": "ARG BASE_IMAGE_TAG=base\nFROM ghcr.io/openlistteam/openlist-base-image:${BASE_IMAGE_TAG}\nLABEL MAINTAINER=\"OpenList\"\nARG "
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 8809,
"preview": "<div align=\"center\">\n <img style=\"width: 128px; height: 128px;\" src=\"https://raw.githubusercontent.com/OpenListTeam/Log"
},
{
"path": "README_cn.md",
"chars": 5900,
"preview": "<div align=\"center\">\n <img style=\"width: 128px; height: 128px;\" src=\"https://raw.githubusercontent.com/OpenListTeam/Log"
},
{
"path": "README_ja.md",
"chars": 6661,
"preview": "<div align=\"center\">\n <img style=\"width: 128px; height: 128px;\" src=\"https://raw.githubusercontent.com/OpenListTeam/Log"
},
{
"path": "README_nl.md",
"chars": 9152,
"preview": "<div align=\"center\">\n <img style=\"width: 128px; height: 128px;\" src=\"https://raw.githubusercontent.com/OpenListTeam/Log"
},
{
"path": "SECURITY.md",
"chars": 2778,
"preview": "# Security Policy\n\n## Supported Versions\n\nOnly the latest stable release receives security patches. We strongly recommen"
},
{
"path": "build.sh",
"chars": 25428,
"preview": "set -e\nappName=\"openlist\"\nbuiltAt=\"$(date +'%F %T %z')\"\ngitAuthor=\"The OpenList Projects Contributors <noreply@openlist."
},
{
"path": "cmd/admin.go",
"chars": 3274,
"preview": "/*\nCopyright © 2022 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "cmd/cancel2FA.go",
"chars": 1330,
"preview": "/*\nCopyright © 2022 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "cmd/common.go",
"chars": 783,
"preview": "package cmd\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/bootstrap\"\n\t\"git"
},
{
"path": "cmd/crypt.go",
"chars": 8441,
"preview": "package cmd\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\trcCrypt \"github.com/rclone/rclone/backend/crypt\""
},
{
"path": "cmd/flags/config.go",
"chars": 153,
"preview": "package flags\n\nvar (\n\tDataDir string\n\tConfigPath string\n\tDebug bool\n\tNoPrefix bool\n\tDev bool\n\tForc"
},
{
"path": "cmd/kill.go",
"chars": 1286,
"preview": "package cmd\n\nimport (\n\t\"os\"\n\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\"\n)\n\n// KillCmd represents the ki"
},
{
"path": "cmd/lang.go",
"chars": 4966,
"preview": "/*\nPackage cmd\nCopyright © 2022 Noah Hsu<i@nn.ci>\n*/\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t_ \"github.com"
},
{
"path": "cmd/restart.go",
"chars": 786,
"preview": "/*\nCopyright © 2022 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\n// RestartCmd repres"
},
{
"path": "cmd/root.go",
"chars": 1578,
"preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/cmd/flags\"\n\t_ \"github.com/OpenListTeam/OpenLis"
},
{
"path": "cmd/server.go",
"chars": 1493,
"preview": "package cmd\n\nimport (\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/bootstrap\"\n\t"
},
{
"path": "cmd/start.go",
"chars": 1760,
"preview": "/*\nCopyright © 2022 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\tlo"
},
{
"path": "cmd/stop_default.go",
"chars": 1330,
"preview": "//go:build !windows\n\npackage cmd\n\nimport (\n\t\"os\"\n\t\"syscall\"\n\n\tlog \"github.com/sirupsen/logrus\"\n\t\"github.com/spf13/cobra\""
},
{
"path": "cmd/stop_windows.go",
"chars": 733,
"preview": "//go:build windows\n\npackage cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\n// StopCmd represents the stop command\nvar StopCm"
},
{
"path": "cmd/storage.go",
"chars": 5268,
"preview": "/*\nCopyright © 2023 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com/OpenListTea"
},
{
"path": "cmd/user.go",
"chars": 1623,
"preview": "package cmd\n\nimport (\n\t\"crypto/tls\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/conf\"\n\t\"github.com/Op"
},
{
"path": "cmd/version.go",
"chars": 1122,
"preview": "/*\nCopyright © 2022 NAME HERE <EMAIL ADDRESS>\n*/\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\n\t\"github.com/OpenListTea"
},
{
"path": "docker-compose.yml",
"chars": 296,
"preview": "services:\n openlist:\n restart: always\n volumes:\n - '/etc/openlist:/opt/openlist/data'\n ports:\n - '52"
},
{
"path": "drivers/115/appver.go",
"chars": 1190,
"preview": "package _115\n\nimport (\n\t\"errors\"\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github.com/OpenListTeam/OpenList/"
},
{
"path": "drivers/115/driver.go",
"chars": 6680,
"preview": "package _115\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.co"
},
{
"path": "drivers/115/meta.go",
"chars": 985,
"preview": "package _115\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/inte"
},
{
"path": "drivers/115/types.go",
"chars": 872,
"preview": "package _115\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/OpenListTeam/OpenList"
},
{
"path": "drivers/115/util.go",
"chars": 13391,
"preview": "package _115\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/md5\"\n\t\"crypto/tls\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"n"
},
{
"path": "drivers/115_open/driver.go",
"chars": 9631,
"preview": "package _115_open\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tsdk \"github.com/OpenListTeam/1"
},
{
"path": "drivers/115_open/meta.go",
"chars": 966,
"preview": "package _115_open\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/115_open/types.go",
"chars": 1101,
"preview": "package _115_open\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/OpenListTeam/Ope"
},
{
"path": "drivers/115_open/upload.go",
"chars": 4405,
"preview": "package _115_open\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"io\"\n\t\"time\"\n\n\tsdk \"github.com/OpenListTeam/115-sdk-go\"\n\t\"git"
},
{
"path": "drivers/115_open/util.go",
"chars": 236,
"preview": "package _115_open\n\nimport \"encoding/json\"\n\nfunc ParseInt64(v json.Number) (int64, error) {\n\ti, err := v.Int64()\n\tif err "
},
{
"path": "drivers/115_share/driver.go",
"chars": 3269,
"preview": "package _115_share\n\nimport (\n\t\"context\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github.com/OpenListTeam/O"
},
{
"path": "drivers/115_share/meta.go",
"chars": 1197,
"preview": "package _115_share\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v"
},
{
"path": "drivers/115_share/utils.go",
"chars": 2457,
"preview": "package _115_share\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github.com"
},
{
"path": "drivers/123/driver.go",
"chars": 7236,
"preview": "package _123\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"golang."
},
{
"path": "drivers/123/meta.go",
"chars": 1055,
"preview": "package _123\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/inte"
},
{
"path": "drivers/123/types.go",
"chars": 3986,
"preview": "package _123\n\nimport (\n\t\"net/url\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/utils"
},
{
"path": "drivers/123/upload.go",
"chars": 5609,
"preview": "package _123\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/dri"
},
{
"path": "drivers/123/util.go",
"chars": 12863,
"preview": "package _123\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"math\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n"
},
{
"path": "drivers/123_link/driver.go",
"chars": 1857,
"preview": "package _123Link\n\nimport (\n\t\"context\"\n\tstdpath \"path\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\""
},
{
"path": "drivers/123_link/meta.go",
"chars": 660,
"preview": "package _123Link\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/"
},
{
"path": "drivers/123_link/parse.go",
"chars": 3665,
"preview": "package _123Link\n\nimport (\n\t\"fmt\"\n\turl2 \"net/url\"\n\tstdpath \"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// build tree from te"
},
{
"path": "drivers/123_link/types.go",
"chars": 1162,
"preview": "package _123Link\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/errs\"\n\t\"github.com/OpenListTeam/OpenL"
},
{
"path": "drivers/123_link/util.go",
"chars": 715,
"preview": "package _123Link\n\nimport (\n\t\"crypto/md5\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"net/url\"\n\t\"time\"\n)\n\nfunc SignURL(originURL, privateKey st"
},
{
"path": "drivers/123_open/driver.go",
"chars": 6808,
"preview": "package _123_open\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\""
},
{
"path": "drivers/123_open/meta.go",
"chars": 1455,
"preview": "package _123_open\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/123_open/token.go",
"chars": 3071,
"preview": "package _123_open\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/Ope"
},
{
"path": "drivers/123_open/types.go",
"chars": 4583,
"preview": "package _123_open\n\nimport (\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/OpenL"
},
{
"path": "drivers/123_open/upload.go",
"chars": 5370,
"preview": "package _123_open\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"strconv\"\n\t"
},
{
"path": "drivers/123_open/util.go",
"chars": 6994,
"preview": "package _123_open\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\""
},
{
"path": "drivers/123_share/driver.go",
"chars": 4356,
"preview": "package _123Share\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sync\"\n\t\"time\"\n\n\t\"golang.org/x/"
},
{
"path": "drivers/123_share/meta.go",
"chars": 756,
"preview": "package _123Share\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/123_share/types.go",
"chars": 1902,
"preview": "package _123Share\n\nimport (\n\t\"net/url\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/"
},
{
"path": "drivers/123_share/util.go",
"chars": 3349,
"preview": "package _123Share\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"math\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strc"
},
{
"path": "drivers/139/driver.go",
"chars": 26441,
"preview": "package _139\n\nimport (\n\t\"context\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"path\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/Open"
},
{
"path": "drivers/139/meta.go",
"chars": 1442,
"preview": "package _139\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/inte"
},
{
"path": "drivers/139/types.go",
"chars": 13024,
"preview": "package _139\n\nimport (\n\t\"encoding/xml\"\n)\n\nconst (\n\tMetaPersonal string = \"personal\"\n\tMetaFamily string = \"family"
},
{
"path": "drivers/139/util.go",
"chars": 43248,
"preview": "package _139\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/md5\"\n\tcrypto_rand \"crypto/rand\"\n\t\"cry"
},
{
"path": "drivers/189/driver.go",
"chars": 5565,
"preview": "package _189\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github.c"
},
{
"path": "drivers/189/help.go",
"chars": 3948,
"preview": "package _189\n\nimport (\n\t\"bytes\"\n\t\"crypto/aes\"\n\t\"crypto/hmac\"\n\t\"crypto/md5\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t"
},
{
"path": "drivers/189/login.go",
"chars": 3995,
"preview": "package _189\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/utils\"\n\tlog \"github.com/sirupsen/"
},
{
"path": "drivers/189/meta.go",
"chars": 615,
"preview": "package _189\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/inte"
},
{
"path": "drivers/189/types.go",
"chars": 2161,
"preview": "package _189\n\ntype LoginResp struct {\n\tMsg string `json:\"msg\"`\n\tResult int `json:\"result\"`\n\tToUrl string `json:\"t"
},
{
"path": "drivers/189/util.go",
"chars": 12744,
"preview": "package _189\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/md5\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mat"
},
{
"path": "drivers/189_tv/driver.go",
"chars": 7496,
"preview": "package _189_tv\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/dr"
},
{
"path": "drivers/189_tv/help.go",
"chars": 3569,
"preview": "package _189_tv\n\nimport (\n\t\"bytes\"\n\t\"crypto/hmac\"\n\t\"crypto/sha1\"\n\t\"encoding/hex\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"re"
},
{
"path": "drivers/189_tv/meta.go",
"chars": 876,
"preview": "package _189_tv\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/i"
},
{
"path": "drivers/189_tv/types.go",
"chars": 8927,
"preview": "package _189_tv\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/utils\"\n)\n\n// 居然有四种返回"
},
{
"path": "drivers/189_tv/utils.go",
"chars": 18007,
"preview": "package _189_tv\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t"
},
{
"path": "drivers/189pc/driver.go",
"chars": 10562,
"preview": "package _189pc\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList"
},
{
"path": "drivers/189pc/help.go",
"chars": 5345,
"preview": "package _189pc\n\nimport (\n\t\"bytes\"\n\t\"crypto/aes\"\n\t\"crypto/hmac\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t\"crypto/x509"
},
{
"path": "drivers/189pc/meta.go",
"chars": 1390,
"preview": "package _189pc\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/in"
},
{
"path": "drivers/189pc/types.go",
"chars": 10501,
"preview": "package _189pc\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/ut"
},
{
"path": "drivers/189pc/utils.go",
"chars": 40377,
"preview": "package _189pc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"n"
},
{
"path": "drivers/alias/driver.go",
"chars": 14611,
"preview": "package alias\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net/url\"\n\tstdpath \"path\"\n\t\"strings\"\n\n\t\"github.c"
},
{
"path": "drivers/alias/meta.go",
"chars": 1751,
"preview": "package alias\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "drivers/alias/types.go",
"chars": 1906,
"preview": "package alias\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/OpenListTeam/OpenLis"
},
{
"path": "drivers/alias/util.go",
"chars": 14177,
"preview": "package alias\n\nimport (\n\t\"context\"\n\t\"math/rand\"\n\tstdpath \"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v"
},
{
"path": "drivers/alist_v3/driver.go",
"chars": 10129,
"preview": "package alist_v3\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/OpenListTeam/"
},
{
"path": "drivers/alist_v3/meta.go",
"chars": 884,
"preview": "package alist_v3\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/"
},
{
"path": "drivers/alist_v3/types.go",
"chars": 3946,
"preview": "package alist_v3\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/"
},
{
"path": "drivers/alist_v3/util.go",
"chars": 1711,
"preview": "package alist_v3\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github.com/OpenList"
},
{
"path": "drivers/aliyundrive/driver.go",
"chars": 9976,
"preview": "package aliyundrive\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha1\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\""
},
{
"path": "drivers/aliyundrive/global.go",
"chars": 263,
"preview": "package aliyundrive\n\nimport (\n\t\"crypto/ecdsa\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/generic_sync\"\n)\n\ntype State str"
},
{
"path": "drivers/aliyundrive/help.go",
"chars": 1326,
"preview": "package aliyundrive\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"math/big\"\n\n\t\"github.com/dustinxie/ecc\"\n)\n"
},
{
"path": "drivers/aliyundrive/meta.go",
"chars": 935,
"preview": "package aliyundrive\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/"
},
{
"path": "drivers/aliyundrive/types.go",
"chars": 1410,
"preview": "package aliyundrive\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype RespErr struct {\n\tC"
},
{
"path": "drivers/aliyundrive/util.go",
"chars": 5550,
"preview": "package aliyundrive\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/OpenListTeam/O"
},
{
"path": "drivers/aliyundrive_open/driver.go",
"chars": 9354,
"preview": "package aliyundrive_open\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/"
},
{
"path": "drivers/aliyundrive_open/limiter.go",
"chars": 2333,
"preview": "package aliyundrive_open\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n\n\t\"golang.org/x/time/rate\"\n)\n\n// See document https://www.y"
},
{
"path": "drivers/aliyundrive_open/meta.go",
"chars": 1824,
"preview": "package aliyundrive_open\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/Open"
},
{
"path": "drivers/aliyundrive_open/types.go",
"chars": 2288,
"preview": "package aliyundrive_open\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/utils\"\n\n\t\"github.com/OpenListTeam/"
},
{
"path": "drivers/aliyundrive_open/upload.go",
"chars": 8172,
"preview": "package aliyundrive_open\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n"
},
{
"path": "drivers/aliyundrive_open/util.go",
"chars": 7455,
"preview": "package aliyundrive_open\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gith"
},
{
"path": "drivers/aliyundrive_share/driver.go",
"chars": 3101,
"preview": "package aliyundrive_share\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n"
},
{
"path": "drivers/aliyundrive_share/limiter.go",
"chars": 1527,
"preview": "package aliyundrive_share\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"golang.org/x/time/rate\"\n)\n\n// See issue https://github.com/Open"
},
{
"path": "drivers/aliyundrive_share/meta.go",
"chars": 759,
"preview": "package aliyundrive_share\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/Ope"
},
{
"path": "drivers/aliyundrive_share/types.go",
"chars": 1453,
"preview": "package aliyundrive_share\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype ErrorResp str"
},
{
"path": "drivers/aliyundrive_share/util.go",
"chars": 4185,
"preview": "package aliyundrive_share\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"g"
},
{
"path": "drivers/all.go",
"chars": 4761,
"preview": "package drivers\n\nimport (\n\t_ \"github.com/OpenListTeam/OpenList/v4/drivers/115\"\n\t_ \"github.com/OpenListTeam/OpenList/v4/d"
},
{
"path": "drivers/autoindex/driver.go",
"chars": 4454,
"preview": "package autoindex\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"github."
},
{
"path": "drivers/autoindex/meta.go",
"chars": 907,
"preview": "package autoindex\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/autoindex/types.go",
"chars": 193,
"preview": "package autoindex\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\nvar (\n\terrEmptyEvaluateResu"
},
{
"path": "drivers/autoindex/util.go",
"chars": 2320,
"preview": "package autoindex\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/antchfx/xpath\"\n\t\"github.com/pkg/errors\"\n)"
},
{
"path": "drivers/autoindex/util_test.go",
"chars": 1730,
"preview": "package autoindex\n\nimport (\n\t\"testing\"\n)\n\ntype wantType struct {\n\tv int64\n\texact bool\n\terror bool\n}\n\nfunc TestParseS"
},
{
"path": "drivers/azure_blob/driver.go",
"chars": 9854,
"preview": "package azure_blob\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-"
},
{
"path": "drivers/azure_blob/meta.go",
"chars": 1206,
"preview": "package azure_blob\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v"
},
{
"path": "drivers/azure_blob/types.go",
"chars": 531,
"preview": "package azure_blob\n\nimport \"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\n// progressTracker is used to track up"
},
{
"path": "drivers/azure_blob/util.go",
"chars": 12201,
"preview": "package azure_blob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com"
},
{
"path": "drivers/baidu_netdisk/driver.go",
"chars": 13540,
"preview": "package baidu_netdisk\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"ne"
},
{
"path": "drivers/baidu_netdisk/meta.go",
"chars": 2286,
"preview": "package baidu_netdisk\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTea"
},
{
"path": "drivers/baidu_netdisk/types.go",
"chars": 6536,
"preview": "package baidu_netdisk\n\nimport (\n\t\"errors\"\n\t\"path\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/mod"
},
{
"path": "drivers/baidu_netdisk/util.go",
"chars": 12776,
"preview": "package baidu_netdisk\n\nimport (\n\t\"context\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\""
},
{
"path": "drivers/baidu_photo/driver.go",
"chars": 10289,
"preview": "package baiduphoto\n\nimport (\n\t\"context\"\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"regexp\"\n\t\"strconv\"\n"
},
{
"path": "drivers/baidu_photo/help.go",
"chars": 1442,
"preview": "package baiduphoto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"math/rand\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/u"
},
{
"path": "drivers/baidu_photo/meta.go",
"chars": 1001,
"preview": "package baiduphoto\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v"
},
{
"path": "drivers/baidu_photo/types.go",
"chars": 4524,
"preview": "package baiduphoto\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/utils\"\n\n\t\"github.com/OpenListTeam"
},
{
"path": "drivers/baidu_photo/utils.go",
"chars": 13713,
"preview": "package baiduphoto\n\nimport (\n\t\"context\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode\"\n\n\t\"github.co"
},
{
"path": "drivers/base/client.go",
"chars": 1421,
"preview": "package base\n\nimport (\n\t\"crypto/tls\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/conf\"\n\t\"github."
},
{
"path": "drivers/base/types.go",
"chars": 243,
"preview": "package base\n\nimport \"github.com/go-resty/resty/v2\"\n\ntype Json map[string]interface{}\n\ntype TokenResp struct {\n\tAccessTo"
},
{
"path": "drivers/base/upload.go",
"chars": 879,
"preview": "package base\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/Op"
},
{
"path": "drivers/base/util.go",
"chars": 13,
"preview": "package base\n"
},
{
"path": "drivers/chaoxing/driver.go",
"chars": 7624,
"preview": "package chaoxing\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"n"
},
{
"path": "drivers/chaoxing/meta.go",
"chars": 1220,
"preview": "package chaoxing\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/"
},
{
"path": "drivers/chaoxing/types.go",
"chars": 10353,
"preview": "package chaoxing\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\n"
},
{
"path": "drivers/chaoxing/util.go",
"chars": 4439,
"preview": "package chaoxing\n\nimport (\n\t\"bytes\"\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"mime/multipart\""
},
{
"path": "drivers/chunk/driver.go",
"chars": 13683,
"preview": "package chunk\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\tstdpath \"path\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/O"
},
{
"path": "drivers/chunk/meta.go",
"chars": 1361,
"preview": "package chunk\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "drivers/chunk/obj.go",
"chars": 138,
"preview": "package chunk\n\nimport \"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\ntype chunkObject struct {\n\tmodel.Object\n\tchu"
},
{
"path": "drivers/cloudreve/driver.go",
"chars": 5609,
"preview": "package cloudreve\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drive"
},
{
"path": "drivers/cloudreve/meta.go",
"chars": 741,
"preview": "package cloudreve\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/cloudreve/types.go",
"chars": 1800,
"preview": "package cloudreve\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype Resp struct {\n\tCode i"
},
{
"path": "drivers/cloudreve/util.go",
"chars": 12550,
"preview": "package cloudreve\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t"
},
{
"path": "drivers/cloudreve_v4/driver.go",
"chars": 10177,
"preview": "package cloudreve_v4\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam"
},
{
"path": "drivers/cloudreve_v4/meta.go",
"chars": 1251,
"preview": "package cloudreve_v4\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList"
},
{
"path": "drivers/cloudreve_v4/types.go",
"chars": 6464,
"preview": "package cloudreve_v4\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\nconst (\n\tMetadataUpload"
},
{
"path": "drivers/cloudreve_v4/util.go",
"chars": 17167,
"preview": "package cloudreve_v4\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http"
},
{
"path": "drivers/cnb_releases/driver.go",
"chars": 6205,
"preview": "package cnb_releases\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/Open"
},
{
"path": "drivers/cnb_releases/meta.go",
"chars": 707,
"preview": "package cnb_releases\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList"
},
{
"path": "drivers/cnb_releases/types.go",
"chars": 2839,
"preview": "package cnb_releases\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype Object struct {\n\tm"
},
{
"path": "drivers/cnb_releases/util.go",
"chars": 1294,
"preview": "package cnb_releases\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/dri"
},
{
"path": "drivers/crypt/driver.go",
"chars": 11710,
"preview": "package crypt\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\tstdpath \"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"githu"
},
{
"path": "drivers/crypt/meta.go",
"chars": 1589,
"preview": "package crypt\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "drivers/crypt/types.go",
"chars": 14,
"preview": "package crypt\n"
},
{
"path": "drivers/crypt/util.go",
"chars": 682,
"preview": "package crypt\n\nimport (\n\tstdpath \"path\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\n// will give the best guessing based on the path\n"
},
{
"path": "drivers/degoo/driver.go",
"chars": 5994,
"preview": "package degoo\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/"
},
{
"path": "drivers/degoo/meta.go",
"chars": 754,
"preview": "package degoo\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/int"
},
{
"path": "drivers/degoo/types.go",
"chars": 3965,
"preview": "package degoo\n\nimport (\n\t\"encoding/json\"\n)\n\n// DegooLoginRequest represents the login request body.\ntype DegooLoginReque"
},
{
"path": "drivers/degoo/upload.go",
"chars": 4732,
"preview": "package degoo\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/sha1\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multi"
},
{
"path": "drivers/degoo/util.go",
"chars": 14899,
"preview": "package degoo\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\""
},
{
"path": "drivers/doubao/driver.go",
"chars": 8173,
"preview": "package doubao\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenL"
},
{
"path": "drivers/doubao/meta.go",
"chars": 804,
"preview": "package doubao\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/in"
},
{
"path": "drivers/doubao/types.go",
"chars": 13520,
"preview": "package doubao\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype "
},
{
"path": "drivers/doubao/util.go",
"chars": 25286,
"preview": "package doubao\n\nimport (\n\t\"context\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\""
},
{
"path": "drivers/doubao_share/driver.go",
"chars": 5284,
"preview": "package doubao_share\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/base\"\n\t\"g"
},
{
"path": "drivers/doubao_share/meta.go",
"chars": 497,
"preview": "package doubao_share\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList"
},
{
"path": "drivers/doubao_share/types.go",
"chars": 5930,
"preview": "package doubao_share\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype Ba"
},
{
"path": "drivers/doubao_share/util.go",
"chars": 16193,
"preview": "package doubao_share\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gi"
},
{
"path": "drivers/dropbox/driver.go",
"chars": 6230,
"preview": "package dropbox\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/dri"
},
{
"path": "drivers/dropbox/meta.go",
"chars": 974,
"preview": "package dropbox\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/i"
},
{
"path": "drivers/dropbox/types.go",
"chars": 2138,
"preview": "package dropbox\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n)\n\ntype TokenResp struct {\n\tAcc"
},
{
"path": "drivers/dropbox/util.go",
"chars": 7007,
"preview": "package dropbox\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/drivers/"
},
{
"path": "drivers/febbox/driver.go",
"chars": 2986,
"preview": "package febbox\n\nimport (\n\t\"context\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/op\"\n\t\"github.com/OpenListTeam/OpenLi"
},
{
"path": "drivers/febbox/meta.go",
"chars": 981,
"preview": "package febbox\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/in"
},
{
"path": "drivers/febbox/oauth2.go",
"chars": 2161,
"preview": "package febbox\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n\n\t\"golang.org/x"
},
{
"path": "drivers/febbox/types.go",
"chars": 4053,
"preview": "package febbox\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/O"
},
{
"path": "drivers/febbox/util.go",
"chars": 5004,
"preview": "package febbox\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\n\t\"github.com/OpenListTeam/OpenList/v4"
},
{
"path": "drivers/ftp/driver.go",
"chars": 4316,
"preview": "package ftp\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\tstdpath \"path\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\""
},
{
"path": "drivers/ftp/meta.go",
"chars": 946,
"preview": "package ftp\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/inter"
},
{
"path": "drivers/ftp/types.go",
"chars": 12,
"preview": "package ftp\n"
},
{
"path": "drivers/ftp/util.go",
"chars": 849,
"preview": "package ftp\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/pkg/singleflight\"\n\t\"github.com/jl"
},
{
"path": "drivers/github/driver.go",
"chars": 25428,
"preview": "package github\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\tstdpath \"path\"\n\t\"strings\"\n\t\"sync\"\n\t\"tex"
},
{
"path": "drivers/github/meta.go",
"chars": 1953,
"preview": "package github\n\nimport (\n\t\"github.com/OpenListTeam/OpenList/v4/internal/driver\"\n\t\"github.com/OpenListTeam/OpenList/v4/in"
},
{
"path": "drivers/github/types.go",
"chars": 2625,
"preview": "package github\n\nimport (\n\t\"time\"\n\n\t\"github.com/OpenListTeam/OpenList/v4/internal/model\"\n\t\"github.com/OpenListTeam/OpenLi"
},
{
"path": "drivers/github/util.go",
"chars": 4333,
"preview": "package github\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"text/template\"\n\t\"time\"\n\n\t\"github.com/OpenList"
}
]
// ... and 544 more files (download for full content)
About this extraction
This page contains the full source code of the OpenListTeam/OpenList GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 744 files (3.2 MB), approximately 873.5k tokens, and a symbol index with 6685 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.