Compare commits

...

56 Commits

Author SHA1 Message Date
29918ac866 update wps302 worker url 2025-11-12 21:47:50 +08:00
336386d8d0 Update README 2025-11-10 10:49:26 +08:00
512b7b29ea 将获取 git releases 独立出托管到 Github 2025-11-10 10:46:29 +08:00
348f431f0e update apt-ftparchive release 2025-11-09 22:43:15 +08:00
d87ed92313 refactor: list page 2025-11-07 00:06:42 +08:00
e23a8d7b5b style: update 2025-11-06 15:31:49 +08:00
d35b529623 add eudic 2025-11-04 15:17:41 +08:00
02819b059c add remotedesktopmanager repo 2025-11-03 20:33:46 +08:00
f48875195e fix: 修正 Packages 字段提取 2025-11-03 20:33:41 +08:00
7859b53c05 add wezterm repo 2025-11-03 20:33:33 +08:00
c70a16716b fix: 修改 Packages 分割方式 2025-11-03 20:33:24 +08:00
eaa8612e46 fix splayer 2025-10-25 19:21:36 +08:00
438c5b13e2 fix winboat: remove nonexistent arm64 2025-10-15 10:59:36 +08:00
9ba888d117 add freedownloadmanager repo 2025-10-15 10:36:00 +08:00
a79e12567b fix spotify-client 2025-10-15 10:33:07 +08:00
fbe96f5d1c update mihomo 2025-10-15 10:29:22 +08:00
493206345a fix sunloginclient 2025-10-15 10:28:50 +08:00
dcf20c7d73 style: update merge-apt-repo.py 2025-10-11 17:04:44 +08:00
a0b6e71f9a add yesplaymusic 2025-10-11 17:04:44 +08:00
9f0e777b8c update wps-office description 2025-10-11 17:04:44 +08:00
244baa9b43 revert: remove debiancn repo, restore wps-office 2025-10-11 17:04:44 +08:00
dd20b9d61b add simplenote 2025-10-06 18:31:08 +08:00
b22e44a5f2 add fooyin 2025-10-06 18:31:08 +08:00
ad69be984e add spotify-client repo 2025-10-06 18:31:06 +08:00
6f78561e7a add anydesk repo 2025-10-06 18:59:39 +08:00
a1de16fe6d add chrome-remote-desktop repo 2025-10-06 18:59:33 +08:00
bb904cfe61 add winboat 2025-09-29 18:30:08 +08:00
831672957a update splayer 2025-09-27 20:12:51 +08:00
3ce949af99 update qqmusic 2025-09-27 20:12:50 +08:00
f8ad5d523a refactor: save packages info to file 2025-09-27 20:12:50 +08:00
611e165f5d fix: limit the number of parameters 2025-09-27 20:12:50 +08:00
14d95b7492 add mqttx 2025-09-27 20:12:50 +08:00
89ef8d2602 update linuxqq 2025-09-20 22:10:07 +08:00
09e615e123 add kali-undercover 2025-06-26 10:54:03 +08:00
e2828ab4fa add tinyrdm 2025-06-26 10:46:05 +08:00
5e8559b1c8 add spark-store 2025-06-26 10:43:32 +08:00
51a7d954e6 feat: Support for Git hosting sites like Github 2025-06-26 10:40:31 +08:00
251b5233c5 update bytedance-feishu-stable 2025-06-11 19:34:51 +08:00
5c7c12e93e add splayer 2025-05-22 00:37:48 +08:00
868091a502 add joplin 2025-05-22 00:37:33 +08:00
c420ab12b9 chore: add Dockerfile 2025-05-14 18:45:06 +08:00
015dfbd099 refactor: use apt_pkg replace dpkg for version comparison 2025-05-14 00:42:05 +08:00
60588bd38e add neovide, himalaya repo; remove black-desk repo 2025-05-09 12:12:14 +08:00
de9fae4414 add arm64 version of flclash 2025-05-01 10:18:35 +08:00
91f098d89f refactor: change repo format to official archive 2025-04-14 16:24:51 +08:00
8ee3d3012f feat: add archive packages 2025-04-14 16:16:54 +08:00
ce763130ca add gitea 2025-04-12 18:31:05 +08:00
9ef1dac6c9 add tdappdesktop 2025-04-12 00:30:44 +08:00
375316d7fc update com.alibabainc.dingtalk 2025-04-10 23:17:29 +08:00
ef98dfccb4 docs: update README 2025-04-05 15:17:34 +08:00
ded24d423d add dbeaver-ce 2025-04-05 14:51:43 +08:00
f5d1007bd9 add code-server 2025-04-05 14:47:53 +08:00
14a53edd22 update firefox 2025-04-04 15:48:37 +08:00
62bfab323c update neovim 2025-04-04 15:48:37 +08:00
2643348df9 refactor: github releases, arch name, multithreading
rewrite github downloader and configuration to store version tag in sqlite.
change 'version_tag' to 'releases_tag', 'stripped_version' to 'version'.
add 'all' arch, change 'x86_64' to 'amd64'.
add multithreading for downloader.
rename init_deb.py to init-deb.py
2025-04-04 15:48:37 +08:00
07d25c28c7 feat: add gen-list-html.py 2025-02-22 21:38:11 +08:00
34 changed files with 669 additions and 456 deletions

5
.gitignore vendored
View File

@ -1,3 +1,6 @@
data/github-local.json
data/deb.db
deb/
*.deb
*Packages
*Release*
__pycache__/

17
Dockerfile Normal file
View File

@ -0,0 +1,17 @@
FROM debian:12-slim
RUN apt-get update && \
apt-get install -y --no-install-recommends \
apt-utils \
python3-apt \
python3-requests \
curl \
jq \
gpg \
gpg-agent && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
WORKDIR /mnt
CMD ["/bin/bash"]

100
README.md
View File

@ -1,36 +1,41 @@
# wcbing APT 软件源/仓库
适用于 Debian-based 发行版Debian/Ubuntu/Mint/...)的 APT 软件源/仓库,收集一些国内常用软件的二进制包。
适用于 Debian-based 发行版Debian/Ubuntu/Mint/...)的 APT 软件源/仓库,收集一些常用软件的二进制包。
本仓库仅提供链接重定向功能,致力于在不改动 APT 的情况下实现类似 WinGet、Homebrew Cask 等仅提供仓库索引的效果。
## 特色功能
- 本仓库仅提供链接重定向功能,在不改动 APT 的情况下实现了类似 WinGet、Homebrew Cask 等仅提供仓库索引的效果,确保了来源的安全可靠并规避了分发二进制文件可能导致的版权风险。
- 添加国内常用软件,更适合中国用户使用。
- 支持 AppStream实验性可以与你喜欢的图形软件商店如 GNOME Software、KDE Plasma Discover结合使用。
## 使用现有仓库
## 使用仓库
[现有仓库实例](https://packages.wcbing.top/deb/)查看使用方法。
点击 [现有仓库实例](https://packages.wcbing.top/deb/) 查看,里面有使用方法和[仓库内容列表](https://packages.wcbing.top/deb/list/)
## 收录的软件说明
- 现主要服务 x86_64 用户,同时实验性支持 arm64。
如有需要请参考最后一节自行建立仓库。
- 主要收录官方打包发布的文件,不接受第三方自行打包的商业软件
- 非开源、商业软件只收录官方打包发布的文件,不接受第三方自行打包的。
- 有固定的更新地址,如官网、官方仓库或 Github Releases。
- 不收录打包的 wine 应用、Android 应用。
- 不收录图标、主题、字体等包,以后可能单独建一个相关仓库。
- 不收录图标、主题、字体等包,这些单独建一个相关仓库。
## 已收录软件
## 部分已收录软件
### 自行收集
### 部分自行收集软件
| 软件名 | 包名 | amd64 | arm64 |
| ----- | ---- | ----- | ----- |
| [QQ](https://im.qq.com/linuxqq/) | linuxqq | ✅ | ✅ |
| [QQ音乐](https://y.qq.com/download/download.html) | qqmusic | ✅ | |
| [腾讯会议](https://meeting.tencent.com/download/) | wemeet | ✅ | ✅ |
| [腾讯文档](https://docs.qq.com/home/download) | tdappdesktop | ✅ | ✅ |
| [WPS Office](https://linux.wps.cn/) | wps-office | ✅ | |
| [百度网盘](https://pan.baidu.com/download) | baidunetdisk | ✅ | |
| [钉钉](https://www.dingtalk.com/download/) | com.alibabainc.dingtalk | ✅ | |
| [飞书](https://www.feishu.cn/download) | bytedance-feishu-stable | ✅ | |
| [钉钉](https://www.dingtalk.com/download/) | com.alibabainc.dingtalk | ✅ | |
| [飞书](https://www.feishu.cn/download) | bytedance-feishu-stable | ✅ | |
| [Xmind](https://xmind.cn/download/) | xmind-vana | ✅ | |
| [uTools](https://u.tools/download/) | utools | ✅ | |
| [360安全浏览器](https://browser.360.net/gc/) | browser360-cn-stable | ✅ | |
@ -38,56 +43,47 @@
| [向日葵](https://sunlogin.oray.com/download/linux) | sunloginclient<br />提取自 Debian 12 的依赖:<br />gconf2-common<br />libgconf-2-4 | ✅ | |
| [ToDesk](https://www.todesk.com/linux.html) | todesk | ✅ | |
| [微信](https://linux.weixin.qq.com/) | wechat | ✅ | ✅ |
| [kali-undercover](https://www.kali.org/docs/introduction/kali-undercover/) | kali-undercover | ✅ | ✅ |
| [欧路词典](https://www.eudic.net/v4/en/app/download) | eudic | ✅ | |
### Github Releses
### Git Releses to APT Repo
> 因服务器资源有限,本仓库可能无法收录部分大文件。
> 有收录需求也可投稿至星火商店的 [Github Releases 更新配置仓库](https://gitee.com/spark-building-service/github),其和本部分内容是同源的
详细请看:[Git Releases to APT Repo](https://github.com/wcbing-build/git-releases-to-apt-repo)
一个将 Git Releases 转换为 APT 仓库的 repo适用于各种有兼容 Github Releases 功能的代码托管平台
| 软件名 | 包名 | amd64 | arm64 |
| ----- | ---- | ----- | ----- |
| [Clash Verge Rev](https://github.com/clash-verge-rev/clash-verge-rev/releases) | clash-verge | ✅ | ✅ |
| [FlClash](https://github.com/chen08209/FlClash/releases) | flclash | ✅ | |
| [mihomo](https://github.com/MetaCubeX/mihomo/releases) | mihomo | ✅ | ✅ |
| [hugo](https://github.com/gohugoio/hugo/releases) | hugo | ✅ | ✅ |
| [RustDesk](https://github.com/rustdesk/rustdesk/releases) | rustdesk | ✅ | ✅ |
| [Obsidian](https://github.com/obsidianmd/obsidian-releases/releases) | obsidian | ✅ | |
| [Foliate](https://github.com/johnfactotum/foliate/releases) | foliate | ✅ | ✅ |
| [Tabby](https://github.com/Eugeny/tabby/releases) | tabby-terminal | ✅ | ✅ |
| [Pandoc](https://github.com/jgm/pandoc/releases) | pandoc | ✅ | ✅ |
| [LocalSend](https://github.com/localsend/localsend/releases) | localsend | ✅ | ✅ |
| [Motrix](https://github.com/agalwood/Motrix/releases) | motrix | ✅ | ✅ |
| [PeaZip](https://github.com/peazip/PeaZip/releases) | peazip | ✅ | |
| [Neovim/Nvim](https://github.com/neovim/neovim-releases/releases) | neovim | ✅ | |
| [Hiddify](https://github.com/hiddify/hiddify-app/releases) | hiddify | ✅ | |
| [Cloudflare Tunnel](https://github.com/cloudflare/cloudflared/releases) | cloudflared | ✅ | ✅ |
| [Caddy](https://github.com/caddyserver/caddy/releases) | caddy | ✅ | ✅ |
### 合并自官方 repo
### 合并自现有官方仓库
| 软件仓库 | 包名 | amd64 | arm64 |
| ------ | ---- | ----- | ----- |
|Mozilla Firefox|firefox<br />firefox_beta<br />firefox_devedition<br />firefox_esr<br />firefox_nightly<br />mozillavpn| ✅ | ✅<br />官方仅提供<br />firefox_nightly |
|Google Chrome|google-chrome-stable<br />google-chrome-beta<br />google-chrome-unstable| ✅ | |
|Google Earth|google-earth-pro-stable<br />google-earth-ec-stable| ✅ | |
|Microsoft Edge|microsoft-edge-stable<br />microsoft-edge-beta<br />microsoft-edge-dev| ✅ | |
|Opera|opera-stable<br />opera-beta<br />opera-developer| ✅ | |
|Visual Studio Code|code<br />code-insiders<br />code-exploration| ✅ | ✅ |
|termius|termius-app<br />termius-beta| ✅ | |
|Sublime Text<br />Sublime Merge|sublime-text<br />sublime-merge| ✅ | ✅ |
|Steam|steam-launcher<br />steam-libs-amd64| ✅ | |
|Tailscale|tailscale<br />tailscale-nginx-auth| ✅ | ✅ |
|[black-desk 打包](https://github.com/black-desk/debs)|app.typst.typst<br />dev.neovide.neovide<br />dev.zed.zed<br />dev.zed.zed-pre<br />~~io.github.black-desk.debian-tweak<br />io.neovim.neovim<br />io.neovim.neovim-nightly<br />one.metacubex.clash-meta~~<br />org.pimalaya.himalaya| ✅ | |
|Typora|typora| ✅ | ✅ |
|Zotero|zotero<br />zotero-beta<br />zotero6| ✅ | |
|Github CLI|gh| ✅ | ✅ |
|[dufs: wcbing 打包](https://github.com/wcbing-build/dufs-debs)|dufs| ✅ | ✅ |
|[frp: wcbing 打包](https://github.com/wcbing-build/frp-debs)|frps<br />frpc| ✅ | ✅ |
|[lazydocker: wcbing 打包](https://github.com/wcbing-build/lazydocker-debs)|lazydocker| ✅ | ✅ |
|[lazygit: wcbing 打包](https://github.com/wcbing-build/lazygit-debs)|lazygit| ✅ | ✅ |
|[NextTrace](https://github.com/nxtrace/nexttrace-debs)|nexttrace| ✅ | ✅ |
|Debian 中文社区软件源|anydesk<br />marktext<br />wps-office<br />[更多](https://github.com/debiancn/repo)| ✅ | |
| [Mozilla Firefox](https://support.mozilla.org/zh-CN/kb/install-firefox-linux) | firefox<br />firefox_beta<br />firefox_devedition<br />firefox_nightly<br />firefox_esr<br />mozillavpn | ✅ | ✅ |
| Google Chrome | google-chrome-stable<br />google-chrome-beta<br />google-chrome-unstable | ✅ | |
| Google Earth | google-earth-pro-stable<br />google-earth-ec-stable | ✅ | |
| Chrome Remote Desktop | chrome-remote-desktop | ✅ | |
| Microsoft Edge | microsoft-edge-stable<br />microsoft-edge-beta<br />microsoft-edge-dev | ✅ | |
| Opera | opera-stable<br />opera-beta<br />opera-developer | ✅ | |
| Visual Studio Code | code<br />code-insiders<br />code-exploration | ✅ | ✅ |
| termius | termius-app<br />termius-beta | ✅ | |
| [Sublime Text<br />Sublime Merge](https://www.sublimetext.com/docs/linux_repositories.html) | sublime-text<br />sublime-merge | ✅ | ✅ |
| [Steam](https://repo.steampowered.com/steam/) | steam-launcher<br />steam-libs-amd64 | ✅ | |
| [Tailscale](https://pkgs.tailscale.com/stable/) | tailscale<br />tailscale-nginx-auth | ✅ | ✅ |
| [neovide: wcbing 打包](https://github.com/wcbing-build/neovide-debs) | neovide | ✅ | |
| [himalaya: wcbing 打包](https://github.com/wcbing-build/himalaya-debs) | himalaya | ✅ | ✅ |
| [Typora](https://typora.io/#linux) | typora | ✅ | ✅ |
| [Zotero](https://zotero.retorque.re/file/apt-package-archive/index.html) | zotero<br />zotero-beta<br />zotero6 | ✅ | |
| [Github CLI](https://cli.github.com/) | gh | ✅ | ✅ |
| [dufs: wcbing 打包](https://github.com/wcbing-build/dufs-debs) | dufs | ✅ | ✅ |
| [frp: wcbing 打包](https://github.com/wcbing-build/frp-debs) | frps<br />frpc | ✅ | ✅ |
| [lazydocker: wcbing 打包](https://github.com/wcbing-build/lazydocker-debs) | lazydocker | ✅ | ✅ |
| [lazygit: wcbing 打包](https://github.com/wcbing-build/lazygit-debs) | lazygit | ✅ | ✅ |
| [NextTrace](https://github.com/nxtrace/nexttrace-debs) | nexttrace | ✅ | ✅ |
| [Gitea](https://gitlab.com/packaging/gitea)[镜像](https://mirrors.ustc.edu.cn/help/packaging-gitea.html) | gitea | ✅ | ✅ |
| [AnyDesk](https://deb.anydesk.com/howto.html) | anydesk | ✅ | ✅ |
| [Spotify](https://www.spotify.com/sg-zh/download/linux/) | spotify-client | ✅ | |
| [Free Download Manager](https://www.freedownloadmanager.org/zh/download-fdm-for-linux.htm) | freedownloadmanager | ✅ | |
| [WezTerm](https://wezterm.org/install/linux.html#using-the-apt-repo) | wezterm<br />wezterm-nightly | ✅ | ✅ |
| [Remote Desktop Manager](https://docs.devolutions.net/rdm/installation/client/?tab=linux) | remotedesktopmanager | ✅ | ✅ |
## 自建仓库

View File

@ -2,9 +2,18 @@
import subprocess
import os
import sqlite3
import sys
import logging
import re
from threading import Lock
DEB_BASE_DIR = "deb"
PACKAGES_DIR = "packages"
DB_DIR = "data"
USER_AGENT = "Debian APT-HTTP/1.3 (3.0.3)" # from Debian 13
version_lock = Lock()
base_dir = "deb"
logging.basicConfig(
format="%(asctime)s %(message)s",
datefmt="%Y/%m/%d %H:%M:%S",
@ -12,69 +21,95 @@ logging.basicConfig(
)
def download(url):
file_dir = os.path.join(base_dir, os.path.dirname(url))
if not os.path.exists(file_dir):
os.makedirs(file_dir)
file_path = os.path.join(base_dir, url.split("?")[0])
# 用 curl 模拟 apt 下载文件User-Agent 来自 Debian 12
subprocess.run(
[
"curl",
"-H",
"User-Agent: Debian APT-HTTP/1.3 (2.6.1)",
"-fsLo",
file_path,
url,
]
def download(url, file_path) -> bool:
"""Download file using curl with APT User-Agent."""
curl_process = subprocess.run(
["curl", "-H", f"User-Agent: {USER_AGENT}", "-fsLo", file_path, url]
)
if curl_process.returncode or not os.path.exists(file_path):
logging.error(f"Failed to download {url}")
return False
return True
def scan(name, arch, url, file_path) -> bool:
scan_process = subprocess.run(
["apt-ftparchive", "packages", file_path], capture_output=True
)
package = scan_process.stdout.decode()
package = re.sub(
r"^(Filename: ).*", f"\\1{url}", package, flags=re.MULTILINE
) # 替换 Filename 开头的行
package_file_path = os.path.join(PACKAGES_DIR, arch, f"{name}.package")
try:
with open(package_file_path, "w") as f:
f.write(package)
return True
except IOError as e:
logging.error(f"Failed to write package file for {name}: {e}")
return False
def check_download(name, version, url, arch):
"""Check and handle package download/update."""
logging.info("%s:%s = %s", name, arch, version)
# connect to db
with sqlite3.connect(os.path.join("data", f"{base_dir}.db")) as conn:
cur = conn.cursor()
res = cur.execute(
f"SELECT version, url FROM {arch} WHERE name = ?", (name,)
).fetchall()
if len(res):
local_version = res[0][0]
local_url = res[0][1]
if local_version != version:
file_path = os.path.join(DEB_BASE_DIR, arch, f"{name}_{version}_{arch}.deb")
local_version = None
db_path = os.path.join(DB_DIR, f"{DEB_BASE_DIR}.db")
# get local version
with version_lock, sqlite3.connect(db_path) as conn:
res = conn.execute(
f"SELECT version FROM '{arch}' WHERE name = ?", (name,)
).fetchone()
if res:
local_version = res[0]
if local_version == version:
return
# download and scan
logging.info(f"Downloading {name}:{arch} ({version})")
os.makedirs(os.path.join(DEB_BASE_DIR, arch), exist_ok=True)
if not download(url, file_path):
return
logging.info(f"Downloaded {name}:{arch} ({version})")
os.makedirs(os.path.join(PACKAGES_DIR, arch), exist_ok=True)
if not scan(name, arch, url, file_path):
return
if res:
print(f"Update: {name}:{arch} ({local_version} -> {version})")
download(url)
# wirte to db
cur.execute(
f"UPDATE {arch} SET version = ?, url = ? WHERE name = ?",
# update database
with version_lock, sqlite3.connect(db_path) as conn:
conn.execute(
f"UPDATE '{arch}' SET version = ?, url = ? WHERE name = ?",
(version, url, name),
)
conn.commit()
# remove old version
if local_url != url: # 针对固定下载链接
old_file_path = os.path.join(base_dir, local_url.split("?")[0])
old_file_path = os.path.join(DEB_BASE_DIR, f"{name}_{local_version}_{arch}.deb")
if os.path.exists(old_file_path):
os.remove(old_file_path)
else:
print(f"AddNew: {name}:{arch} ({version})")
download(url)
# wirte to db
cur.execute(
f"INSERT INTO {arch}(name, version, url) VALUES (?, ?, ?)",
# update database
with version_lock, sqlite3.connect(db_path) as conn:
conn.execute(
f"INSERT INTO '{arch}'(name, version, url) VALUES (?, ?, ?)",
(name, version, url),
)
conn.commit()
if __name__ == "__main__":
args = os.sys.argv
args = sys.argv
if len(args) == 5:
check_download(args[1], args[2], args[3], args[4])
elif len(args) == 4:
check_download(args[1], args[2], args[3], "x86_64")
check_download(*args[1:])
elif len(args) > 1:
logging.error(f"Unknown Args: {args[1:]}")
else:
print(f"Usage: {args[0]} <package_name> <version> <url> [arch]")
print(f"Usage: {args[0]} <package_name> <version> <url> <arch>")
print("options:")
print(" arch: x86_64, arm64. default is x86_64")
print(" arch: amd64, arm64, all.")

View File

@ -1,108 +0,0 @@
{
"clash-verge": {
"repo": "clash-verge-rev/clash-verge-rev",
"file_list": [
"Clash.Verge_{stripped_version}_amd64.deb",
"Clash.Verge_{stripped_version}_arm64.deb"
]
},
"mihomo": {
"repo": "MetaCubeX/mihomo",
"file_list": [
"mihomo-linux-amd64-compatible-{version_tag}.deb",
"mihomo-linux-arm64-{version_tag}.deb"
]
},
"flclash": {
"repo": "chen08209/FlClash",
"file_list": [
"FlClash-{stripped_version}-linux-amd64.deb"
]
},
"hugo": {
"repo": "gohugoio/hugo",
"file_list": [
"hugo_extended_{stripped_version}_linux-amd64.deb",
"hugo_extended_{stripped_version}_linux-arm64.deb"
]
},
"rustdesk": {
"repo": "rustdesk/rustdesk",
"file_list": [
"rustdesk-{version_tag}-x86_64.deb",
"rustdesk-{version_tag}-aarch64.deb"
]
},
"obsidian": {
"repo": "obsidianmd/obsidian-releases",
"file_list": [
"obsidian_{stripped_version}_amd64.deb"
]
},
"tabby": {
"repo": "Eugeny/tabby",
"file_list": [
"tabby-{stripped_version}-linux-x64.deb",
"tabby-{stripped_version}-linux-arm64.deb"
]
},
"pandoc": {
"repo": "jgm/pandoc",
"file_list": [
"pandoc-{version_tag}-1-amd64.deb",
"pandoc-{version_tag}-1-arm64.deb"
]
},
"localsend": {
"repo": "localsend/localsend",
"file_list": [
"LocalSend-{stripped_version}-linux-x86-64.deb",
"LocalSend-{stripped_version}-linux-arm-64.deb"
]
},
"motrix": {
"repo": "agalwood/Motrix",
"file_list": [
"Motrix_{stripped_version}_amd64.deb",
"Motrix_{stripped_version}_arm64.deb"
]
},
"peazip": {
"repo": "peazip/PeaZip",
"file_list": [
"peazip_{version_tag}.LINUX.GTK2-1_amd64.deb"
]
},
"neovim": {
"repo": "neovim/neovim-releases",
"file_list": [
"nvim-linux64.deb"
]
},
"hiddify": {
"repo": "hiddify/hiddify-app",
"file_list": [
"Hiddify-Debian-x64.deb"
]
},
"cloudflared": {
"repo": "cloudflare/cloudflared",
"file_list": [
"cloudflared-linux-amd64.deb",
"cloudflared-linux-arm64.deb"
]
},
"caddy": {
"repo": "caddyserver/caddy",
"file_list": [
"caddy_{stripped_version}_linux_amd64.deb",
"caddy_{stripped_version}_linux_arm64.deb"
]
},
"foliate": {
"repo": "johnfactotum/foliate",
"file_list": [
"foliate_{version_tag}_all.deb"
]
}
}

View File

@ -1,106 +1,177 @@
[
{
"name": "google-chrome",
"repo": "https://dl.google.com/linux/chrome/deb/",
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz"
},
{
"name": "google-earth",
"repo": "https://dl.google.com/linux/earth/deb/",
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz"
},
{
"name": "termius",
"repo": "https://deb.termius.com/",
"amd64_path": "dists/squeeze/main/binary-amd64/Packages.gz"
},
{
"name": "steam",
"repo": "https://repo.steampowered.com/steam/",
"amd64_path": "dists/stable/steam/binary-amd64/Packages.gz"
},
{
"name": "firefox",
"repo": "https://packages.mozilla.org/apt/",
"amd64_path": "dists/mozilla/main/binary-amd64/Packages",
"arm64_path": "dists/mozilla/main/binary-arm64/Packages"
},
{
"name": "microsoft-edge",
"repo": "https://packages.microsoft.com/repos/edge/",
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz"
},
{
"name": "opera-stable",
"repo": "https://deb.opera.com/opera-stable/",
"amd64_path": "dists/stable/non-free/binary-amd64/Packages.gz"
},
{
"name": "code",
"repo": "https://packages.microsoft.com/repos/code/",
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz",
"arm64_path": "dists/stable/main/binary-arm64/Packages.gz"
},
{
"name": "tailscale",
"repo": "https://pkgs.tailscale.com/stable/debian/",
"amd64_path": "dists/sid/main/binary-amd64/Packages.gz",
"arm64_path": "dists/sid/main/binary-arm64/Packages.gz"
},
{
"name": "sublime",
"repo": "https://download.sublimetext.com/",
"mix_path": "apt/stable/Packages.gz"
},
{
"name": "black-desk",
"repo": "https://github.com/black-desk/debs/releases/latest/download/",
"amd64_path": "Packages"
},
{
"name": "typora",
"repo": "https://typoraio.cn/linux/",
"mix_path": "Packages.gz"
},
{
"name": "zotero",
"repo": "https://zotero.retorque.re/file/apt-package-archive/",
"amd64_path": "Packages"
},
{
"name": "gh",
"repo": "https://cli.github.com/packages/",
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz",
"arm64_path": "dists/stable/main/binary-arm64/Packages.gz"
},
{
"name": "dufs",
"repo": "https://github.com/wcbing-build/dufs-debs/releases/latest/download/",
"mix_path": "Packages"
},
{
"name": "frp",
"repo": "https://github.com/wcbing-build/frp-debs/releases/latest/download/",
"mix_path": "Packages"
},
{
"name": "lazydocker",
"repo": "https://github.com/wcbing-build/lazydocker-debs/releases/latest/download/",
"mix_path": "Packages"
},
{
"name": "lazygit",
"repo": "https://github.com/wcbing-build/lazygit-debs/releases/latest/download/",
"mix_path": "Packages"
},
{
"name": "nexttrace",
"repo": "https://github.com/nxtrace/nexttrace-debs/releases/latest/download/",
"mix_path": "Packages"
},
{
"name": "debiancn",
"repo": "https://mirrors.cernet.edu.cn/debiancn/",
"amd64_path": "dists/bookworm/main/binary-amd64/Packages.gz"
{
"git-releases": {
"repo": "",
"path": {
"mix": "https://github.com/wcbing-build/git-releases-to-apt-repo/releases/latest/download/Packages"
}
]
},
"google-chrome": {
"repo": "https://dl.google.com/linux/chrome/deb/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz"
}
},
"google-earth": {
"repo": "https://dl.google.com/linux/earth/deb/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz"
}
},
"chrome-remote-desktop": {
"repo": "https://dl.google.com/linux/chrome-remote-desktop/deb/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz"
}
},
"termius": {
"repo": "https://deb.termius.com/",
"path": {
"amd64": "dists/squeeze/main/binary-amd64/Packages.gz"
}
},
"steam": {
"repo": "https://repo.steampowered.com/steam/",
"path": {
"amd64": "dists/stable/steam/binary-amd64/Packages.gz"
}
},
"firefox": {
"repo": "https://packages.mozilla.org/apt/",
"path": {
"amd64": "dists/mozilla/main/binary-amd64/Packages",
"arm64": "dists/mozilla/main/binary-arm64/Packages"
}
},
"microsoft-edge": {
"repo": "https://packages.microsoft.com/repos/edge/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz"
}
},
"opera-stable": {
"repo": "https://deb.opera.com/opera-stable/",
"path": {
"amd64": "dists/stable/non-free/binary-amd64/Packages.gz"
}
},
"code": {
"repo": "https://packages.microsoft.com/repos/code/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz",
"arm64": "dists/stable/main/binary-arm64/Packages.gz"
}
},
"tailscale": {
"repo": "https://pkgs.tailscale.com/stable/debian/",
"path": {
"amd64": "dists/sid/main/binary-amd64/Packages.gz",
"arm64": "dists/sid/main/binary-arm64/Packages.gz"
}
},
"sublime": {
"repo": "https://download.sublimetext.com/",
"path": {
"mix": "apt/stable/Packages.gz"
}
},
"typora": {
"repo": "https://typoraio.cn/linux/",
"path": {
"mix": "Packages.gz"
}
},
"zotero": {
"repo": "https://zotero.retorque.re/file/apt-package-archive/",
"path": {
"amd64": "Packages"
}
},
"gh": {
"repo": "https://cli.github.com/packages/",
"path": {
"amd64": "dists/stable/main/binary-amd64/Packages.gz",
"arm64": "dists/stable/main/binary-arm64/Packages.gz"
}
},
"dufs": {
"repo": "https://github.com/wcbing-build/dufs-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"frp": {
"repo": "https://github.com/wcbing-build/frp-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"lazydocker": {
"repo": "https://github.com/wcbing-build/lazydocker-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"lazygit": {
"repo": "https://github.com/wcbing-build/lazygit-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"nexttrace": {
"repo": "https://github.com/nxtrace/nexttrace-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"gitea": {
"repo": "https://mirrors.ustc.edu.cn/packaging-gitea/",
"path": {
"amd64": "dists/gitea/main/binary-amd64/Packages",
"arm64": "dists/gitea/main/binary-arm64/Packages"
}
},
"neovide": {
"repo": "https://github.com/wcbing-build/neovide-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"himalaya": {
"repo": "https://github.com/wcbing-build/himalaya-debs/releases/latest/download/",
"path": {
"mix": "Packages"
}
},
"anydesk": {
"repo": "https://deb.anydesk.com/",
"path": {
"amd64": "dists/all/main/binary-amd64/Packages",
"arm64": "dists/all/main/binary-arm64/Packages"
}
},
"spotify-client": {
"repo": "https://repository.spotify.com/",
"path": {
"amd64": "dists/stable/non-free/binary-amd64/Packages"
}
},
"freedownloadmanager": {
"repo": "https://debrepo.freedownloadmanager.org/",
"path": {
"amd64": "dists/jammy/main/binary-amd64/Packages.gz"
}
},
"wezterm": {
"repo": "https://apt.fury.io/wez/",
"path": {
"mix": "Packages"
}
},
"remotedesktopmanager": {
"repo": "https://dl.cloudsmith.io/public/devolutions/rdm/deb/debian/",
"path": {
"amd64": "dists/trixie/main/binary-amd64/Packages.gz",
"arm64": "dists/trixie/main/binary-arm64/Packages.gz"
}
}
}

View File

@ -0,0 +1,9 @@
APT::FTPArchive::Release {
Origin "wcbing APT Repo";
Label "wcbing APT Repo";
Suite "wcbing";
Codename "wcbing";
Architectures "amd64 arm64";
Components "main";
Description "wcbing APT Repo || wcbing 的 APT 仓库";
}

View File

@ -1,6 +1,6 @@
JSON=$(curl -s "https://pan.baidu.com/disk/cmsdata?do=client")
VERSION=$(echo $JSON | jq -r ".linux.version" | cut -d "V" -f 2)
X64_URL=$(echo $JSON | jq -r ".linux.url_1")
AMD64_URL=$(echo $JSON | jq -r ".linux.url_1")
./check_downloader.py baidunetdisk $VERSION $X64_URL
./check_downloader.py baidunetdisk $VERSION $AMD64_URL amd64

View File

@ -1,6 +1,6 @@
JSON=$(curl -s https://active.browser.360.net/api/v1/web-version)
VERSION=$(echo $JSON | jq -r ".data.web_version")
X64_URL="https://gedown.360safe.com/gc/browser360-cn-stable_"$VERSION"-1_amd64.deb"
AMD64_URL="https://gedown.360safe.com/gc/browser360-cn-stable_"$VERSION"-1_amd64.deb"
./check_downloader.py browser360-cn-stable $VERSION $X64_URL
./check_downloader.py browser360-cn-stable $VERSION $AMD64_URL amd64

View File

@ -1,8 +1,12 @@
X64_JSON=$(curl -s "https://www.feishu.cn/api/package_info?platform=10")
# arm64 https://www.feishu.cn/api/package_info?platform=12
VERSIONS_JSON=$(curl -fs "https://www.feishu.cn/api/downloads")
# AMD64
# "version_number": "Linux-x64-deb@V7.22.9"
VERSION=$(echo $X64_JSON | jq -r ".data.version_number" | cut -d '@' -f 2)
X64_URL=$(echo $X64_JSON | jq -r ".data.download_link")
AMD64_VERSION=$(echo $VERSIONS_JSON | jq -r ".versions.Linux_deb_x64.version_number" | cut -d 'V' -f 2)
AMD64_URL=$(echo $VERSIONS_JSON | jq -r ".versions.Linux_deb_x64.download_link")
./check_downloader.py bytedance-feishu-stable $AMD64_VERSION $AMD64_URL amd64
./check_downloader.py bytedance-feishu-stable $VERSION $X64_URL
# ARM64
ARM64_VERSION=$(echo $VERSIONS_JSON | jq -r ".versions.Linux_deb_arm.version_number" | cut -d 'V' -f 2)
ARM64_URL=$(echo $VERSIONS_JSON | jq -r ".versions.Linux_deb_arm.download_link")
./check_downloader.py bytedance-feishu-stable $ARM64_VERSION $ARM64_URL arm64

View File

@ -1,4 +1,7 @@
X64_URL=$(curl -sw %{redirect_url} https://www.dingtalk.com/win/d/qd=linux_amd64)
VERSION=$(echo $X64_URL | cut -d '/' -f 8| cut -d '_' -f 2)
AMD64_URL=$(curl -sw %{redirect_url} https://www.dingtalk.com/win/d/qd=linux_amd64)
VERSION=$(echo $AMD64_URL | sed 's#.*/##g' | cut -d '_' -f 2)
./check_downloader.py com.alibabainc.dingtalk $VERSION $AMD64_URL amd64
./check_downloader.py com.alibabainc.dingtalk $VERSION $X64_URL
ARM64_URL=$(curl -sw %{redirect_url} https://www.dingtalk.com/win/d/qd=linux_arm64)
VERSION=$(echo $ARM64_URL | sed 's#.*/##g' | cut -d '_' -f 2)
./check_downloader.py com.alibabainc.dingtalk $VERSION $ARM64_URL arm64

View File

@ -1,7 +1,7 @@
X64_URL=$(curl -sI "https://dida365.com/static/getApp/download?type=linux_deb_x64" | grep location | cut -d ' ' -f 2 | tr -d '\r')
AMD64_URL=$(curl -sI "https://dida365.com/static/getApp/download?type=linux_deb_x64" | grep location | cut -d ' ' -f 2 | tr -d '\r')
# https://cdn.dida365.cn/download/linux/linux_deb_x64/dida-6.0.0-amd64.deb
VERSION=$(echo $X64_URL | cut -d "-" -f 2)
./check_downloader.py dida $VERSION $X64_URL
VERSION=$(echo $AMD64_URL | cut -d "-" -f 2)
./check_downloader.py dida $VERSION $AMD64_URL amd64
# ARM64
ARM64_URL=$(curl -sI "https://dida365.com/static/getApp/download?type=linux_deb_arm64" | grep location | cut -d ' ' -f 2 | tr -d '\r')

7
get/eudic.sh Normal file
View File

@ -0,0 +1,7 @@
WEB_CONTENT=$(curl -s https://www.eudic.net/v4/en/app/download)
AMD64_URL=$(echo $WEB_CONTENT | grep -o 'https://[^"]*\.deb[^"]*')
# https://www.eudic.net/download/eudic.deb?v=2025-08-25
VERSION=$(echo $AMD64_URL | cut -d '=' -f 2)
./check_downloader.py eudic "$VERSION" "$AMD64_URL" amd64

View File

@ -1,8 +1,12 @@
JSON=$(curl -s https://im.qq.com/rainbow/linuxQQDownload | sed -nE 's/.*var params\s*=\s*(\{.*?\});.*/\1/p')
# 正式版参考 https://github.com/flathub/com.qq.QQ/blob/master/com.qq.QQ.yaml
JSON=$(curl -s https://cdn-go.cn/qq-web/im.qq.com_new/latest/rainbow/linuxConfig.js | sed -nE 's/.*var params\s*=\s*(\{.*?\});.*/\1/p')
VERSION=$(echo $JSON | jq -r '.version + "_" + .updateDate')
X64_URL=$(echo $JSON | jq -r '.x64DownloadUrl.deb')
./check_downloader.py linuxqq $VERSION $X64_URL
# 测试版参考 https://bbs.deepin.org/post/279737?offset=1&limit=20&postId=1658175
# AMD64
AMD64_URL=$(echo $JSON | jq -r '.x64DownloadUrl.deb')
./check_downloader.py linuxqq $VERSION $AMD64_URL amd64
# ARM64
ARM64_URL=$(echo $JSON | jq -r '.armDownloadUrl.deb')

View File

@ -1,6 +1,6 @@
WEB_CONTENT=$(curl -s "https://y.qq.com/download/download.html")
VERSION=$(echo $WEB_CONTENT | grep -o "Linux <span class=\"product_list__version\">最新版:[0-9\.]*" | cut -d ':' -f 2)
X64_URL=$(echo $WEB_CONTENT | grep -o "https://[0-9a-z/\._]*amd64\.deb" | head -n 1)
AMD64_URL=$(echo $WEB_CONTENT | grep -o "https://[^\"]*amd64\.deb[^\"]*" | head -n 1)
./check_downloader.py qqmusic $VERSION $X64_URL
./check_downloader.py qqmusic $VERSION $AMD64_URL amd64

View File

@ -1,6 +1,6 @@
JSON=$(curl -fs "https://client-webapi.oray.com/softwares/SUNLOGIN_X_LINUX?x64=1")
VERSION=$(echo "$JSON" | jq -r '.versionno')
X64_URL=$(echo $JSON | jq -r '.downloadurl')
VERSION=$(printf "%s" "$JSON" | jq -r '.versionno')
AMD64_URL=$(printf "%s" "$JSON" | jq -r '.downloadurl')
./check_downloader.py sunloginclient $VERSION $X64_URL
./check_downloader.py sunloginclient $VERSION $AMD64_URL amd64

10
get/tdappdesktop.sh Normal file
View File

@ -0,0 +1,10 @@
# 参考 https://github.com/SpecterShell/Dumplings/blob/main/Tasks/Tencent.TencentDocs/Script.ps1
VERSION=$(curl -fs https://docs.qq.com/api/packageupgrade/update_manual | sed 's/.*"version\\\": \\\"\([0-9.]*\).*/\1/')
BASE_URL="https://desktop.docs.qq.com/update/release/$VERSION/"
AMD64_URL="$BASE_URL"$(curl -fs "$BASE_URL"latest-linux.yml | grep '^path' | cut -d ' ' -f 2)
./check_downloader.py tdappdesktop $VERSION $AMD64_URL amd64
ARM64_URL="$BASE_URL"$(curl -fs "$BASE_URL"latest-linux-arm64.yml | grep '^path' | cut -d ' ' -f 2)
./check_downloader.py tdappdesktop $VERSION $ARM64_URL arm64

View File

@ -1,6 +1,6 @@
X64_URL=$(curl -s https://www.todesk.com/linux.html | grep -o "https://[0-9a-zA-Z_\/\.\-]*.deb" | head -n 1)
# X64_URL=https:/ /dl.todesk.com/linux/todesk-v4.7.2.0-amd64.deb
AMD64_URL=$(curl -s https://www.todesk.com/linux.html | grep -o "https://[0-9a-zA-Z_\/\.\-]*.deb" | head -n 1)
# AMD64_URL=https:/ /dl.todesk.com/linux/todesk-v4.7.2.0-amd64.deb
VERSION=$(echo $X64_URL | cut -d '-' -f 2)
VERSION=$(echo $AMD64_URL | cut -d '-' -f 2)
./check_downloader.py todesk $VERSION $X64_URL
./check_downloader.py todesk $VERSION $AMD64_URL amd64

View File

@ -1,8 +1,8 @@
WEB_CONTENT=$(curl -s "https://www.u-tools.cn/download/")
X64_URL=$(echo $WEB_CONTENT | grep -o "https://[^ ]*amd64\.deb")
AMD64_URL=$(echo $WEB_CONTENT | grep -o "https://[^ ]*amd64\.deb")
# https://open.u-tools.cn/download/utools_5.2.1_amd64.deb
VERSION=$(echo $X64_URL | cut -d '_' -f 2)
VERSION=$(echo $AMD64_URL | cut -d '_' -f 2)
./check_downloader.py utools $VERSION $X64_URL
./check_downloader.py utools $VERSION $AMD64_URL amd64

View File

@ -1,13 +1,13 @@
WEB_CONTENT=$(curl -s "https://linux.weixin.qq.com/")
# X64
X64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*x86_64\.deb')
Last_Modified=$(curl -sI $X64_URL | grep "Last-Modified")
# AMD64
AMD64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*x86_64\.deb')
Last_Modified=$(curl -sI $AMD64_URL | grep "Last-Modified")
# Last-Modified: Wed, 06 Nov 2024 02:08:50 GMT
VERSION=$(echo $Last_Modified | cut -d ' ' -f 3-6 | sed 's/ /-/g')
# 06-Nov-2024-02:08:50
./check_downloader.py wechat $VERSION $X64_URL
./check_downloader.py wechat $VERSION $AMD64_URL amd64
# ARM64
ARM64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*arm64\.deb')

View File

@ -13,8 +13,8 @@ download_list_url="https://meeting.tencent.com/web-service/query-download-info?q
JSON=$(curl -s $download_list_url)
VERSION=$(echo $JSON | jq -r '."info-list"[0].version')
X64_URL=$(echo $JSON | jq -r '."info-list"[0].url')
./check_downloader.py wemeet $VERSION $X64_URL
AMD64_URL=$(echo $JSON | jq -r '."info-list"[0].url')
./check_downloader.py wemeet $VERSION $AMD64_URL amd64
# ARM64
VERSION=$(echo $JSON | jq -r '."info-list"[1].version')

31
get/wps-office.sh Normal file
View File

@ -0,0 +1,31 @@
# decrypt() {
# url=$1
# pathname="/$(echo $url | cut -d '/' -f 4-)"
# secrity_key="7f8faaaa468174dc1c9cd62e5f218a5b"
# timestamp10=$(date '+%s')
# md5hash=$(echo -n "${secrity_key}${pathname}${timestamp10}" | md5sum | cut -d " " -f 1 )
# url="$url?t=${timestamp10}&k=${md5hash}"
# echo $url
# }
# WPS 官网 JS 代码大致逻辑如下:
# function downLoad(url) {
# var urlObj=new URL(url);
# var uri=urlObj.pathname;
# var secrityKey="7f8faaaa468174dc1c9cd62e5f218a5b";
# var timestamp10=Math.floor(new Date().getTime() / 1000);
# var md5hash=CryptoJS.MD5(secrityKey + uri + timestamp10);
# url += '?t=' + timestamp10 + '&k=' + md5hash
# console.log(url);
# }
WEB_CONTENT=$(curl -fs https://linux.wps.cn/)
VERSION=$(echo $WEB_CONTENT | grep -o "<p class=\"banner_txt\">[0-9.]*</p>" | sed 's/<p class=\"banner_txt\">\(.*\)<\/p>/\1/')
AMD64_ORI_URL=$(echo $WEB_CONTENT | grep -o "https://[0-9a-zA-Z_\/\.\-]*amd64\.deb" | head -n 1)
# AMD64_URL=$(decrypt $AMD64_ORI_URL)
# 使用 CloudFlare Workers 动态生成重定向链接,其基本逻辑如上方 JS 代码所示。
# 这样 Packages 中固定链接也可重定向至官网,不给官方白嫖流量的机会。
AMD64_URL="https://wps302.wcbing.top/$AMD64_ORI_URL"
./check_downloader.py wps-office $VERSION $AMD64_URL amd64

View File

@ -1,27 +0,0 @@
decrypt() {
url=$1
pathname="/$(echo $url | cut -d '/' -f 4-)"
secrity_key="7f8faaaa468174dc1c9cd62e5f218a5b"
timestamp10=$(date '+%s')
md5hash=$(echo -n "${secrity_key}${pathname}${timestamp10}" | md5sum | cut -d " " -f 1 )
url="$url?t=${timestamp10}&k=${md5hash}"
echo $url
# # js
# function downLoad(url) {
# var urlObj=new URL(url);
# var uri=urlObj.pathname;
# var secrityKey="7f8faaaa468174dc1c9cd62e5f218a5b";
# var timestamp10=Math.floor(new Date().getTime() / 1000);
# var md5hash=CryptoJS.MD5(secrityKey + uri + timestamp10);
# url += '?t=' + timestamp10 + '&k=' + md5hash
# console.log(url);
# }
}
WEB_CONTENT=$(curl -fs https://linux.wps.cn/)
VERSION=$(echo $WEB_CONTENT | grep -o "<p class=\"banner_txt\">[0-9.]*</p>" | sed 's/<p class=\"banner_txt\">\(.*\)<\/p>/\1/')
X64_ORI_URL=$(echo $WEB_CONTENT | grep -o "https://[0-9a-zA-Z_\/\.\-]*amd64\.deb" | head -n 1)
X64_URL=$(decrypt $X64_ORI_URL)
./check_downloader.py wps-office $VERSION $X64_URL

View File

@ -1,6 +1,6 @@
X64_URL=$(curl -sI "https://xmind.cn/zen/download/linux_deb/" | grep location | cut -d ' ' -f 2 | tr -d '\r')
AMD64_URL=$(curl -sI "https://xmind.cn/zen/download/linux_deb/" | grep location | cut -d ' ' -f 2 | tr -d '\r')
# https://dl3.xmind.cn/Xmind-for-Linux-amd64bit-24.04.10311-202405240010.deb
VERSION=$(echo $X64_URL | cut -d '-' -f 5)
VERSION=$(echo $AMD64_URL | cut -d '-' -f 5)
./check_downloader.py xmind-vana $VERSION $X64_URL
./check_downloader.py xmind-vana $VERSION $AMD64_URL amd64

19
init-deb.py Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env python3
import sqlite3
# create table
conn = sqlite3.connect("data/deb.db")
for arch in ["amd64", "arm64", "all"]:
conn.execute(
f"""
CREATE TABLE IF NOT EXISTS '{arch}' (
name TEXT UNIQUE,
version TEXT,
url TEXT
);
"""
)
conn.commit()
conn.close()

View File

@ -1,27 +0,0 @@
#!/usr/bin/env python3
import sqlite3
# create table
conn = sqlite3.connect("data/deb.db")
conn.execute(
"""
CREATE TABLE IF NOT EXISTS x86_64 (
name TEXT UNIQUE,
version TEXT,
url TEXT
);
"""
)
conn.execute(
"""
CREATE TABLE IF NOT EXISTS arm64 (
name TEXT UNIQUE,
version TEXT,
url TEXT
);
"""
)
conn.commit()
conn.close()

View File

@ -12,35 +12,55 @@ import requests
import sys
from concurrent.futures import ThreadPoolExecutor
from threading import Lock
import apt_pkg
from apt_pkg import version_compare
package_version = {arch: {} for arch in ["all", "amd64", "i386", "arm64"]}
package_info = {arch: {} for arch in ["all", "amd64", "i386", "arm64"]}
lock = {arch: Lock() for arch in ["all", "amd64", "i386", "arm64"]}
apt_pkg.init() # 初始化 apt_pkg
"""
repo info json format:
USER_AGENT = "Debian APT-HTTP/1.3 (3.0.3)" # from Debian 13
arch_List = ["amd64", "arm64", "all", "i386"]
lock = {arch: Lock() for arch in arch_List}
packages = {arch: {} for arch in arch_List} # 存放用于生成 Packages 的内容
""" packages format:
{
"name": repo name
"repo": repo url, end with "/"
"xxx_path": repo xxx Packages file path, start with no "/"
"arch": {
"package1": {
"version": "1.0.0",
"url": "https://example.com/package1.deb",
"package": ""
}
}
}
"""
def read_repo_list(repo_list_file):
def read_repo_list(repo_list_file: str) -> dict:
"""
repo info json format:
"repo_name": {
"repo": repo url, end with "/" is better
"path": {
"arch": repo Packages file path of "arch", don't start with "/"
}
}
"""
try:
with open(repo_list_file, "r") as f:
return json.load(f)
except Exception as e:
logging.error(f"Error reading repo list: {e}")
return []
return {}
# get the packages file content from remote repo
def get_remote_packages(repo_url, file_path):
file_url = repo_url + file_path
def get_remote_packages(repo_url: str, file_path: str) -> bytes:
"""
get the packages file content from remote repo
"""
file_url = os.path.join(repo_url, file_path)
try:
response = requests.get(file_url, timeout=10)
response = requests.get(
file_url, timeout=10, headers={"User-Agent": USER_AGENT}
)
if response.status_code != 200:
logging.error(
f"GetError: {file_url} returned status {response.status_code}"
@ -57,59 +77,58 @@ def get_remote_packages(repo_url, file_path):
else: # Packages
content = response.content
# complete the two newlines if the ending is less than two newlines
# 结尾不足两个换行符的话,补全两个换行符
if not content.endswith(b"\n\n"):
content += b"\n"
return content.replace(b"Filename: ", f"Filename: {repo_url}".encode())
except Exception as e:
logging.error(f"Error fetching packages: {e}")
return b""
def get_latest(deb_packages):
# split the information of each packet, store it in infoList
# 将每个包的信息分割开,存放到 infoList 中
deb_packages = re.sub(rb"^Package: ", b"{{start}}Package: ", deb_packages, flags=re.MULTILINE)
info_list = deb_packages.split(b"{{start}}")[1:]
def split_latest(packages_file_content: bytes):
"""
split the information of each packet, deduplication and store the latest in infoList
将每个包的信息分割开去重并将最新的存放到 infoList
"""
# Remove trailing empty lines first
packages_file_content = packages_file_content.rstrip(b"\n\r\t ")
find_name = re.compile(rb"Package: (.+)")
find_arch = re.compile(rb"Architecture: (.+)")
find_version = re.compile(rb"Version: (.+)")
# split on two or more consecutive blank lines
package_list = [
part + b"\n\n"
for part in re.split(rb"(?:\r?\n){2,}", packages_file_content)
if part.strip()
]
for v in info_list:
find_name = re.compile(rb"Package:[ ]*(.+)")
find_arch = re.compile(rb"Architecture:[ ]*(.+)")
find_url = re.compile(rb"Filename:[ ]*(.+)")
find_version = re.compile(rb"Version:[ ]*(.+)")
for package in package_list:
name = "unknown"
try:
name = find_name.search(v).group(1).decode()
arch = find_arch.search(v).group(1).decode()
tmp_version = find_version.search(v).group(1).decode()
name = find_name.search(package).group(1).decode()
arch = find_arch.search(package).group(1).decode()
url = find_url.search(package).group(1).decode()
tmp_version = find_version.search(package).group(1).decode()
with lock[arch]:
# 使用 apt_pkg 进行版本比较
if (
name not in package_version[arch]
or os.system(
f"dpkg --compare-versions {tmp_version} gt {package_version[arch][name]}"
)
== 0
name not in packages[arch]
or version_compare(tmp_version, packages[arch][name]["version"]) > 0
):
package_version[arch][name] = tmp_version
package_info[arch][name] = v
packages[arch][name] = {"version": tmp_version, "url": url, "package": package}
except Exception as e:
logging.error(f"Error processing package {name}: {e}")
return
def process_repo(r):
def process_repo(r: dict):
"""
获取仓库中不同架构子仓库的内容最后调用 get_latest 去重并保存
"""
try:
deb_packages = b""
if r.get("mix_path"): # 获取扁平 Repo 中包信息
deb_packages += get_remote_packages(r["repo"], r["mix_path"])
else:
if r.get("amd64_path"): # 获取 Repo 中 Amd64 包信息
deb_packages += get_remote_packages(r["repo"], r["amd64_path"])
if r.get("arm64_path"): # 获取 Repo 中 Arm64 包信息
deb_packages += get_remote_packages(r["repo"], r["arm64_path"])
if r.get("all_path"): # 获取 Repo 中 All 包信息
deb_packages += get_remote_packages(r["repo"], r["all_path"])
get_latest(deb_packages)
for path in r["path"].values():
split_latest(get_remote_packages(r["repo"], path))
except Exception as e:
logging.error(f"Error processing repo {r.get('name', 'unknown')}: {e}")
@ -135,29 +154,28 @@ if __name__ == "__main__":
# 处理本地 repo
if args.local:
with open(args.local) as f:
get_latest(f.read().encode())
split_latest(f.read().encode())
repo_list_file = args.repo
repo_list = read_repo_list(repo_list_file)
# 读取 repo_list 配置
repo_list = read_repo_list(args.repo)
if not repo_list:
sys.exit()
# 多线程,同时限制最大线程数
with ThreadPoolExecutor(max_workers=10) as executor:
executor.map(process_repo, repo_list)
os.makedirs("deb/amd64/", exist_ok=True)
os.makedirs("deb/arm64/", exist_ok=True)
executor.map(process_repo, repo_list.values())
# 分别输出到不同文件
with open("deb/amd64/Packages", "+wb") as f:
for i in package_info["amd64"].values():
f.write(i)
for i in package_info["all"].values():
f.write(i)
for arch in ["amd64", "arm64"]:
os.makedirs(f"deb/dists/wcbing/main/binary-{arch}/", exist_ok=True)
with open(f"deb/dists/wcbing/main/binary-{arch}/Packages", "+wb") as f:
for i in packages[arch].values():
f.write(i["package"])
for i in packages["all"].values():
f.write(i["package"])
with open("deb/arm64/Packages", "+wb") as f:
for i in package_info["arm64"].values():
f.write(i)
for i in package_info["all"].values():
f.write(i)
# 输出 packages.json用于展示仓库内容
for arch in arch_List:
for i in packages[arch].values():
i.pop("package")
json.dump(packages, open("deb/list/packages.json", "w"), indent=4)

7
packages/README.md Normal file
View File

@ -0,0 +1,7 @@
# Packages
收集存档或疑似停止更新等长时间不更新但仍有下载地址的应用。
这里收集的应用不再检查更新,以减轻请求压力、加快仓库构建速度。
> 注:为保证包的信息可以被正确分割,每个文件末尾**请务必保留两个以上空行**。

View File

@ -0,0 +1,46 @@
Package: flameshot
Architecture: amd64
Version: 12.1.0-1
Priority: optional
Section: graphics
Maintainer: Boyuan Yang <byang@debian.org>
Installed-Size: 3239
Depends: hicolor-icon-theme, libqt5svg5 (>= 5.9.0~), libc6 (>= 2.14), libgcc-s1 (>= 3.0), libqt5core5a (>= 5.15.1), libqt5dbus5 (>= 5.14.1), libqt5gui5 (>= 5.14.1) | libqt5gui5-gles (>= 5.14.1), libqt5network5 (>= 5.9.0~), libqt5widgets5 (>= 5.15.1), libstdc++6 (>= 5.2)
Recommends: xdg-desktop-portal-gtk | xdg-desktop-portal-gnome | xdg-desktop-portal-kde | xdg-desktop-portal-wlr, grim
Suggests: ca-certificates, openssl
Filename: https://github.com/flameshot-org/flameshot/releases/download/v12.1.0/flameshot-12.1.0-1.debian-11.amd64.deb
Size: 651568
MD5sum: 42fe9a70ff05c36d27b5eae7f0c25dc6
SHA1: 595c8dae712f96680e23121433815899902da5ae
SHA256: 8fadc826b9fe3077fe55830cade2321438f4fc16ee03e65e0ad0b18eeb878def
SHA512: 160333faf8237fde25bf26deaa14616acaa128711454871117394fe37742ad933409d276ce1d8cf16270ef430a877650ec81a1b47996c0ecf77f4e10d9f73df6
Homepage: https://github.com/flameshot-org/flameshot
Description: Powerful yet simple-to-use screenshot software
Flameshot is a powerful yet simple-to-use screenshot software.
Notable features include customizable appearance, in-app screenshot editing,
D-Bus interface, experimental GNOME/KDE Wayland support, integration with
Imgur and support for both GUI and CLI interface.
Package: flameshot
Architecture: arm64
Version: 12.1.0-1
Priority: optional
Section: graphics
Maintainer: Boyuan Yang <byang@debian.org>
Installed-Size: 3223
Depends: hicolor-icon-theme, libqt5svg5 (>= 5.9.0~), libc6 (>= 2.17), libgcc-s1 (>= 3.0), libqt5core5a (>= 5.15.1), libqt5dbus5 (>= 5.14.1), libqt5gui5 (>= 5.14.1) | libqt5gui5-gles (>= 5.14.1), libqt5network5 (>= 5.9.0~), libqt5widgets5 (>= 5.15.1), libstdc++6 (>= 5.2)
Recommends: xdg-desktop-portal-gtk | xdg-desktop-portal-gnome | xdg-desktop-portal-kde | xdg-desktop-portal-wlr, grim
Suggests: ca-certificates, openssl
Filename: https://github.com/flameshot-org/flameshot/releases/download/v12.1.0/flameshot-12.1.0-1.debian-11.arm64.deb
Size: 604012
MD5sum: f12c6170b067d8137fcc6cb9dfa4de9d
SHA1: 2a8af2e95c048721e9211070d3e12999f27aa348
SHA256: 437c66abe0bdca413c97b6ad3bfd690b2a8ca3e20e60a9f99795d5f432aecef5
SHA512: 3fa0314558a56d5eebcbbd9bf0d803eab61dc499ef1fada34f327b243b70a7a878bdbcef07fd5e055f014fdfd6a2fe2c0d2f01796e7b429e3379c521e62b3003
Homepage: https://github.com/flameshot-org/flameshot
Description: Powerful yet simple-to-use screenshot software
Flameshot is a powerful yet simple-to-use screenshot software.
Notable features include customizable appearance, in-app screenshot editing,
D-Bus interface, experimental GNOME/KDE Wayland support, integration with
Imgur and support for both GUI and CLI interface.

View File

@ -0,0 +1,22 @@
Package: kali-undercover
Architecture: all
Version: 2025.2.0
Priority: optional
Section: misc
Maintainer: Kali Developers <devel@kali.org>
Installed-Size: 19510
Depends: python3:any, fonts-liberation, gir1.2-glib-2.0, libnotify-bin, mousepad, procps, psmisc, xdotool, xfce4, xfce4-datetime-plugin, xfce4-power-manager-plugins, xfce4-pulseaudio-plugin, xfce4-whiskermenu-plugin
Suggests: gtk2-engines-murrine
Filename: https://mirrors.cernet.edu.cn/kali/pool/main/k/kali-undercover/kali-undercover_2025.2.0_all.deb
Size: 7750640
MD5sum: 0e9d2d64929f8341ae1911478ce67b73
SHA1: 3ccc76ff06d60bbf40e627efa2733adad3ea8c64
SHA256: 24dc718af28210f6139a5f9238896c6e1d1bc40a951a9dfc742c51a773334ef6
SHA512: cb443141fee19af3e99257104ff359cf489929913ce9978a88ea46217e639bc4f582b3dc4ad33ab1b5d88a6fd0a4357757f5e5fecb8a369c7c611c8f78d52e9d
Description: Kali Undercover Mode
Run “kali-undercover” and you will instantly switch your Xfce desktop into
a Windows 10 desktop that will no longer draw attention to your activities.
.
Run it a second time to escape the cover mode and get back your original
desktop settings.

21
packages/marktext.package Normal file
View File

@ -0,0 +1,21 @@
Package: marktext
Architecture: amd64
Version: 0.17.1
Priority: optional
Section: default
Maintainer: MarkText Contributors
Installed-Size: 286529
Depends: libsecret-1-0, libx11-xcb1, libxkbfile1, libfontconfig1
Recommends: libappindicator3-1
Filename: https://github.com/marktext/marktext/releases/download/v0.17.1/marktext-amd64.deb
Size: 75198556
MD5sum: d5c4b6c6033a28d71d2da68e9d72cb90
SHA1: 06f1a3fe39e01704415294fc1d4c81465f0fa723
SHA256: 927fa87c11e6763171bd68dbf60f235bfea62989e799620dd392d19077574fd2
SHA512: fefc3ead08538ab8261295e94a91a3c5ae7a5041252d44e7ba0349c30424e0fa60db45d37e26b54a9b48491a3a3183baf08d19ee2362aec63b393ba6768df1f9
Homepage: https://marktext.app/
Description:
A simple and elegant open-source markdown editor that focused on speed and usability.
License: Expat
Vendor: MarkText Contributors

42
packages/motrix.package Normal file
View File

@ -0,0 +1,42 @@
Package: motrix
Architecture: amd64
Version: 1.8.19
Priority: optional
Section: default
Maintainer: Dr_rOot <agalwood.net@gmail.com>
Installed-Size: 245431
Depends: libgtk-3-0, libnotify4, libnss3, libxss1, libxtst6, xdg-utils, libatspi2.0-0, libuuid1, libsecret-1-0
Recommends: libappindicator3-1
Filename: https://github.com/agalwood/Motrix/releases/download/v1.8.19/Motrix_1.8.19_amd64.deb
Size: 71298984
MD5sum: 0b878031c5eeb536e09dbc17b5fc0b54
SHA1: 58394832c7c4d306e227c366d82fc822f6e1b9bb
SHA256: a21d1fcc0988325073b3778de875660c9d544834f3f92b2396a0a124a14fed11
SHA512: 8a3dab9c731268c2291f286d8efa7815046bbe00046deb938db061863d3ad3e14ddcb50ba4a7e44ada2c11d196d660bb6a762af4e6e589ddb38692266010e61a
Homepage: https://motrix.app
Description:
A full-featured download manager
License: MIT
Vendor: Dr_rOot <agalwood.net@gmail.com>
Package: motrix
Architecture: arm64
Version: 1.8.19
Priority: optional
Section: default
Maintainer: Dr_rOot <agalwood.net@gmail.com>
Installed-Size: 249147
Depends: libgtk-3-0, libnotify4, libnss3, libxss1, libxtst6, xdg-utils, libatspi2.0-0, libuuid1, libsecret-1-0
Recommends: libappindicator3-1
Filename: https://github.com/agalwood/Motrix/releases/download/v1.8.19/Motrix_1.8.19_arm64.deb
Size: 66839298
MD5sum: f55e76696960c4b0c56f39f85e81c72c
SHA1: e7953a8dd3f1758729d7699158b36f4c8437ecf7
SHA256: d191a0338bb4ae46e475f976bf926f3b61e8e5c96e9ac266242e883baaafd48a
SHA512: 3ea865afc8d3c214a87e381f44249789330064cd44e8313b377d188fe983a1fd8cb3ccab879d6b26f3fdbf00f5971054f5529aa1dcb05017a184b8c8ed0993c7
Homepage: https://motrix.app
Description:
A full-featured download manager
License: MIT
Vendor: Dr_rOot <agalwood.net@gmail.com>

18
packages/yolx.package Normal file
View File

@ -0,0 +1,18 @@
Package: yolx
Architecture: amd64
Version: 0.3.9+1
Priority: optional
Essential: no
Section: x11
Maintainer: Yoyo <admin@yzzi.icu>
Installed-Size: 6604
Depends: libappindicator3-1, libayatana-appindicator3-1
Filename: https://github.com/uiYzzi/Yolx/releases/download/0.3.9+1/yolx-linux-0.3.9+1.deb
Size: 11392180
MD5sum: 5b34c223e1b1e8eb0993d7d72c41d0cd
SHA1: 5cbcdb0cb88055e29f58a93b3a8f8199a5f2af96
SHA256: 52962ba986cea645b2b3817031899ba64fb32872160841f92a3fb9822b7e3561
SHA512: 563b28d6d7c3273e6d2f9ce5ebb60e261f4832efccc4d89dfa75007803e3fb639f7210bd52c80ab8dccb0748346a7e3dd5d82df0e6c9c9a5883dddf13c24f6f7
Description: An aria2 client
Uploaders: Yoyo <admin@yzzi.icu>

24
run.sh
View File

@ -1,25 +1,17 @@
#!/bin/sh
gen_release() {
apt-ftparchive release $1 >$1/Release
gpg --yes --detach-sign -a -o $1/Release.gpg $1/Release
gpg --yes --clearsign -o $1/InRelease $1/Release
}
# check for updates
$HOME/go/bin/github-downloader -r -o deb
./get-github-releases.py
find get -type f -name "*.sh" -exec sh {} \;
cd deb
# generate the local Packages
apt-ftparchive packages . > tmpPackages
sed -i "s|\./\(https\?\):/|\1://|g" tmpPackages
## merge the Packages file from local package
cat $(find packages -name "*.package") > deb/tmpPackages
cd ..
sed -i "s|\./|\.\./|g" deb/tmpPackages
# merge the Packages files from third-party repositories
## merge the Packages files from third-party repositories
./merge-apt-repo.py --local deb/tmpPackages
# generate the Release file
gen_release deb/amd64
gen_release deb/arm64
cd deb/dists/wcbing && \
apt-ftparchive release -c apt-ftparchive.conf . > Release && \
gpg --yes --detach-sign -a -o Release.gpg Release && \
gpg --yes --clearsign -o InRelease Release