Compare commits

...

17 Commits
v1.2.2 ... main

Author SHA1 Message Date
Imran
7e270e036f Merge pull request #2460 from CertainBot/main
Update es.json
2025-08-20 19:52:38 -04:00
Imran
cef7535913 Merge pull request #2479 from DwainZwerg/main
Update full_description.txt
2025-08-20 19:52:28 -04:00
DwainZwerg
099865ab94 Update full_description.txt
Update supported Stores; better sorting
2025-08-18 15:12:58 +02:00
CertainBot
33dfc9e723 Update es.json
Several changes and updates.

Varios cambos y actualizaciones.
2025-08-13 09:56:39 +00:00
CertainBot
ba4cbfad0e Update es.json
Another error corrected

Otro error corregido
2025-08-08 01:09:23 +00:00
CertainBot
ed0b6c0710 Update es.json
Corrected a single error.

Corregido un error.
2025-08-08 00:41:29 +00:00
Imran
e8f9159571 Merge pull request #2455 from ImranR98/dev
Fix "Bad state" bug on mark as updated/installed (#2453)
2025-08-06 18:39:36 -04:00
Imran Remtulla
d8cd17c858 Increment version 2025-08-06 18:38:50 -04:00
Imran
01f423a741 Merge pull request #2447 from ar-lex/bugfix/rustore-charset
RuStore: fix charset detection (#2304)
2025-08-06 18:38:25 -04:00
Imran Remtulla
77e764e76a Fix "Bad state" but on mark as updated/installed (#2453) 2025-08-06 18:37:11 -04:00
Imran Remtulla
a37509c5a3 Merge remote-tracking branch 'origin/dev' 2025-08-04 15:24:00 -04:00
Imran Remtulla
cb9ac4cba0 Include launch.json in git 2025-08-04 15:23:44 -04:00
Alexey Arutyunov
9524148de7 RuStore: fix charset detection (#2304)
Decode whole response body in bytes and fallback to UTF-8 instead
of auto-decoding individual fields.
2025-08-03 01:45:55 +02:00
Imran
d6d3623c63 Merge pull request #2443 from summoner001/main
Translation: Update hu.json
2025-08-02 16:51:28 -04:00
Imran
58c1bdbd00 Merge pull request #2446 from ar-lex/bugfix/rustore-updatedat
Fix update date for RuStore (#2445)
2025-08-02 16:51:17 -04:00
Alexey Arutyunov
f2b7b196a8 Fix update date for RuStore (#2445) 2025-08-02 21:20:29 +02:00
summoner
73746bcb52 Translation: Update hu.json
Fixing autotranslated strings
2025-08-02 10:38:31 +00:00
8 changed files with 110 additions and 72 deletions

3
.gitignore vendored
View File

@@ -11,7 +11,8 @@
.svn/
.swiftpm/
migrate_working_dir/
.vscode/
.vscode/*
!.vscode/launch.json
# IntelliJ related
*.iml

28
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,28 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Obtainium",
"request": "launch",
"type": "dart",
"args":[ "--flavor", "normal" ]
},
{
"name": "Obtainium (profile mode)",
"request": "launch",
"type": "dart",
"flutterMode": "profile",
"args":[ "--flavor", "normal" ]
},
{
"name": "Obtainium (release mode)",
"request": "launch",
"type": "dart",
"flutterMode": "release",
"args":[ "--flavor", "normal" ]
}
]
}

View File

@@ -38,7 +38,7 @@
"appAlreadyAdded": "Aplicación añadida anteriormente",
"alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?",
"addApp": "Añadir aplicación",
"appSourceURL": "URL de origen de la aplicación",
"appSourceURL": "URL origen de la aplicación",
"error": "Error",
"add": "Añadir",
"searchSomeSourcesLabel": "Buscar (solo algunas fuentes)",
@@ -70,25 +70,25 @@
"markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?",
"no": "No",
"yes": "Sí",
"markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas",
"markSelectedAppsUpdated": "Marcar actualizadas las apps seleccionadas",
"pinToTop": "Anclar al principio",
"unpinFromTop": "Desanclar del principio",
"resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?",
"installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.",
"customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado",
"shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML",
"shareSelectedAppURLs": "Compartir URL de las aplicaciones seleccionadas",
"shareAppConfigLinks": "Compartir configuración de la app como enlace HTML",
"shareSelectedAppURLs": "Compartir URL de las apps seleccionadas",
"resetInstallStatus": "Restaurar estado de instalación",
"more": "Más",
"removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado",
"showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas",
"filter": "Filtrar",
"filterApps": "Filtrar actualizaciones",
"appName": "Nombre de la aplicación",
"filterApps": "Filtrar apps",
"appName": "Nombre de app",
"author": "Autor",
"upToDateApps": "Aplicaciones actualizadas",
"nonInstalledApps": "Aplicaciones no instaladas",
"importExport": "Importar/exportar",
"nonInstalledApps": "Apps no instaladas",
"importExport": "Importar/Exportar",
"settings": "Ajustes",
"exportedTo": "Exportado a {}",
"obtainiumExport": "Exportar Obtainium",
@@ -115,11 +115,11 @@
"followSystem": "Seguir al sistema",
"followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
"useBlackTheme": "Negro puro en tema oscuro",
"appSortBy": "Ordenar aplicaciones por",
"authorName": "Autor/nombre",
"appSortBy": "Ordenar apps por",
"authorName": "Autor/Nombre",
"nameAuthor": "Nombre/Autor",
"asAdded": "Según se Añadieron",
"appSortOrder": "Orden de Clasificación",
"asAdded": "Según se añadieron",
"appSortOrder": "Orden",
"ascending": "Ascendente",
"descending": "Descendente",
"bgUpdateCheckInterval": "Comprobar actualizaciones en segundo plano",
@@ -146,7 +146,7 @@
"updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium",
"noNewUpdates": "No hay nuevas actualizaciones.",
"xHasAnUpdate": "{} tiene una actualización.",
"appsUpdated": "Aplicaciones actualizadas",
"appsUpdated": "Apps actualizadas",
"appsNotUpdated": "Error al actualizar las aplicaciones",
"appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano",
"xWasUpdatedToY": "{} ha sido actualizada a {}.",
@@ -174,12 +174,12 @@
"lastUpdateCheckX": "Última comprobación: {}",
"remove": "Eliminar",
"yesMarkUpdated": "Sí, marcar como actualizada",
"fdroid": "Repositorio oficial F-Droid",
"fdroid": "F-Droid oficial",
"appIdOrName": "ID o Nombre de la Aplicación",
"appId": "ID de la Aplicación",
"appId": "ID de la app",
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre",
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
"fdroidThirdPartyRepo": "Repositorio de terceros F-Droid",
"fdroidThirdPartyRepo": "F-Droid terceros",
"install": "Instalar",
"markInstalled": "Marcar como instalada",
"update": "Actualizar",
@@ -211,13 +211,13 @@
"removeFromObtainium": "Eliminar de Obtainium",
"uninstallFromDevice": "Desinstalar del dispositivo",
"onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.",
"releaseDateAsVersion": "Por fecha de publicación",
"releaseTitleAsVersion": "Utilizar el título de la versión como cadena de versión",
"releaseDateAsVersion": "Usar fecha de publicación como cadena de versión",
"releaseTitleAsVersion": "Usar título de lanzamiento como cadena de versión",
"releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.",
"changes": "Cambios",
"releaseDate": "Fecha de publicación",
"importFromURLsInFile": "Importar URLs desde archivo (como OPML)",
"versionDetectionExplanation": "Conciliar la cadena de versión con la versión detectada desde el sistema operativo",
"versionDetectionExplanation": "Conciliar cadena de versión con versión detectada por el sistema operativo",
"versionDetection": "Detección de versiones",
"standardVersionDetection": "Por versión",
"groupByCategory": "Agrupar por categorías",
@@ -229,7 +229,7 @@
"dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs",
"moveNonInstalledAppsToBottom": "Mover apps no instaladas al final",
"gitlabPATLabel": "Token de acceso personal a GitLab",
"about": "Acerca",
"about": "Acerca de",
"requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)",
"checkOnStart": "Comprobar actualizaciones al inicio",
"tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente",
@@ -251,22 +251,22 @@
"enableBackgroundUpdates": "Habilitar actualizaciones en segundo plano",
"backgroundUpdateReqsExplanation": "Las actualizaciones en segundo plano pueden no estar disponibles para todas las aplicaciones.",
"backgroundUpdateLimitsExplanation": "El éxito de las instalaciones en segundo plano solo se puede comprobar con Obtainium abierto.",
"verifyLatestTag": "Comprobar la etiqueta 'Latest'",
"verifyLatestTag": "Comprobar etiqueta 'Latest'",
"intermediateLinkRegex": "Filtrar por enlace 'intermedio' para visitar primero",
"filterByLinkText": "Filtrar enlaces por texto del enlace",
"intermediateLinkNotFound": "Enlace intermedio no encontrado",
"intermediateLink": "Enlace intermedio",
"exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)",
"exemptFromBackgroundUpdates": "No actualizar en segundo plano (si está habilitado)",
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin Wi-Fi",
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
"versionExtractionRegEx": "Versión de extracción RegEx",
"trimVersionString": "Recortar cadena de versión con RegEx",
"matchGroupToUseForX": "Grupo de coincidencia a utilizar para \"{}\"",
"matchGroupToUseForX": "Grupo de coincidencia a usar para \"{}\"",
"matchGroupToUse": "Grupo a usar para versión de extracción RegEx",
"highlightTouchTargets": "Resaltar objetivos menos obvios",
"pickExportDir": "Directorio para exportar",
"autoExportOnChanges": "Auto exportar cuando haya cambios",
"autoExportOnChanges": "Auto exportar si hay cambios",
"includeSettings": "Incluir ajustes",
"filterVersionsByRegEx": "Filtrar por versiones",
"trySelectingSuggestedVersionCode": "Pruebe seleccionando la versión del paquete APK sugerida",
@@ -296,11 +296,11 @@
"shizukuBinderNotFound": "Shizuku no funciona",
"shizukuOld": "Versión antigua de Shizuku (<11) - actualícela",
"shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar",
"shizukuPretendToBeGooglePlay": "Establecer Google Play como fuente de instalación (si se usa Shizuku)",
"shizukuPretendToBeGooglePlay": "Usar Google Play como fuente de instalación (si se usa Shizuku)",
"useSystemFont": "Usar fuente del sistema",
"useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo",
"useVersionCodeAsOSVersion": "Usar versión de la app como versión detectada por el sistema operativo",
"requestHeader": "Encabezado de solicitud",
"useLatestAssetDateAsReleaseDate": "Usar la última carga del recurso como fecha de lanzamiento",
"useLatestAssetDateAsReleaseDate": "Usar última subida del recurso como fecha de lanzamiento",
"defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado",
"partialAPKHash": "Hash de APK parcial",
"APKLinkHash": "Hash de enlace APK",
@@ -312,27 +312,27 @@
"note": "Nota",
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está instalado)",
"appVerifierInstructionToast": "Compartir con AppVerifier y vuelver aquí cuando esté listo.",
"beforeNewInstallsShareToAppVerifier": "Compartir apps nuevas con AppVerifier (si está instalado)",
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
"wiki": "Ayuda/Wiki",
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use bajo su responsabilidad)",
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
"allowInsecure": "Permitir peticiones HTTP inseguras",
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
"useFirstApkOfVersion": "Auto-selección del primero de múltiples APKs",
"refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla",
"refreshBeforeDownload": "Actualizar datos de la app antes de descargarla",
"tencentAppStore": "Tencent App Store",
"coolApk": "CoolApk",
"vivoAppStore": "vivo App Store (CN)",
"name": "Nombre",
"smartname": "Nombre (Smart)",
"sortMethod": "Método de clasificación",
"sortMethod": "Clasificación por",
"welcome": "Bienvenido",
"documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.",
"batteryOptimizationNote": "Ten en cuenta que las descargas en segundo plano pueden funcionar de forma más fiable si desactivas las optimizaciones de batería del sistema operativo para Obtainium.",
"fileDeletionError": "No se ha podido eliminar el archivo (intente eliminarlo manualmente y vuelva a intentarlo): \"{}\"",
"foregroundService": "Obtainium servicio en primer plano",
"foregroundServiceExplanation": "Utilizar un servicio en primer plano para comprobar las actualizaciones (más fiable, consume más energía).",
"foregroundService": "Servicio Obtainium en primer plano",
"foregroundServiceExplanation": "Usar un servicio en primer plano para comprobar las actualizaciones (más fiable, consume más energía).",
"fgServiceNotice": "Esta notificación es necesaria para la comprobación de actualizaciones en segundo plano (puede ocultarse en la configuración del sistema operativo).",
"excludeSecrets": "Excluir secretos",
"removeAppQuestion": {
@@ -352,8 +352,8 @@
"other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario"
},
"apps": {
"one": "{} Aplicación",
"other": "{} Aplicaciones"
"one": "{} La aplicación",
"other": "{} Las aplicaciones"
},
"url": {
"one": "{} URL",

View File

@@ -167,7 +167,7 @@
"versionCorrectionDisabled": "Verziókorrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)",
"unknown": "Ismeretlen",
"none": "Semmi",
"all": "Minden",
"all": "Összes",
"never": "Soha",
"latestVersionX": "Legújabb verzió: {}",
"installedVersionX": "Telepített verzió: {}",
@@ -334,7 +334,7 @@
"foregroundService": "Obtainium előtér-szolgáltatás",
"foregroundServiceExplanation": "Előtér-szolgáltatás használata a frissítések ellenőrzéséhez (megbízhatóbb, de több energiát fogyaszt)",
"fgServiceNotice": "Ez az értesítés a háttérben történő frissítésellenőrzéshez szükséges (a rendszer beállításaiban elrejthető).",
"excludeSecrets": "Titkok kizárása",
"excludeSecrets": "Érzékeny adatok (például: személyes hozzáférési tokenek) kihagyása",
"removeAppQuestion": {
"one": "Eltávolítja az alkalmazást?",
"other": "Eltávolítja az alkalmazásokat?"

View File

@@ -4,45 +4,55 @@
<b>Derzeit unterstützte App-Quellen:</b>
</p>
<ul>
<li>
<p>Open Source Allgemein:</p>
<li>Open Source Allgemein:
<ul>
<li>GitHub</li>
<li>GitLab</li>
<li>Forgejo (Codeberg)</li>
<li>F-Droid</li>
<li>Third Party F-Droid Repos</li>
<li>Forgejo (Codeberg)</li>
<li>GitHub</li>
<li>GitLab</li>
<li>IzzyOnDroid</li>
<li>SourceHut</li>
</ul>
</li>
<li>
<p>Andere Allgemein:</p>
<li>Andere Allgemein:
<ul>
<li>alternative Stores</li>
<ul>
<li>CoolApk</li>
<li>Tencent App Store</li>
<li>RuStore</li>
</ul>
<li>OEM-Stores</li>
<ul>
<li>Huawei AppGallery</li>
<li>vivo App Store (China)</li>
</ul>
<li>Mods</li>
<ul>
<li>Farsroid</li>
</ul>
<li>Reupload-Stores</li>
<ul>
<li>APKMirror (nur Updatebenachrchtigungen; kein APK-Download möglich)</li>
<li>APKPure</li>
<li>Aptoide</li>
<li>Uptodown</li>
<li>APKMirror (Track-Only)</li>
<li>Huawei AppGallery</li>
<li>Tencent App Store</li>
<li>CoolApk</li>
<li>vivo App Store (China)</li>
</ul>
<li>Jenkins Jobs</li>
<li>RuStore</li>
</ul>
</li>
<li>
<p>Andere - App-Spezifisch:</p>
<li>Andere - App-Spezifisch:
<ul>
<li>Telegram App</li>
<li>Neutron Code</li>
</ul>
</li>
<li><p>„HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.</p></li>
<li>„HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.</li>
</ul>
<p>
<b>Einschränkungen:</b>
</p>
<p>
Bei einigen Quellen werden die Daten mit Hilfe 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.
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.
</p>

View File

@@ -36,13 +36,15 @@ class RuStore extends AppSource {
return Uri.parse(standardUrl).pathSegments.last;
}
Future<String> decodeString(String str) async {
Future<dynamic> decodeJsonBody(Uint8List bytes) async {
try {
return (await CharsetDetector.autoDecode(
Uint8List.fromList(str.codeUnits),
)).string;
return jsonDecode((await CharsetDetector.autoDecode(bytes)).string);
} catch (e) {
return str;
try {
return jsonDecode(utf8.decode(bytes));
} catch (_) {
rethrow;
}
}
}
@@ -59,14 +61,14 @@ class RuStore extends AppSource {
if (res0.statusCode != 200) {
throw getObtainiumHttpError(res0);
}
var appDetails = jsonDecode(res0.body)['body'];
var appDetails = (await decodeJsonBody(res0.bodyBytes))['body'];
if (appDetails['appId'] == null) {
throw NoReleasesError();
}
String appName = appDetails['appName'] ?? tr('app');
String author = appDetails['companyName'] ?? name;
String? dateStr = appDetails['updatedAt'];
String? dateStr = appDetails['appVerUpdatedAt'];
String? version = appDetails['versionName'];
String? changeLog = appDetails['whatsNew'];
if (version == null) {
@@ -83,15 +85,11 @@ class RuStore extends AppSource {
followRedirects: false,
postBody: {"appId": appDetails['appId'], "firstInstall": true},
);
var downloadDetails = jsonDecode(res1.body)['body'];
var downloadDetails = (await decodeJsonBody(res1.bodyBytes))['body'];
if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) {
throw NoAPKError();
}
appName = await decodeString(appName);
author = await decodeString(author);
changeLog = changeLog != null ? await decodeString(changeLog) : null;
return APKDetails(
version,
getApkUrlsFromUrls([

View File

@@ -1084,6 +1084,7 @@ class AppsProvider with ChangeNotifier {
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true;
var refreshBeforeDownload =
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true ||
apps[id]!.app.apkUrls.isNotEmpty &&
apps[id]!.app.apkUrls.first.value == 'placeholder';
if (refreshBeforeDownload) {
await checkUpdate(apps[id]!.app.id);

View File

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.2.2+2318
version: 1.2.3+2319
environment:
sdk: ^3.8.1