标签外的链接",
+ "intermediateLinkNotFound": "未找到中转链接",
+ "intermediateLink": "中转链接",
+ "exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
+ "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
+ "bgUpdatesWhileChargingOnly": "未充电时禁用后台更新",
+ "autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
+ "versionExtractionRegEx": "提取版本号的正则表达式",
+ "trimVersionString": "修剪版本字符串的正则表达式",
+ "matchGroupToUseForX": "“{}”中引用的捕获组",
+ "matchGroupToUse": "“提取版本字符串的正则表达式”中引用的捕获组",
+ "highlightTouchTargets": "突出展示不明显的可交互区域",
+ "pickExportDir": "选择导出文件夹",
+ "autoExportOnChanges": "数据变更时自动导出",
+ "includeSettings": "同时导出应用设置",
+ "filterVersionsByRegEx": "筛选版本号的正则表达式",
+ "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件",
+ "dontSortReleasesList": "保持来自 API 的发行顺序",
+ "reverseSort": "反转排序",
+ "takeFirstLink": "选取第一个链接",
+ "skipSort": "不进行排序",
+ "debugMenu": "调试选项",
+ "bgTaskStarted": "后台任务已启动 - 详见日志",
+ "runBgCheckNow": "立即进行后台更新检查",
+ "versionExtractWholePage": "将版本号提取规则应用于完整页面",
+ "installing": "正在安装",
+ "skipUpdateNotifications": "忽略更新通知",
+ "updatesAvailableNotifChannel": "更新可用",
+ "appsUpdatedNotifChannel": "应用已更新",
+ "appsPossiblyUpdatedNotifChannel": "已尝试更新应用",
+ "errorCheckingUpdatesNotifChannel": "检查更新出错",
+ "appsRemovedNotifChannel": "应用已删除",
+ "downloadingXNotifChannel": "正在下载“{}”",
+ "completeAppInstallationNotifChannel": "完成应用安装",
+ "checkingForUpdatesNotifChannel": "正在检查更新",
+ "onlyCheckInstalledOrTrackOnlyApps": "只检查已安装和“仅追踪”的应用",
+ "supportFixedAPKURL": "支持固定的 APK 文件链接",
+ "selectX": "选择{}",
+ "parallelDownloads": "启用并行下载",
+ "useShizuku": "使用 Shizuku 或 Sui 安装",
+ "shizukuBinderNotFound": "未发现兼容的 Shizuku 服务",
+ "shizukuOld": "Shizuku 版本过低(<11)- 请更新",
+ "shizukuOldAndroidWithADB": "正在低版本 Android(<8.1)系统中以 ADB 模式运行 Shizuku - 请更新 Android 系统版本或使用 Sui 代替",
+ "shizukuPretendToBeGooglePlay": "将安装来源伪装为 Google Play(需要使用 Shizuku)",
+ "useSystemFont": "使用系统字体",
+ "useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号",
+ "requestHeader": "请求标头",
+ "useLatestAssetDateAsReleaseDate": "使用最新文件上传时间作为发行日期",
+ "defaultPseudoVersioningMethod": "默认虚拟版本方案",
+ "partialAPKHash": "APK 文件散列值片段",
+ "APKLinkHash": "APK 文件链接散列值",
+ "directAPKLink": "APK 文件直链",
+ "pseudoVersionInUse": "正在使用虚拟版本号",
+ "installed": "当前版本",
+ "latest": "最新版本",
+ "invertRegEx": "反转匹配",
+ "note": "备注",
+ "selfHostedNote": "可以通过“{}”下拉菜单来指向任意来源的自托管/自定义实例。",
+ "badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
+ "beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
+ "appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
+ "wiki": "帮助/Wiki",
+ "crowdsourcedConfigsLabel": "来自社区的应用配置(谨慎使用)",
+ "crowdsourcedConfigsShort": "来自社区的应用配置",
+ "allowInsecure": "允许不安全的 HTTP 请求",
+ "stayOneVersionBehind": "始终延后一个版本进行更新",
+ "useFirstApkOfVersion": "存在多个 APK 文件时自动选择第一个",
+ "refreshBeforeDownload": "下载前刷新应用详情",
+ "tencentAppStore": "腾讯应用宝",
+ "coolApk": "酷安",
+ "vivoAppStore": "(中国)vivo应用商店",
+ "name": "发行名称",
+ "smartname": "发行名称(智能)",
+ "sortMethod": "排序方法",
+ "welcome": "欢迎",
+ "documentationLinksNote": "下方链接的 GitHub 页面中包含关于 Obtainium 的视频、文章、讨论及其他资源,可帮助您了解本应用的使用方法。",
+ "batteryOptimizationNote": "请注意,在设置中切换为“前台服务”,并/或关闭操作系统对 Obtainium 的电池优化,可能会让后台下载更稳定。",
+ "fileDeletionError": "删除文件失败(请手动删除后再次尝试):\"{}\"",
+ "foregroundService": "Obtainium 前台服务",
+ "foregroundServiceExplanation": "使用前台服务检查更新(更稳定,但也更耗电)",
+ "fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)",
+ "excludeSecrets": "排除机密",
+ "GHReqPrefix": "用于 GitHub 请求的 \"sky22333/hubproxy \"实例",
+ "includeZips": "包含 ZIP 文件",
+ "zippedApkFilterRegEx": "过滤 ZIP 内的 APK",
+ "removeAppQuestion": {
+ "one": "是否删除应用?",
+ "other": "是否删除应用?"
+ },
+ "tooManyRequestsTryAgainInMinutes": {
+ "one": "请求过于频繁(API 速率限制)- 请在 {} 分钟后重试",
+ "other": "请求过于频繁(API 速率限制)- 请在 {} 分钟后重试"
+ },
+ "bgUpdateGotErrorRetryInMinutes": {
+ "one": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试",
+ "other": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试"
+ },
+ "bgCheckFoundUpdatesWillNotifyIfNeeded": {
+ "one": "后台检查发现 {} 个应用更新 - 如有需要将发送通知",
+ "other": "后台检查发现 {} 个应用更新 - 如有需要将发送通知"
+ },
+ "apps": {
+ "one": "{} 个应用",
+ "other": "{} 个应用"
+ },
+ "url": {
+ "one": "{} 个 URL",
+ "other": "{} 个 URL"
+ },
+ "minute": {
+ "one": "{} 分钟",
+ "other": "{} 分钟"
+ },
+ "hour": {
+ "one": "{} 小时",
+ "other": "{} 小时"
+ },
+ "day": {
+ "one": "{} 天",
+ "other": "{} 天"
+ },
+ "clearedNLogsBeforeXAfterY": {
+ "one": "清除了 {n} 条日志(早于 {before},晚于 {after})",
+ "other": "清除了 {n} 条日志(早于 {before},晚于 {after})"
+ },
+ "xAndNMoreUpdatesAvailable": {
+ "one": "“{}”和另外 1 个应用可以更新了。",
+ "other": "“{}”和另外 {} 个应用可以更新了。"
+ },
+ "xAndNMoreUpdatesInstalled": {
+ "one": "“{}”和另外 1 个应用已更新。",
+ "other": "“{}”和另外 {} 个应用已更新。"
+ },
+ "xAndNMoreUpdatesFailed": {
+ "one": "“{}”和另外 1 个应用更新失败。",
+ "other": "“{}”和另外 {} 个应用更新失败。"
+ },
+ "xAndNMoreUpdatesPossiblyInstalled": {
+ "one": "已尝试更新“{}”和另外 1 个应用。",
+ "other": "已尝试更新“{}”和另外 {} 个应用。"
+ },
+ "apk": {
+ "one": "{} 个 APK 文件",
+ "other": "{} 个 APK 文件"
+ }
+}
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..4257d2a
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# Convenience script
+
+CURR_DIR="$(pwd)"
+SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
+trap "cd \"$CURR_DIR\"" EXIT
+cd "$SCRIPT_DIR"
+
+if [ -z "$1" ]; then
+ git fetch && git merge origin/main && git push # Typically run after a PR to main, so bring dev up to date
+fi
+
+# Update local Flutter
+git submodule update --remote
+cd .flutter
+git fetch
+git checkout stable
+git pull
+FLUTTER_GIT_URL="https://github.com/flutter/flutter/" ./bin/flutter upgrade
+cd ..
+
+# Keep global Flutter, if any, in sync
+if [ -f ~/flutter/bin/flutter ]; then
+ cd ~/flutter
+ ./bin/flutter channel stable
+ ./bin/flutter upgrade
+ cd "$SCRIPT_DIR"
+fi
+
+if [ -z "$(which flutter)" ]; then
+ export PATH="$PATH:$SCRIPT_DIR/.flutter/bin"
+fi
+
+rm ./build/app/outputs/flutter-apk/* 2>/dev/null # Get rid of older builds if any
+flutter build apk --flavor normal && flutter build apk --split-per-abi --flavor normal # Build (both split and combined APKs)
+for file in ./build/app/outputs/flutter-apk/app-*normal*.apk*; do mv "$file" "${file//-normal/}"; done
+flutter build apk --flavor fdroid -t lib/main_fdroid.dart && # Do the same for the F-Droid flavour
+ flutter build apk --split-per-abi --flavor fdroid -t lib/main_fdroid.dart
+for file in ./build/app/outputs/flutter-apk/*.sha1; do gpg --sign --detach-sig "$file"; done # Generate PGP signatures
+rsync -r ./build/app/outputs/flutter-apk/ ~/Downloads/Obtainium-build/ # Dropoff in Downloads to allow for drag-drop into Flatpak Firefox
+cd ~/Downloads/Obtainium-build/ # Make zips just in case (for in-comment uploads)
+for apk in *.apk; do
+ PREFIX="$(echo "$apk" | head -c -5)"
+ zip "$PREFIX" "$PREFIX"*
+done
+mkdir -p zips
+mv *.zip zips/
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000..b92aa42
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,86 @@
+FROM ubuntu:22.04
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV ANDROID_SDK_ROOT /opt/android-sdk-linux
+ENV PATH "${PATH}:/opt/flutter/bin:/root/.pub-cache/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:/opt/android-sdk-linux/platform-tools"
+
+ENV HOME=/root
+
+# Prereqs
+RUN \
+ apt-get update &&\
+ apt-get install -y --no-install-recommends \
+ bash \
+ curl \
+ file \
+ git 2.x \
+ unzip \
+ xz-utils \
+ zip \
+ libglu1-mesa \
+ libxi-dev \
+ libxmu-dev \
+ libglu1-mesa-dev \
+ git-lfs \
+ openssl \
+ wget
+
+# Build prereqs
+RUN \
+ apt-get install -y \
+ cmake curl git wget unzip libgconf-2-4 gdb libstdc++6 libglu1-mesa fonts-droid-fallback lib32stdc++6 python3 sed \
+ cmake ninja-build build-essential libgl1-mesa-dev libegl1-mesa-dev libgles2-mesa-dev clang pkg-config libgtk-3-dev \
+ liblzma-dev libmount-dev libblkid-dev libgcrypt20-dev libgpg-error-dev libssl-dev libpng-dev libjpeg-dev \
+ libtiff-dev libgif-dev libgtk-3-dev
+
+# Android SDK prequisites
+# https://developer.android.com/studio#command-tools
+RUN \
+ apt-get install -y --no-install-recommends \
+ git \
+ git-lfs \
+ openssl \
+ wget \
+ unzip
+
+# Android SDK
+RUN \
+ wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/tools.zip && \
+ mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools && \
+ unzip -q /tmp/tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools && \
+ mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest && \
+ rm -v /tmp/tools.zip && \
+ mkdir -p /root/.android/ && touch /root/.android/repositories.cfg &&\
+ apt-get install -y --no-install-recommends openjdk-21-jdk openjdk-21-jre &&\
+ yes | sdkmanager --licenses &&\
+ sdkmanager --update
+
+ # Platform tools
+# Get latest with sdkmanager --list
+RUN sdkmanager --install "build-tools;33.0.1"
+RUN sdkmanager --install "ndk;26.3.11579264"
+RUN sdkmanager --install "cmake;4.0.2"
+RUN sdkmanager --install platform-tools
+RUN sdkmanager --install emulator
+RUN sdkmanager --install tools
+RUN sdkmanager --install "platforms;android-28"
+RUN sdkmanager --install "platforms;android-31"
+RUN sdkmanager --install "platforms;android-32"
+RUN sdkmanager --install "platforms;android-33"
+RUN sdkmanager --install "platforms;android-34"
+RUN sdkmanager --install "platforms;android-35"
+
+# Flutter
+ARG DEV_UID=0
+RUN \
+ wget --quiet https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.3-stable.tar.xz -O /tmp/flutter.tar.xz &&\
+ mkdir -p /opt &&\
+ cd /opt &&\
+ tar xf /tmp/flutter.tar.xz &&\
+ rm /tmp/flutter.tar.xz &&\
+ git config --global --add safe.directory /opt/flutter &&\
+ dart pub global activate cider &&\
+ chown -R ${DEV_UID} /opt/flutter
+RUN flutter --disable-analytics
+RUN flutter upgrade
+RUN chmod a+w /opt/flutter/packages -R
diff --git a/docker/builder.sh b/docker/builder.sh
new file mode 100755
index 0000000..f5c1c16
--- /dev/null
+++ b/docker/builder.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+cd ${SCRIPT_DIR}/..
+mkdir -p ./data/home
+docker run \
+ --rm \
+ -ti \
+ --net host \
+ -v "${PWD}/../:${PWD}/../":z \
+ -w "${PWD}" \
+ --name flutter-dev-obtainium \
+ --user $(id -u) \
+ -v ./data/home:/home/${USER}:z \
+ -e USER=${USER} \
+ -e HOME=/home/${USER} \
+ -e ANDROID_USER_HOME=${HOME}/.android \
+ -e GRADLE_USER_HOME=${HOME}/.gradle \
+ -e PS1="${debian_chroot:+($debian_chroot)}${USER}@\h:\w\$ " \
+ flutter-builder-obtainium
\ No newline at end of file
diff --git a/docker/mkbuilder.sh b/docker/mkbuilder.sh
new file mode 100755
index 0000000..77fd71c
--- /dev/null
+++ b/docker/mkbuilder.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+D=$(date +'%Y%m%d.%H%M%S%3N')
+
+set -e
+
+cd "${SCRIPT_DIR}/.."
+# Create the builder image
+docker build \
+ -t flutter-builder-obtainium \
+ -f ./docker/Dockerfile \
+ --build-arg="DEV_UID=$(id -u)" \
+ .
diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt
new file mode 100644
index 0000000..98127df
--- /dev/null
+++ b/fastlane/metadata/android/de/full_description.txt
@@ -0,0 +1,58 @@
+Obtainium erlaubt Ihnen die Installation und Aktualisierung von Apps direkt von deren Veröffentlichungsseiten aus; Sie erhalten außerdem Benachrichtigungen, wenn neue Versionen verfügbar sind.
+Lesen Sie das Wiki
+
+ Derzeit unterstützte App-Quellen:
+
+
+ - Open Source – Allgemein:
+
+ - F-Droid
+ - Third Party F-Droid Repos
+ - Forgejo (Codeberg)
+ - GitHub
+ - GitLab
+ - IzzyOnDroid
+ - SourceHut
+
+
+ - Andere – Allgemein:
+
+ - alternative Stores
+
+ - CoolApk
+ - Tencent App Store
+ - RuStore
+
+ - OEM-Stores
+
+ - Huawei AppGallery
+ - vivo App Store (China)
+
+ - Mods
+
+ - Reupload-Stores
+
+ - APKMirror (nur Updatebenachrchtigungen; kein APK-Download möglich)
+ - APKPure
+ - Aptoide
+ - Uptodown
+
+ - Jenkins Jobs
+
+
+ - Andere - App-Spezifisch:
+
+ - Telegram App
+ - Neutron Code
+
+
+ - „HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.
+
+
+ Einschränkungen:
+
+
+ Bei einigen Quellen werden die Daten mithilfe von Web Scraping gesammelt und können aufgrund von Änderungen am Design der Website leicht beschädigt werden. In solchen Fällen sind zuverlässigere Methoden nicht verfügbar.
+
diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt
new file mode 100644
index 0000000..870ca81
--- /dev/null
+++ b/fastlane/metadata/android/de/short_description.txt
@@ -0,0 +1 @@
+… Android-App-Updates direkt von der Quelle erhalten
\ No newline at end of file
diff --git a/fastlane/metadata/android/de/title.txt b/fastlane/metadata/android/de/title.txt
new file mode 100644
index 0000000..45ccf2a
--- /dev/null
+++ b/fastlane/metadata/android/de/title.txt
@@ -0,0 +1 @@
+Obtainium
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000..ecdd345
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1,48 @@
+Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when new releases are made available.
+Read the Wiki
+
+ Currently supported App sources:
+
+
+
+ Limitations:
+
+
+ For some sources, data is gathered using Web scraping and can easily break due to changes in website design. In such cases, more reliable methods may be unavailable.
+
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
new file mode 120000
index 0000000..1c313f1
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/featureGraphic.png
@@ -0,0 +1 @@
+../../../../../assets/graphics/banner.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
new file mode 120000
index 0000000..90c4bd9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/icon.png
@@ -0,0 +1 @@
+../../../../../assets/graphics/icon-512x512.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
new file mode 120000
index 0000000..c78483b
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/1.apps.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
new file mode 120000
index 0000000..3101b70
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/2.dark_theme.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
new file mode 120000
index 0000000..481e3d9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/3.material_you.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
new file mode 120000
index 0000000..dc799e0
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/4.app.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
new file mode 120000
index 0000000..bbdd89f
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/5.app_opts.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
new file mode 120000
index 0000000..29d4972
--- /dev/null
+++ b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
@@ -0,0 +1 @@
+../../../../../../assets/screenshots/6.app_webview.png
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000..962f353
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1 @@
+Get Android app updates directly from the source
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
new file mode 100644
index 0000000..e980f94
--- /dev/null
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -0,0 +1 @@
+Obtainium
diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt
new file mode 100644
index 0000000..61e9331
--- /dev/null
+++ b/fastlane/metadata/android/ru/full_description.txt
@@ -0,0 +1,48 @@
+Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.
+Для деталей читайте Вики
+
+ Поддерживаемые источники приложений:
+
+
+ -
+
Свободное ПО - Общие:
+
+ - GitHub
+ - GitLab
+ - Forgejo (Codeberg)
+ - F-Droid
+ - Third Party F-Droid Repos
+ - IzzyOnDroid
+ - SourceHut
+
+
+ -
+
Другие - Общие:
+
+ - APKPure
+ - Aptoide
+ - Uptodown
+ - APKMirror (Track-Only)
+ - Huawei AppGallery
+ - Tencent App Store
+ - CoolApk
+ - vivo App Store (CN)
+ - Jenkins Jobs
+ - RuStore
+
+
+ -
+
Другие - Для отдельных приложений:
+
+ - Telegram App
+ - Neutron Code
+
+
+ "HTML" (Подстраховка): Любой другой URL-адрес, который возвращает HTML-страницу со ссылками на APK-файлы.
+
+
+ Ограничения:
+
+
+ Для некоторых источников данные собираются с помощью веб-скрапинга и могут легко сломаться из-за изменений в дизайне веб-сайта. В таких случаях более надежные методы могут быть недоступны.
+
diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt
new file mode 100644
index 0000000..cb303f6
--- /dev/null
+++ b/fastlane/metadata/android/ru/short_description.txt
@@ -0,0 +1 @@
+Получайте обновления приложений прямо из источника
\ No newline at end of file
diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru/title.txt
new file mode 100644
index 0000000..e980f94
--- /dev/null
+++ b/fastlane/metadata/android/ru/title.txt
@@ -0,0 +1 @@
+Obtainium
diff --git a/lib/app_sources/apkcombo.dart b/lib/app_sources/apkcombo.dart
new file mode 100644
index 0000000..37f6b2b
--- /dev/null
+++ b/lib/app_sources/apkcombo.dart
@@ -0,0 +1,136 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:html/parser.dart';
+import 'package:obtainium/custom_errors.dart';
+import 'package:obtainium/providers/source_provider.dart';
+
+class APKCombo extends AppSource {
+ APKCombo() {
+ hosts = ['apkcombo.com'];
+ showReleaseDateAsVersionToggle = true;
+ }
+
+ @override
+ String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
+ RegExp standardUrlRegEx = RegExp(
+ '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+',
+ caseSensitive: false,
+ );
+ var match = standardUrlRegEx.firstMatch(url);
+ if (match == null) {
+ throw InvalidURLError(name);
+ }
+ return match.group(0)!;
+ }
+
+ @override
+ Future tryInferringAppId(
+ String standardUrl, {
+ Map additionalSettings = const {},
+ }) async {
+ return Uri.parse(standardUrl).pathSegments.last;
+ }
+
+ @override
+ Future