mirror of
https://github.com/wcbing/wcbing-apt-repo.git
synced 2025-12-29 02:28:30 +08:00
Compare commits
56 Commits
194866f306
...
29918ac866
| Author | SHA1 | Date | |
|---|---|---|---|
| 29918ac866 | |||
| 336386d8d0 | |||
| 512b7b29ea | |||
| 348f431f0e | |||
| d87ed92313 | |||
| e23a8d7b5b | |||
| d35b529623 | |||
| 02819b059c | |||
| f48875195e | |||
| 7859b53c05 | |||
| c70a16716b | |||
| eaa8612e46 | |||
| 438c5b13e2 | |||
| 9ba888d117 | |||
| a79e12567b | |||
| fbe96f5d1c | |||
| 493206345a | |||
| dcf20c7d73 | |||
| a0b6e71f9a | |||
| 9f0e777b8c | |||
| 244baa9b43 | |||
| dd20b9d61b | |||
| b22e44a5f2 | |||
| ad69be984e | |||
| 6f78561e7a | |||
| a1de16fe6d | |||
| bb904cfe61 | |||
| 831672957a | |||
| 3ce949af99 | |||
| f8ad5d523a | |||
| 611e165f5d | |||
| 14d95b7492 | |||
| 89ef8d2602 | |||
| 09e615e123 | |||
| e2828ab4fa | |||
| 5e8559b1c8 | |||
| 51a7d954e6 | |||
| 251b5233c5 | |||
| 5c7c12e93e | |||
| 868091a502 | |||
| c420ab12b9 | |||
| 015dfbd099 | |||
| 60588bd38e | |||
| de9fae4414 | |||
| 91f098d89f | |||
| 8ee3d3012f | |||
| ce763130ca | |||
| 9ef1dac6c9 | |||
| 375316d7fc | |||
| ef98dfccb4 | |||
| ded24d423d | |||
| f5d1007bd9 | |||
| 14a53edd22 | |||
| 62bfab323c | |||
| 2643348df9 | |||
| 07d25c28c7 |
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,3 +1,6 @@
|
|||||||
data/github-local.json
|
data/github-local.json
|
||||||
data/deb.db
|
data/deb.db
|
||||||
deb/
|
*.deb
|
||||||
|
*Packages
|
||||||
|
*Release*
|
||||||
|
__pycache__/
|
||||||
17
Dockerfile
Normal file
17
Dockerfile
Normal 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
100
README.md
@ -1,36 +1,41 @@
|
|||||||
# wcbing APT 软件源/仓库
|
# 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。
|
- 现主要服务 x86_64 用户,同时实验性支持 arm64。
|
||||||
如有需要请参考最后一节自行建立仓库。
|
如有需要请参考最后一节自行建立仓库。
|
||||||
- 主要收录官方打包发布的文件,不接受第三方自行打包的商业软件。
|
- 非开源、商业软件只收录官方打包发布的文件,不接受第三方自行打包的。
|
||||||
- 有固定的更新地址,如官网、官方仓库或 Github Releases。
|
- 有固定的更新地址,如官网、官方仓库或 Github Releases。
|
||||||
- 不收录打包的 wine 应用、Android 应用。
|
- 不收录打包的 wine 应用、Android 应用。
|
||||||
- 不收录图标、主题、字体等包,以后可能单独建一个相关仓库。
|
- 不收录图标、主题、字体等包,这些单独建一个相关仓库。
|
||||||
|
|
||||||
|
|
||||||
## 已收录软件
|
## 部分已收录软件
|
||||||
|
|
||||||
### 自行收集
|
### 部分自行收集软件
|
||||||
|
|
||||||
| 软件名 | 包名 | amd64 | arm64 |
|
| 软件名 | 包名 | amd64 | arm64 |
|
||||||
| ----- | ---- | ----- | ----- |
|
| ----- | ---- | ----- | ----- |
|
||||||
| [QQ](https://im.qq.com/linuxqq/) | linuxqq | ✅ | ✅ |
|
| [QQ](https://im.qq.com/linuxqq/) | linuxqq | ✅ | ✅ |
|
||||||
| [QQ音乐](https://y.qq.com/download/download.html) | qqmusic | ✅ | |
|
| [QQ音乐](https://y.qq.com/download/download.html) | qqmusic | ✅ | |
|
||||||
| [腾讯会议](https://meeting.tencent.com/download/) | wemeet | ✅ | ✅ |
|
| [腾讯会议](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://pan.baidu.com/download) | baidunetdisk | ✅ | |
|
||||||
| [钉钉](https://www.dingtalk.com/download/) | com.alibabainc.dingtalk | ✅ | |
|
| [钉钉](https://www.dingtalk.com/download/) | com.alibabainc.dingtalk | ✅ | ✅ |
|
||||||
| [飞书](https://www.feishu.cn/download) | bytedance-feishu-stable | ✅ | |
|
| [飞书](https://www.feishu.cn/download) | bytedance-feishu-stable | ✅ | ✅ |
|
||||||
| [Xmind](https://xmind.cn/download/) | xmind-vana | ✅ | |
|
| [Xmind](https://xmind.cn/download/) | xmind-vana | ✅ | |
|
||||||
| [uTools](https://u.tools/download/) | utools | ✅ | |
|
| [uTools](https://u.tools/download/) | utools | ✅ | |
|
||||||
| [360安全浏览器](https://browser.360.net/gc/) | browser360-cn-stable | ✅ | |
|
| [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 | ✅ | |
|
| [向日葵](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 | ✅ | |
|
| [ToDesk](https://www.todesk.com/linux.html) | todesk | ✅ | |
|
||||||
| [微信](https://linux.weixin.qq.com/) | wechat | ✅ | ✅ |
|
| [微信](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
|
||||||
|
|
||||||
> 因服务器资源有限,本仓库可能无法收录部分大文件。
|
详细请看:[Git Releases to APT Repo](https://github.com/wcbing-build/git-releases-to-apt-repo)
|
||||||
> 有收录需求也可投稿至星火商店的 [Github Releases 更新配置仓库](https://gitee.com/spark-building-service/github),其和本部分内容是同源的。
|
一个将 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 |
|
| 软件仓库 | 包名 | amd64 | arm64 |
|
||||||
| ------ | ---- | ----- | ----- |
|
| ------ | ---- | ----- | ----- |
|
||||||
|Mozilla Firefox|firefox<br />firefox_beta<br />firefox_devedition<br />firefox_esr<br />firefox_nightly<br />mozillavpn| ✅ | ✅<br />官方仅提供<br />firefox_nightly |
|
| [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 Chrome | google-chrome-stable<br />google-chrome-beta<br />google-chrome-unstable | ✅ | |
|
||||||
|Google Earth|google-earth-pro-stable<br />google-earth-ec-stable| ✅ | |
|
| Google Earth | google-earth-pro-stable<br />google-earth-ec-stable | ✅ | |
|
||||||
|Microsoft Edge|microsoft-edge-stable<br />microsoft-edge-beta<br />microsoft-edge-dev| ✅ | |
|
| Chrome Remote Desktop | chrome-remote-desktop | ✅ | |
|
||||||
|Opera|opera-stable<br />opera-beta<br />opera-developer| ✅ | |
|
| Microsoft Edge | microsoft-edge-stable<br />microsoft-edge-beta<br />microsoft-edge-dev | ✅ | |
|
||||||
|Visual Studio Code|code<br />code-insiders<br />code-exploration| ✅ | ✅ |
|
| Opera | opera-stable<br />opera-beta<br />opera-developer | ✅ | |
|
||||||
|termius|termius-app<br />termius-beta| ✅ | |
|
| Visual Studio Code | code<br />code-insiders<br />code-exploration | ✅ | ✅ |
|
||||||
|Sublime Text<br />Sublime Merge|sublime-text<br />sublime-merge| ✅ | ✅ |
|
| termius | termius-app<br />termius-beta | ✅ | |
|
||||||
|Steam|steam-launcher<br />steam-libs-amd64| ✅ | |
|
| [Sublime Text<br />Sublime Merge](https://www.sublimetext.com/docs/linux_repositories.html) | sublime-text<br />sublime-merge | ✅ | ✅ |
|
||||||
|Tailscale|tailscale<br />tailscale-nginx-auth| ✅ | ✅ |
|
| [Steam](https://repo.steampowered.com/steam/) | steam-launcher<br />steam-libs-amd64 | ✅ | |
|
||||||
|[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| ✅ | |
|
| [Tailscale](https://pkgs.tailscale.com/stable/) | tailscale<br />tailscale-nginx-auth | ✅ | ✅ |
|
||||||
|Typora|typora| ✅ | ✅ |
|
| [neovide: wcbing 打包](https://github.com/wcbing-build/neovide-debs) | neovide | ✅ | |
|
||||||
|Zotero|zotero<br />zotero-beta<br />zotero6| ✅ | |
|
| [himalaya: wcbing 打包](https://github.com/wcbing-build/himalaya-debs) | himalaya | ✅ | ✅ |
|
||||||
|Github CLI|gh| ✅ | ✅ |
|
| [Typora](https://typora.io/#linux) | typora | ✅ | ✅ |
|
||||||
|[dufs: wcbing 打包](https://github.com/wcbing-build/dufs-debs)|dufs| ✅ | ✅ |
|
| [Zotero](https://zotero.retorque.re/file/apt-package-archive/index.html) | zotero<br />zotero-beta<br />zotero6 | ✅ | |
|
||||||
|[frp: wcbing 打包](https://github.com/wcbing-build/frp-debs)|frps<br />frpc| ✅ | ✅ |
|
| [Github CLI](https://cli.github.com/) | gh | ✅ | ✅ |
|
||||||
|[lazydocker: wcbing 打包](https://github.com/wcbing-build/lazydocker-debs)|lazydocker| ✅ | ✅ |
|
| [dufs: wcbing 打包](https://github.com/wcbing-build/dufs-debs) | dufs | ✅ | ✅ |
|
||||||
|[lazygit: wcbing 打包](https://github.com/wcbing-build/lazygit-debs)|lazygit| ✅ | ✅ |
|
| [frp: wcbing 打包](https://github.com/wcbing-build/frp-debs) | frps<br />frpc | ✅ | ✅ |
|
||||||
|[NextTrace](https://github.com/nxtrace/nexttrace-debs)|nexttrace| ✅ | ✅ |
|
| [lazydocker: wcbing 打包](https://github.com/wcbing-build/lazydocker-debs) | lazydocker | ✅ | ✅ |
|
||||||
|Debian 中文社区软件源|anydesk<br />marktext<br />wps-office<br />[更多](https://github.com/debiancn/repo)| ✅ | |
|
| [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 | ✅ | ✅ |
|
||||||
|
|
||||||
## 自建仓库
|
## 自建仓库
|
||||||
|
|
||||||
|
|||||||
@ -2,9 +2,18 @@
|
|||||||
import subprocess
|
import subprocess
|
||||||
import os
|
import os
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
import sys
|
||||||
import logging
|
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(
|
logging.basicConfig(
|
||||||
format="%(asctime)s %(message)s",
|
format="%(asctime)s %(message)s",
|
||||||
datefmt="%Y/%m/%d %H:%M:%S",
|
datefmt="%Y/%m/%d %H:%M:%S",
|
||||||
@ -12,69 +21,95 @@ logging.basicConfig(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def download(url):
|
def download(url, file_path) -> bool:
|
||||||
file_dir = os.path.join(base_dir, os.path.dirname(url))
|
"""Download file using curl with APT User-Agent."""
|
||||||
if not os.path.exists(file_dir):
|
curl_process = subprocess.run(
|
||||||
os.makedirs(file_dir)
|
["curl", "-H", f"User-Agent: {USER_AGENT}", "-fsLo", file_path, url]
|
||||||
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,
|
|
||||||
]
|
|
||||||
)
|
)
|
||||||
|
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):
|
def check_download(name, version, url, arch):
|
||||||
|
"""Check and handle package download/update."""
|
||||||
logging.info("%s:%s = %s", name, arch, version)
|
logging.info("%s:%s = %s", name, arch, version)
|
||||||
|
|
||||||
# connect to db
|
file_path = os.path.join(DEB_BASE_DIR, arch, f"{name}_{version}_{arch}.deb")
|
||||||
with sqlite3.connect(os.path.join("data", f"{base_dir}.db")) as conn:
|
local_version = None
|
||||||
cur = conn.cursor()
|
db_path = os.path.join(DB_DIR, f"{DEB_BASE_DIR}.db")
|
||||||
res = cur.execute(
|
# get local version
|
||||||
f"SELECT version, url FROM {arch} WHERE name = ?", (name,)
|
with version_lock, sqlite3.connect(db_path) as conn:
|
||||||
).fetchall()
|
res = conn.execute(
|
||||||
if len(res):
|
f"SELECT version FROM '{arch}' WHERE name = ?", (name,)
|
||||||
local_version = res[0][0]
|
).fetchone()
|
||||||
local_url = res[0][1]
|
if res:
|
||||||
if local_version != version:
|
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})")
|
print(f"Update: {name}:{arch} ({local_version} -> {version})")
|
||||||
download(url)
|
# update database
|
||||||
# wirte to db
|
with version_lock, sqlite3.connect(db_path) as conn:
|
||||||
cur.execute(
|
conn.execute(
|
||||||
f"UPDATE {arch} SET version = ?, url = ? WHERE name = ?",
|
f"UPDATE '{arch}' SET version = ?, url = ? WHERE name = ?",
|
||||||
(version, url, name),
|
(version, url, name),
|
||||||
)
|
)
|
||||||
|
conn.commit()
|
||||||
# remove old version
|
# remove old version
|
||||||
if local_url != url: # 针对固定下载链接
|
old_file_path = os.path.join(DEB_BASE_DIR, f"{name}_{local_version}_{arch}.deb")
|
||||||
old_file_path = os.path.join(base_dir, local_url.split("?")[0])
|
|
||||||
if os.path.exists(old_file_path):
|
if os.path.exists(old_file_path):
|
||||||
os.remove(old_file_path)
|
os.remove(old_file_path)
|
||||||
else:
|
else:
|
||||||
print(f"AddNew: {name}:{arch} ({version})")
|
print(f"AddNew: {name}:{arch} ({version})")
|
||||||
download(url)
|
# update database
|
||||||
# wirte to db
|
with version_lock, sqlite3.connect(db_path) as conn:
|
||||||
cur.execute(
|
conn.execute(
|
||||||
f"INSERT INTO {arch}(name, version, url) VALUES (?, ?, ?)",
|
f"INSERT INTO '{arch}'(name, version, url) VALUES (?, ?, ?)",
|
||||||
(name, version, url),
|
(name, version, url),
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
args = os.sys.argv
|
args = sys.argv
|
||||||
if len(args) == 5:
|
if len(args) == 5:
|
||||||
check_download(args[1], args[2], args[3], args[4])
|
check_download(*args[1:])
|
||||||
elif len(args) == 4:
|
|
||||||
check_download(args[1], args[2], args[3], "x86_64")
|
|
||||||
elif len(args) > 1:
|
elif len(args) > 1:
|
||||||
logging.error(f"Unknown Args: {args[1:]}")
|
logging.error(f"Unknown Args: {args[1:]}")
|
||||||
else:
|
else:
|
||||||
print(f"Usage: {args[0]} <package_name> <version> <url> [arch]")
|
print(f"Usage: {args[0]} <package_name> <version> <url> <arch>")
|
||||||
print("options:")
|
print("options:")
|
||||||
print(" arch: x86_64, arm64. default is x86_64")
|
print(" arch: amd64, arm64, all.")
|
||||||
|
|||||||
108
data/github.json
108
data/github.json
@ -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"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,106 +1,177 @@
|
|||||||
[
|
{
|
||||||
{
|
"git-releases": {
|
||||||
"name": "google-chrome",
|
"repo": "",
|
||||||
"repo": "https://dl.google.com/linux/chrome/deb/",
|
"path": {
|
||||||
"amd64_path": "dists/stable/main/binary-amd64/Packages.gz"
|
"mix": "https://github.com/wcbing-build/git-releases-to-apt-repo/releases/latest/download/Packages"
|
||||||
},
|
|
||||||
{
|
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
]
|
},
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
deb/dists/wcbing/apt-ftparchive.conf
Normal file
9
deb/dists/wcbing/apt-ftparchive.conf
Normal 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 仓库";
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
JSON=$(curl -s "https://pan.baidu.com/disk/cmsdata?do=client")
|
JSON=$(curl -s "https://pan.baidu.com/disk/cmsdata?do=client")
|
||||||
|
|
||||||
VERSION=$(echo $JSON | jq -r ".linux.version" | cut -d "V" -f 2)
|
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
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
JSON=$(curl -s https://active.browser.360.net/api/v1/web-version)
|
JSON=$(curl -s https://active.browser.360.net/api/v1/web-version)
|
||||||
VERSION=$(echo $JSON | jq -r ".data.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
|
||||||
@ -1,8 +1,12 @@
|
|||||||
X64_JSON=$(curl -s "https://www.feishu.cn/api/package_info?platform=10")
|
VERSIONS_JSON=$(curl -fs "https://www.feishu.cn/api/downloads")
|
||||||
# arm64 https://www.feishu.cn/api/package_info?platform=12
|
|
||||||
|
|
||||||
|
# AMD64
|
||||||
# "version_number": "Linux-x64-deb@V7.22.9"
|
# "version_number": "Linux-x64-deb@V7.22.9"
|
||||||
VERSION=$(echo $X64_JSON | jq -r ".data.version_number" | cut -d '@' -f 2)
|
AMD64_VERSION=$(echo $VERSIONS_JSON | jq -r ".versions.Linux_deb_x64.version_number" | cut -d 'V' -f 2)
|
||||||
X64_URL=$(echo $X64_JSON | jq -r ".data.download_link")
|
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
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
X64_URL=$(curl -sw %{redirect_url} https://www.dingtalk.com/win/d/qd=linux_amd64)
|
AMD64_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)
|
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
|
||||||
|
|||||||
@ -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
|
# https://cdn.dida365.cn/download/linux/linux_deb_x64/dida-6.0.0-amd64.deb
|
||||||
VERSION=$(echo $X64_URL | cut -d "-" -f 2)
|
VERSION=$(echo $AMD64_URL | cut -d "-" -f 2)
|
||||||
./check_downloader.py dida $VERSION $X64_URL
|
./check_downloader.py dida $VERSION $AMD64_URL amd64
|
||||||
|
|
||||||
# ARM64
|
# ARM64
|
||||||
ARM64_URL=$(curl -sI "https://dida365.com/static/getApp/download?type=linux_deb_arm64" | grep location | cut -d ' ' -f 2 | tr -d '\r')
|
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
7
get/eudic.sh
Normal 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
|
||||||
@ -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')
|
VERSION=$(echo $JSON | jq -r '.version + "_" + .updateDate')
|
||||||
|
|
||||||
X64_URL=$(echo $JSON | jq -r '.x64DownloadUrl.deb')
|
# 测试版参考 https://bbs.deepin.org/post/279737?offset=1&limit=20&postId=1658175
|
||||||
./check_downloader.py linuxqq $VERSION $X64_URL
|
|
||||||
|
# AMD64
|
||||||
|
AMD64_URL=$(echo $JSON | jq -r '.x64DownloadUrl.deb')
|
||||||
|
./check_downloader.py linuxqq $VERSION $AMD64_URL amd64
|
||||||
|
|
||||||
# ARM64
|
# ARM64
|
||||||
ARM64_URL=$(echo $JSON | jq -r '.armDownloadUrl.deb')
|
ARM64_URL=$(echo $JSON | jq -r '.armDownloadUrl.deb')
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
WEB_CONTENT=$(curl -s "https://y.qq.com/download/download.html")
|
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)
|
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
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
JSON=$(curl -fs "https://client-webapi.oray.com/softwares/SUNLOGIN_X_LINUX?x64=1")
|
JSON=$(curl -fs "https://client-webapi.oray.com/softwares/SUNLOGIN_X_LINUX?x64=1")
|
||||||
|
|
||||||
VERSION=$(echo "$JSON" | jq -r '.versionno')
|
VERSION=$(printf "%s" "$JSON" | jq -r '.versionno')
|
||||||
X64_URL=$(echo $JSON | jq -r '.downloadurl')
|
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
10
get/tdappdesktop.sh
Normal 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
|
||||||
@ -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)
|
AMD64_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=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
|
||||||
@ -1,8 +1,8 @@
|
|||||||
WEB_CONTENT=$(curl -s "https://www.u-tools.cn/download/")
|
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
|
# 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
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
WEB_CONTENT=$(curl -s "https://linux.weixin.qq.com/")
|
WEB_CONTENT=$(curl -s "https://linux.weixin.qq.com/")
|
||||||
|
|
||||||
# X64
|
# AMD64
|
||||||
X64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*x86_64\.deb')
|
AMD64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*x86_64\.deb')
|
||||||
Last_Modified=$(curl -sI $X64_URL | grep "Last-Modified")
|
Last_Modified=$(curl -sI $AMD64_URL | grep "Last-Modified")
|
||||||
# Last-Modified: Wed, 06 Nov 2024 02:08:50 GMT
|
# Last-Modified: Wed, 06 Nov 2024 02:08:50 GMT
|
||||||
VERSION=$(echo $Last_Modified | cut -d ' ' -f 3-6 | sed 's/ /-/g')
|
VERSION=$(echo $Last_Modified | cut -d ' ' -f 3-6 | sed 's/ /-/g')
|
||||||
# 06-Nov-2024-02:08:50
|
# 06-Nov-2024-02:08:50
|
||||||
|
|
||||||
./check_downloader.py wechat $VERSION $X64_URL
|
./check_downloader.py wechat $VERSION $AMD64_URL amd64
|
||||||
|
|
||||||
# ARM64
|
# ARM64
|
||||||
ARM64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*arm64\.deb')
|
ARM64_URL=$(echo $WEB_CONTENT | grep -o 'https:[0-9a-zA-Z/\._]*arm64\.deb')
|
||||||
|
|||||||
@ -13,8 +13,8 @@ download_list_url="https://meeting.tencent.com/web-service/query-download-info?q
|
|||||||
JSON=$(curl -s $download_list_url)
|
JSON=$(curl -s $download_list_url)
|
||||||
|
|
||||||
VERSION=$(echo $JSON | jq -r '."info-list"[0].version')
|
VERSION=$(echo $JSON | jq -r '."info-list"[0].version')
|
||||||
X64_URL=$(echo $JSON | jq -r '."info-list"[0].url')
|
AMD64_URL=$(echo $JSON | jq -r '."info-list"[0].url')
|
||||||
./check_downloader.py wemeet $VERSION $X64_URL
|
./check_downloader.py wemeet $VERSION $AMD64_URL amd64
|
||||||
|
|
||||||
# ARM64
|
# ARM64
|
||||||
VERSION=$(echo $JSON | jq -r '."info-list"[1].version')
|
VERSION=$(echo $JSON | jq -r '."info-list"[1].version')
|
||||||
|
|||||||
31
get/wps-office.sh
Normal file
31
get/wps-office.sh
Normal 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
|
||||||
@ -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
|
|
||||||
@ -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
|
# 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
19
init-deb.py
Executable 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()
|
||||||
27
init_deb.py
27
init_deb.py
@ -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()
|
|
||||||
@ -12,35 +12,55 @@ import requests
|
|||||||
import sys
|
import sys
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
import apt_pkg
|
||||||
|
from apt_pkg import version_compare
|
||||||
|
|
||||||
package_version = {arch: {} for arch in ["all", "amd64", "i386", "arm64"]}
|
apt_pkg.init() # 初始化 apt_pkg
|
||||||
package_info = {arch: {} for arch in ["all", "amd64", "i386", "arm64"]}
|
|
||||||
lock = {arch: Lock() for arch in ["all", "amd64", "i386", "arm64"]}
|
|
||||||
|
|
||||||
"""
|
USER_AGENT = "Debian APT-HTTP/1.3 (3.0.3)" # from Debian 13
|
||||||
repo info json format:
|
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
|
"arch": {
|
||||||
"repo": repo url, end with "/"
|
"package1": {
|
||||||
"xxx_path": repo xxx Packages file path, start with no "/"
|
"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:
|
try:
|
||||||
with open(repo_list_file, "r") as f:
|
with open(repo_list_file, "r") as f:
|
||||||
return json.load(f)
|
return json.load(f)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error reading repo list: {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: str, file_path: str) -> bytes:
|
||||||
def get_remote_packages(repo_url, file_path):
|
"""
|
||||||
file_url = repo_url + file_path
|
get the packages file content from remote repo
|
||||||
|
"""
|
||||||
|
file_url = os.path.join(repo_url, file_path)
|
||||||
try:
|
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:
|
if response.status_code != 200:
|
||||||
logging.error(
|
logging.error(
|
||||||
f"GetError: {file_url} returned status {response.status_code}"
|
f"GetError: {file_url} returned status {response.status_code}"
|
||||||
@ -57,59 +77,58 @@ def get_remote_packages(repo_url, file_path):
|
|||||||
else: # Packages
|
else: # Packages
|
||||||
content = response.content
|
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())
|
return content.replace(b"Filename: ", f"Filename: {repo_url}".encode())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error fetching packages: {e}")
|
logging.error(f"Error fetching packages: {e}")
|
||||||
return b""
|
return b""
|
||||||
|
|
||||||
|
|
||||||
def get_latest(deb_packages):
|
def split_latest(packages_file_content: bytes):
|
||||||
# split the information of each packet, store it in infoList
|
"""
|
||||||
# 将每个包的信息分割开,存放到 infoList 中
|
split the information of each packet, deduplication and store the latest in infoList
|
||||||
deb_packages = re.sub(rb"^Package: ", b"{{start}}Package: ", deb_packages, flags=re.MULTILINE)
|
将每个包的信息分割开,去重并将最新的存放到 infoList 中
|
||||||
info_list = deb_packages.split(b"{{start}}")[1:]
|
"""
|
||||||
|
# Remove trailing empty lines first
|
||||||
|
packages_file_content = packages_file_content.rstrip(b"\n\r\t ")
|
||||||
|
|
||||||
find_name = re.compile(rb"Package: (.+)")
|
# split on two or more consecutive blank lines
|
||||||
find_arch = re.compile(rb"Architecture: (.+)")
|
package_list = [
|
||||||
find_version = re.compile(rb"Version: (.+)")
|
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:
|
try:
|
||||||
name = find_name.search(v).group(1).decode()
|
name = find_name.search(package).group(1).decode()
|
||||||
arch = find_arch.search(v).group(1).decode()
|
arch = find_arch.search(package).group(1).decode()
|
||||||
tmp_version = find_version.search(v).group(1).decode()
|
url = find_url.search(package).group(1).decode()
|
||||||
|
tmp_version = find_version.search(package).group(1).decode()
|
||||||
with lock[arch]:
|
with lock[arch]:
|
||||||
|
# 使用 apt_pkg 进行版本比较
|
||||||
if (
|
if (
|
||||||
name not in package_version[arch]
|
name not in packages[arch]
|
||||||
or os.system(
|
or version_compare(tmp_version, packages[arch][name]["version"]) > 0
|
||||||
f"dpkg --compare-versions {tmp_version} gt {package_version[arch][name]}"
|
|
||||||
)
|
|
||||||
== 0
|
|
||||||
):
|
):
|
||||||
package_version[arch][name] = tmp_version
|
packages[arch][name] = {"version": tmp_version, "url": url, "package": package}
|
||||||
package_info[arch][name] = v
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error processing package {name}: {e}")
|
logging.error(f"Error processing package {name}: {e}")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def process_repo(r):
|
def process_repo(r: dict):
|
||||||
|
"""
|
||||||
|
获取仓库中不同架构子仓库的内容,最后调用 get_latest 去重并保存。
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
deb_packages = b""
|
for path in r["path"].values():
|
||||||
if r.get("mix_path"): # 获取扁平 Repo 中包信息
|
split_latest(get_remote_packages(r["repo"], path))
|
||||||
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)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error processing repo {r.get('name', 'unknown')}: {e}")
|
logging.error(f"Error processing repo {r.get('name', 'unknown')}: {e}")
|
||||||
|
|
||||||
@ -135,29 +154,28 @@ if __name__ == "__main__":
|
|||||||
# 处理本地 repo
|
# 处理本地 repo
|
||||||
if args.local:
|
if args.local:
|
||||||
with open(args.local) as f:
|
with open(args.local) as f:
|
||||||
get_latest(f.read().encode())
|
split_latest(f.read().encode())
|
||||||
|
|
||||||
repo_list_file = args.repo
|
# 读取 repo_list 配置
|
||||||
repo_list = read_repo_list(repo_list_file)
|
repo_list = read_repo_list(args.repo)
|
||||||
if not repo_list:
|
if not repo_list:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
# 多线程,同时限制最大线程数
|
# 多线程,同时限制最大线程数
|
||||||
with ThreadPoolExecutor(max_workers=10) as executor:
|
with ThreadPoolExecutor(max_workers=10) as executor:
|
||||||
executor.map(process_repo, repo_list)
|
executor.map(process_repo, repo_list.values())
|
||||||
|
|
||||||
os.makedirs("deb/amd64/", exist_ok=True)
|
|
||||||
os.makedirs("deb/arm64/", exist_ok=True)
|
|
||||||
|
|
||||||
# 分别输出到不同文件
|
# 分别输出到不同文件
|
||||||
with open("deb/amd64/Packages", "+wb") as f:
|
for arch in ["amd64", "arm64"]:
|
||||||
for i in package_info["amd64"].values():
|
os.makedirs(f"deb/dists/wcbing/main/binary-{arch}/", exist_ok=True)
|
||||||
f.write(i)
|
with open(f"deb/dists/wcbing/main/binary-{arch}/Packages", "+wb") as f:
|
||||||
for i in package_info["all"].values():
|
for i in packages[arch].values():
|
||||||
f.write(i)
|
f.write(i["package"])
|
||||||
|
for i in packages["all"].values():
|
||||||
|
f.write(i["package"])
|
||||||
|
|
||||||
with open("deb/arm64/Packages", "+wb") as f:
|
# 输出 packages.json,用于展示仓库内容
|
||||||
for i in package_info["arm64"].values():
|
for arch in arch_List:
|
||||||
f.write(i)
|
for i in packages[arch].values():
|
||||||
for i in package_info["all"].values():
|
i.pop("package")
|
||||||
f.write(i)
|
json.dump(packages, open("deb/list/packages.json", "w"), indent=4)
|
||||||
|
|||||||
7
packages/README.md
Normal file
7
packages/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Packages
|
||||||
|
|
||||||
|
收集存档或疑似停止更新等长时间不更新但仍有下载地址的应用。
|
||||||
|
|
||||||
|
这里收集的应用不再检查更新,以减轻请求压力、加快仓库构建速度。
|
||||||
|
|
||||||
|
> 注:为保证包的信息可以被正确分割,每个文件末尾**请务必保留两个以上空行**。
|
||||||
46
packages/flameshot.package
Normal file
46
packages/flameshot.package
Normal 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.
|
||||||
|
|
||||||
22
packages/kali-undercover.package
Normal file
22
packages/kali-undercover.package
Normal 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
21
packages/marktext.package
Normal 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
42
packages/motrix.package
Normal 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
18
packages/yolx.package
Normal 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
24
run.sh
@ -1,25 +1,17 @@
|
|||||||
#!/bin/sh
|
#!/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
|
# check for updates
|
||||||
$HOME/go/bin/github-downloader -r -o deb
|
./get-github-releases.py
|
||||||
find get -type f -name "*.sh" -exec sh {} \;
|
find get -type f -name "*.sh" -exec sh {} \;
|
||||||
|
|
||||||
cd deb
|
## merge the Packages file from local package
|
||||||
# generate the local Packages
|
cat $(find packages -name "*.package") > deb/tmpPackages
|
||||||
apt-ftparchive packages . > tmpPackages
|
|
||||||
sed -i "s|\./\(https\?\):/|\1://|g" tmpPackages
|
|
||||||
|
|
||||||
cd ..
|
## merge the Packages files from third-party repositories
|
||||||
sed -i "s|\./|\.\./|g" deb/tmpPackages
|
|
||||||
# merge the Packages files from third-party repositories
|
|
||||||
./merge-apt-repo.py --local deb/tmpPackages
|
./merge-apt-repo.py --local deb/tmpPackages
|
||||||
|
|
||||||
# generate the Release file
|
# generate the Release file
|
||||||
gen_release deb/amd64
|
cd deb/dists/wcbing && \
|
||||||
gen_release deb/arm64
|
apt-ftparchive release -c apt-ftparchive.conf . > Release && \
|
||||||
|
gpg --yes --detach-sign -a -o Release.gpg Release && \
|
||||||
|
gpg --yes --clearsign -o InRelease Release
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user