Compare commits

..

21 Commits

Author SHA1 Message Date
Imran
f9b97b4469 Merge pull request #1777 from ImranR98/dev
APKPure bugfix: Correctly extract APKs that are multi-arch but not universal
2024-08-06 15:52:31 -04:00
Imran Remtulla
6f706ab493 Update Flutter version + update packages, increment version 2024-08-06 15:51:54 -04:00
Imran Remtulla
ed2e6e2e9e APKPure bugfix: Correctly extract APKs that are multi-arch but not universal 2024-08-06 15:49:44 -04:00
Imran
f00758cd83 Merge pull request #1774 from ImranR98/dev
- Fix bug introduced in v1.1.16: APKPure fails to find universal APKs
- Fix bugs found in APKPure URL matching
2024-08-06 11:47:56 -04:00
Imran
25bd61f289 Merge pull request #1773 from Kevinr99089/main
Updating certain words (French File)
2024-08-06 11:46:46 -04:00
Imran Remtulla
25d19d22cf Increment version 2024-08-06 11:46:25 -04:00
Imran Remtulla
9ffb91266f Re-order some sources 2024-08-06 11:45:49 -04:00
Imran Remtulla
8d921cfbf1 Fix bugs in APKPure URL matching 2024-08-06 11:45:01 -04:00
Imran Remtulla
3ed6b168e1 Fix bug from previous version: APKPure fails to find universal APKs 2024-08-06 11:36:39 -04:00
Kévin
4a45c900c3 Some minor corrections
- A job well done is the key (of I don't know what, but it's the key...)
2024-08-06 01:50:03 +02:00
Imran
7e9e6958a3 Merge pull request #1771 from Kevinr99089/main
French translation completely revised
2024-08-05 18:01:02 -04:00
Kévin
9de082f684 Last modification before PR 2024-08-05 23:38:41 +02:00
Kévin
b40afc7329 Add files via upload 2024-08-05 23:32:32 +02:00
Imran
4fb3da45e9 Merge pull request #1770 from ImranR98/dev
- APKPure: Filter releases by available architecture (#598)
- Use a more obvious icon (magnifying glass) for the "filter apps" button (#1762)
2024-08-05 16:33:29 -04:00
Imran Remtulla
1f8e051ed6 Merge remote-tracking branch 'origin/main' into dev 2024-08-05 16:31:15 -04:00
Imran Remtulla
adc4e7c2b4 Fix error after fgbg package update in previous commit 2024-08-05 16:30:12 -04:00
Imran Remtulla
325d2f48dc More consistent tagline 2024-08-05 16:25:02 -04:00
Imran Remtulla
aa00f42a23 Update packages, increment version 2024-08-05 16:24:30 -04:00
Imran Remtulla
62dbffab52 Use a more obvious icon (magnifying glass) for the "filter apps" button (#1762) 2024-08-05 16:21:42 -04:00
Imran Remtulla
fd38444836 Improvement on previous commit 2024-08-05 16:08:12 -04:00
Imran Remtulla
71cc49a30f APKPure: Filter releases by available architecture (#598) 2024-08-05 15:53:44 -04:00
10 changed files with 431 additions and 365 deletions

View File

@@ -2,7 +2,7 @@
[![Ceasefire Now](https://badge.techforpalestine.org/default)](https://techforpalestine.org/learn-more) [![Ceasefire Now](https://badge.techforpalestine.org/default)](https://techforpalestine.org/learn-more)
Get Android App Updates Directly From the Source. Get Android app updates straight from the source.
Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available. Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available.
@@ -25,9 +25,9 @@ Currently supported App sources:
- [APKPure](https://apkpure.net/) - [APKPure](https://apkpure.net/)
- [Aptoide](https://aptoide.com/) - [Aptoide](https://aptoide.com/)
- [Uptodown](https://uptodown.com/) - [Uptodown](https://uptodown.com/)
- [APKMirror](https://apkmirror.com/) (Track-Only)
- [Huawei AppGallery](https://appgallery.huawei.com/) - [Huawei AppGallery](https://appgallery.huawei.com/)
- Jenkins Jobs - Jenkins Jobs
- [APKMirror](https://apkmirror.com/) (Track-Only)
- Open Source - App-Specific: - Open Source - App-Specific:
- [Signal](https://signal.org/) - [Signal](https://signal.org/)
- [VLC](https://videolan.org/) - [VLC](https://videolan.org/)

View File

@@ -1,86 +1,86 @@
{ {
"invalidURLForSource": "URL d'application {} invalide", "invalidURLForSource": "URL de l'application {} n'es pas valide",
"noReleaseFound": "Impossible de trouver une version adaptée", "noReleaseFound": "Impossible de trouver une publication correspondante",
"noVersionFound": "Impossible de déterminer la variante de la version", "noVersionFound": "Impossible de déterminer la version de la publication",
"urlMatchesNoSource": "L'URL ne correspond pas à une source connue", "urlMatchesNoSource": "L'URL ne correspond pas à une source connue",
"cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application", "cantInstallOlderVersion": "Impossible d'installer une ancienne version de l'application",
"appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante", "appIdMismatch": "L'ID du paquet téléchargé ne correspond pas à l'ID de l'application existante",
"functionNotImplemented": "Cette classe n'a pas implémenté cette fonction", "functionNotImplemented": "Cette classe n'implémente pas cette fonction",
"placeholder": "Espace réservé", "placeholder": "Espace réservé",
"someErrors": "Des erreurs se sont produites", "someErrors": "Des erreurs se sont produites",
"unexpectedError": "Erreur inattendue", "unexpectedError": "Erreur inattendue",
"ok": "D'accord", "ok": "Ok",
"and": "et", "and": "et",
"githubPATLabel": "Jeton d'Accès Personnel GitHub (augmente la limite de débit)", "githubPATLabel": "Jeton d'accès personnel GitHub (augmente la limite de débit)",
"includePrereleases": "Inclure les avant-premières", "includePrereleases": "Inclure les versions préliminaires",
"fallbackToOlderReleases": "Retour aux anciennes versions", "fallbackToOlderReleases": "Retour aux anciennes versions",
"filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière", "filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière",
"invalidRegEx": "Expression régulière invalide", "invalidRegEx": "Expression régulière invalide",
"noDescription": "Pas de description", "noDescription": "Aucune description",
"cancel": "Annuler", "cancel": "Annuler",
"continue": "Continuer", "continue": "Continuer",
"requiredInBrackets": "(Requis)", "requiredInBrackets": "(Requis)",
"dropdownNoOptsError": "ERREUR : LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT", "dropdownNoOptsError": "ERREUR: LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT",
"colour": "Couleur", "colour": "Couleur",
"standard": "Standard", "standard": "Standard",
"custom": "Sur mesure", "custom": "Personnalisé",
"useMaterialYou": "Utiliser Material You", "useMaterialYou": "Utiliser Material You",
"githubStarredRepos": "Dépôts étoilés GitHub", "githubStarredRepos": "Dépôts étoilés GitHub",
"uname": "Nom d'utilisateur", "uname": "Nom d'utilisateur",
"wrongArgNum": "Mauvais nombre d'arguments fournis", "wrongArgNum": "Nombre incorrect des arguments fournis",
"xIsTrackOnly": "{} est en 'Suivi uniquement'", "xIsTrackOnly": "{} en Suivi uniquement",
"source": "Source", "source": "Source",
"app": "Application", "app": "Application",
"appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.", "appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.",
"youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.", "youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.",
"trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.", "trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas le télécharger ou l'installer.",
"cancelled": "Annulé", "cancelled": "Annulé",
"appAlreadyAdded": "Application déjà ajoutée", "appAlreadyAdded": "L'application a déjà été ajoutée",
"alreadyUpToDateQuestion": "Application déjà à jour ?", "alreadyUpToDateQuestion": "L'application est déjà à jour ?",
"addApp": "Ajouter une application", "addApp": "Ajouter Appli",
"appSourceURL": "URL de la source de l'application", "appSourceURL": "URL source de l'application",
"error": "Erreur", "error": "Erreur",
"add": "Ajouter", "add": "Ajouter",
"searchSomeSourcesLabel": "Rechercher (certaines sources uniquement)", "searchSomeSourcesLabel": "Rechercher (certaines sources uniquement)",
"search": "Rechercher", "search": "Rechercher",
"additionalOptsFor": "Options supplémentaires pour {}", "additionalOptsFor": "Options supplémentaires pour {}",
"supportedSources": "Sources prises en charge ", "supportedSources": "Sources prises en charge",
"trackOnlyInBrackets": "(Suivi uniquement)", "trackOnlyInBrackets": "(Suivi uniquement)",
"searchableInBrackets": "(Interrogeable)", "searchableInBrackets": "(Interrogeable)",
"appsString": "Applications", "appsString": "Applications",
"noApps": "Aucune application", "noApps": "Aucune applications",
"noAppsForFilter": "Aucune application pour le filtre", "noAppsForFilter": "Aucune application à Filtrer",
"byX": "Par {}", "byX": "Par {}",
"percentProgress": "Progrès: {}%", "percentProgress": "Progression: {}%",
"pleaseWait": "Veuillez patienter", "pleaseWait": "Veuillez patienter",
"updateAvailable": "Mise à jour disponible", "updateAvailable": "Mise à jour disponible",
"notInstalled": "Non installé", "notInstalled": "Non installé",
"pseudoVersion": "pseudo-version", "pseudoVersion": "Version fictive",
"selectAll": "Tout sélectionner", "selectAll": "Tout sélectionner",
"deselectX": "Déselectionner {}", "deselectX": "Déselectionner {}",
"xWillBeRemovedButRemainInstalled": "{} sera supprimé d'Obtainium mais restera installé sur l'appareil.", "xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.",
"removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?",
"removeSelectedApps": "Supprimer les applications sélectionnées", "removeSelectedApps": "Les applications sélectionnées ont étés supprimés",
"updateX": "Mise à jour {}", "updateX": "Mettre à jour {}",
"installX": "Installer {}", "installX": "Installer {}",
"markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\n comme mis à jour", "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour",
"changeX": "Changer {}", "changeX": "Changer {}",
"installUpdateApps": "Installer/Mettre à jour les applications", "installUpdateApps": "Installer/Mettre à jour les applications",
"installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées", "installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées",
"markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme étant à jour?", "markXSelectedAppsAsUpdated": "Marquer les {} applications sélectionnées comme étant à jour ?",
"no": "Non", "no": "Non",
"yes": "Oui", "yes": "Oui",
"markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour", "markSelectedAppsUpdated": "Marquer les application sélectionnées comme étant à jour",
"pinToTop": "Épingler en haut", "pinToTop": "Épingler en haut",
"unpinFromTop": "Désépingler du haut", "unpinFromTop": "Désépingler du haut",
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statut d'installation des applications sélectionnées?", "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?",
"installStatusOfXWillBeResetExplanation": "Le statut d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.", "installStatusOfXWillBeResetExplanation": "L'état d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut être utile lorsque la version de l'application affichée dans Obtainium est incorrecte en raison de l'échec des mises à jour ou d'autres problèmes.",
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé", "customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML", "shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
"shareSelectedAppURLs": "Partager les URL d'applications sélectionnées", "shareSelectedAppURLs": "Partager les URL des applications sélectionnées",
"resetInstallStatus": "Réinitialiser le statut d'installation", "resetInstallStatus": "L'état d'installation des applications ont étés réinitialisés",
"more": "Plus", "more": "Plus",
"removeOutdatedFilter": "Supprimer le filtre d'application obsolète", "removeOutdatedFilter": "Supprimer le filtre des applications obsolètes",
"showOutdatedOnly": "Afficher uniquement les applications obsolètes", "showOutdatedOnly": "Afficher uniquement les applications obsolètes",
"filter": "Filtre", "filter": "Filtre",
"filterApps": "Filtrer les applications", "filterApps": "Filtrer les applications",
@@ -91,76 +91,76 @@
"importExport": "Importer/Exporter", "importExport": "Importer/Exporter",
"settings": "Paramètres", "settings": "Paramètres",
"exportedTo": "Exporté vers {}", "exportedTo": "Exporté vers {}",
"obtainiumExport": "Exporter d'Obtainium", "obtainiumExport": "Exporter Obtainium",
"invalidInput": "Entrée invalide", "invalidInput": "Entrée invalide",
"importedX": "Importé {}", "importedX": "Importé {}",
"obtainiumImport": "Importer d'Obtainium", "obtainiumImport": "Importer Obtainium",
"importFromURLList": "Importer à partir de la liste d'URL", "importFromURLList": "Importer depuis une liste d'URL",
"searchQuery": "Requête", "searchQuery": "Requête de recherche",
"appURLList": "Liste d'URL d'application", "appURLList": "Liste d'URL de l'application",
"line": "File d'attente", "line": "File d'attente",
"searchX": "Rechercher {}", "searchX": "Rechercher {}",
"noResults": "Aucun résultat trouvé", "noResults": "Aucun résultat",
"importX": "Importer {}", "importX": "Importer {}",
"importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher à tort comme \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela ne devrait pas affecter les données de l'application.\n\nN'affecte que les URL et les méthodes d'importation tierces.", "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications. Cela n'affecte que la méthode d'importation par URL et par des tiers.",
"importErrors": "Erreurs d'importation", "importErrors": "Erreurs d'importation",
"importedXOfYApps": "{} sur {} applications importées.", "importedXOfYApps": "{} applications sur {} ont étés importées.",
"followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :", "followingURLsHadErrors": "Les URL suivants comportent des erreurs :",
"selectURL": "Sélectionnez l'URL", "selectURL": "Sélectionner l'URL",
"selectURLs": "Sélectionnez les URL", "selectURLs": "Sélectionner les URL",
"pick": "Prendre", "pick": "Choisir",
"theme": "Thème", "theme": "Thème",
"dark": "Sombre", "dark": "Sombre",
"light": "Clair", "light": "Clair",
"followSystem": "Suivre le système", "followSystem": "Correspondre au système",
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.", "followSystemThemeExplanation": "Correspondre au thème du système est possible en utilisant des applications tierces.",
"useBlackTheme": "Utiliser le thème noir pur", "useBlackTheme": "Utiliser un thème Noir",
"appSortBy": "Applications triées par", "appSortBy": "Trier les applications par",
"authorName": "Auteur/Nom", "authorName": "Auteur/Nom",
"nameAuthor": "Nom/Auteur", "nameAuthor": "Nom/Auteur",
"asAdded": "Comme ajouté", "asAdded": "Date d'ajout",
"appSortOrder": "Ordre de tri des applications", "appSortOrder": "Ordre de tri des applications",
"ascending": "Ascendant", "ascending": "Ascendant",
"descending": "Descendant", "descending": "Descendant",
"bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan", "bgUpdateCheckInterval": "Intervalle de recherche de mises à jour en arrière-plan",
"neverManualOnly": "Jamais Manuel uniquement", "neverManualOnly": "Jamais - Manuellement uniquement",
"appearance": "Apparence", "appearance": "Apparence",
"showWebInAppView": "Afficher la page Web source dans la vue de l'application", "showWebInAppView": "Afficher la page Web source dans la vue Applications",
"pinUpdates": "Épingler les mises à jour en tête de la vue Applications", "pinUpdates": "Épingler les mises à jour en haut de la vue Applications",
"updates": "Mises à jour", "updates": "Mises à jour",
"sourceSpecific": "Spécifique à la source", "sourceSpecific": "Spécifique à la source",
"appSource": "Source de l'application", "appSource": "Source de l'application",
"noLogs": "Aucun journal", "noLogs": "Aucun journal",
"appLogs": "Journaux d'application", "appLogs": "Journaux d'applications",
"close": "Fermer", "close": "Fermer",
"share": "Partager", "share": "Partager",
"appNotFound": "Application introuvable", "appNotFound": "Application introuvable",
"obtainiumExportHyphenatedLowercase": "Exportation-Obtainium", "obtainiumExportHyphenatedLowercase": "export-obtainium",
"pickAnAPK": "Choisissez un APK", "pickAnAPK": "Selectionner une APK",
"appHasMoreThanOnePackage": "{} a plus d'un paquet :", "appHasMoreThanOnePackage": "{} a plus d'un paquet :",
"deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.", "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.",
"deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :", "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivants : ",
"warning": "Avertissement", "warning": "Avertissement",
"sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais la version du paquet provient de '{}'. Continuer?", "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de mise à jour provient de '{}'. Continuer ?",
"updatesAvailable": "Mises à jour disponibles", "updatesAvailable": "Mises à jour disponibles",
"updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium", "updatesAvailableNotifDescription": "Notifie à l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium.",
"noNewUpdates": "Aucune nouvelle mise à jour.", "noNewUpdates": "Aucune nouvelle mise à jour.",
"xHasAnUpdate": "{} a une mise à jour.", "xHasAnUpdate": "{} a une mise à jour.",
"appsUpdated": "Applications mises à jour", "appsUpdated": "Applications mises à jour",
"appsNotUpdated": "Échec de la mise à jour des applications", "appsNotUpdated": "Échec de la mise à jour des applications",
"appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan", "appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installés en arrière-plan.",
"xWasUpdatedToY": "{} a été mis à jour pour {}.", "xWasUpdatedToY": "{} a été mis à jour en {}.",
"xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.", "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.",
"errorCheckingUpdates": "Erreur lors de la vérification des mises à jour", "errorCheckingUpdates": "Erreur lors de la recherche de mises à jour",
"errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue", "errorCheckingUpdatesNotifDescription": "Notifie l'utilisateur lorsque la recherche de mises à jour en arrière-plan échoue.",
"appsRemoved": "Applications supprimées", "appsRemoved": "Applications supprimées",
"appsRemovedNotifDescription": "Avertit l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement", "appsRemovedNotifDescription": "Notifie à l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement.",
"xWasRemovedDueToErrorY": "{} a été supprimé en raison de cette erreur : {}", "xWasRemovedDueToErrorY": "{} a été supprimée en raison de cette erreur : {}",
"completeAppInstallation": "Installation complète de l'application", "completeAppInstallation": "Installation complète de l'application",
"obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer des applications", "obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer les applications",
"completeAppInstallationNotifDescription": "Demande à l'utilisateur de retourner sur Obtainium pour terminer l'installation d'une application", "completeAppInstallationNotifDescription": "Demande à l'utilisateur de retourner sur Obtainium pour terminer l'installation d'une application",
"checkingForUpdates": "Vérification des mises à jour", "checkingForUpdates": "Recherche de mises à jour",
"checkingForUpdatesNotifDescription": "Notification transitoire qui apparaît lors de la recherche de mises à jour", "checkingForUpdatesNotifDescription": "Notification temporaire qui apparaît lors de la recherche de mises à jour",
"pleaseAllowInstallPerm": "Veuillez autoriser Obtainium à installer des applications", "pleaseAllowInstallPerm": "Veuillez autoriser Obtainium à installer des applications",
"trackOnly": "Suivi uniquement", "trackOnly": "Suivi uniquement",
"errorWithHttpStatusCode": "Erreur {}", "errorWithHttpStatusCode": "Erreur {}",
@@ -168,167 +168,167 @@
"unknown": "Inconnu", "unknown": "Inconnu",
"none": "Aucun", "none": "Aucun",
"never": "Jamais", "never": "Jamais",
"latestVersionX": "Dernière version: {}", "latestVersionX": "Dernière version : {}",
"installedVersionX": "Version installée : {}", "installedVersionX": "Version installée : {}",
"lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", "lastUpdateCheckX": "Dernière recherche de mises à jour : {}",
"remove": "Retirer", "remove": "Supprimer",
"yesMarkUpdated": "Oui, marquer comme mis à jour", "yesMarkUpdated": "Oui, Marquer comme étant à jour",
"fdroid": "F-Droid Officiel", "fdroid": "F-Droid Officiel",
"appIdOrName": "ID ou nom de l'application", "appIdOrName": "ID ou nom de l'application",
"appId": "ID de l'application", "appId": "ID de l'application",
"appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom",
"reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications",
"fdroidThirdPartyRepo": "Dépôt tiers F-Droid", "fdroidThirdPartyRepo": "Dépôt tiers F-Droid",
"steamMobile": "Application mobile Steam", "steamMobile": "Steam Mobile",
"steamChat": "Steam Chat", "steamChat": "Steam Chat",
"install": "Installer", "install": "Installer",
"markInstalled": "Marquer comme installée", "markInstalled": "Marquer comme étant installé",
"update": "Mettre à jour", "update": "Mettre à jour",
"markUpdated": "Marquer comme étant à jour", "markUpdated": "Marquer comme étant à jour",
"additionalOptions": "Options additionnelles", "additionalOptions": "Options supplémentaires",
"disableVersionDetection": "Désactiver la détection de version", "disableVersionDetection": "Désactiver la détection de la version",
"noVersionDetectionExplanation": "Cette option être utilisée uniquement pour les applications où la détection de version ne fonctionne pas correctement.", "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de la version ne fonctionne pas correctement.",
"downloadingX": "Téléchargement {}", "downloadingX": "Téléchargement {}",
"downloadX": "Télécharger {}", "downloadX": "Télécharger {}",
"downloadedX": "Téléchargé {}", "downloadedX": "Téléchargé {}",
"releaseAsset": "Actif libéré", "releaseAsset": "Version actif",
"downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application", "downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application",
"noAPKFound": "Aucun APK trouvé", "noAPKFound": "Aucun APK trouvé",
"noVersionDetection": "Aucune de détection de version", "noVersionDetection": "Aucune version trouvée",
"categorize": "Catégoriser", "categorize": "Catégoriser",
"categories": "Catégories", "categories": "Catégories",
"category": "Catégorie", "category": "Catégorie",
"noCategory": "Aucune catégorie", "noCategory": "Aucune Catégorie",
"noCategories": "Aucune catégories", "noCategories": "Aucune Catégories",
"deleteCategoriesQuestion": "Supprimer les catégories?", "deleteCategoriesQuestion": "Supprimer les Catégories ?",
"categoryDeleteWarning": "Toutes les applications dans les catégories supprimées ne seront plus catégorisées.", "categoryDeleteWarning": "Toutes les applications des catégories supprimées seront définies comme non catégorisées.",
"addCategory": "Ajouter une catégorie", "addCategory": "Ajouter une catégorie",
"label": "Étiquette", "label": "Nom",
"language": "Langue", "language": "Langue",
"copiedToClipboard": "Copié dans le presse-papier", "copiedToClipboard": "Copié dans le presse-papier",
"storagePermissionDenied": "Autorisation de stockage refusée", "storagePermissionDenied": "Permission de stockage refusée",
"selectedCategorizeWarning": "Cela remplacera toutes les catégorie définies pour les applications sélectionnées.", "selectedCategorizeWarning": "Cela va remplacer toutes les catégories définies des applications sélectionnées.",
"filterAPKsByRegEx": "Filtrer les APK par expression régulière", "filterAPKsByRegEx": "Filtrer les APK par expression régulière",
"removeFromObtainium": "Supprimer d'Obtainium", "removeFromObtainium": "Supprimer d'Obtainium",
"uninstallFromDevice": "Désinstaller de l'appareil", "uninstallFromDevice": "Désinstaller de l'appareil",
"onlyWorksWithNonVersionDetectApps": "Fonctionne uniquement pour les applications avec la détection de version désactivée.", "onlyWorksWithNonVersionDetectApps": "Ne fonctionne que pour les applications dont la détection de la version est désactivée.",
"releaseDateAsVersion": "Utiliser la date de sortie comme version", "releaseDateAsVersion": "Utiliser la date de sortie comme version",
"releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications la détection de version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais pour lesquelles une date de sortie est disponible.",
"changes": "Changements", "changes": "Correctifs",
"releaseDate": "Date de sortie", "releaseDate": "Date de sortie",
"importFromURLsInFile": "Importer à partir d'URL dans un fichier (comme OPML)", "importFromURLsInFile": "Importer à partir des URLs d'un fichier (Comme OPML)",
"versionDetectionExplanation": "Réconcilier la chaîne de version avec la version détectée à partir du système d'exploitation", "versionDetectionExplanation": "Reporter la chaîne de version par la version détectée par le système d'exploitation",
"versionDetection": "Détection des versions", "versionDetection": "Détection de la version",
"standardVersionDetection": "Détection de version standard", "standardVersionDetection": "Détection de la version standard",
"groupByCategory": "Regrouper par catégorie", "groupByCategory": "Grouper par Catégorie",
"autoApkFilterByArch": "Si possible, essayer de filtrer les APK par architecture CPU", "autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible",
"overrideSource": "Remplacer la source", "overrideSource": "Remplacer la source",
"dontShowAgain": "Ne plus montrer", "dontShowAgain": "Ne plus afficher",
"dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Suivi uniquement'", "dontShowTrackOnlyWarnings": "Ne plus afficher les erreurs 'Suivi uniquement'",
"dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK", "dontShowAPKOriginWarnings": "Ne plus afficher les erreurs sur l'origine de l'APK",
"moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications", "moveNonInstalledAppsToBottom": "Déplacer les applications non installés vers le bas de la vue Applications",
"gitlabPATLabel": "Jeton d'accès personnel GitLab", "gitlabPATLabel": "Jeton d'accès personnel GitLab",
"about": "À propos de", "about": "À propos",
"requiresCredentialsInSettings": "{}: Cela nécessite des identifiants supplémentaires (dans Paramètres)", "requiresCredentialsInSettings": "{} a besoin d'un complément d'information (dans les Paramètres)",
"checkOnStart": "Vérifier les mises à jour au démarrage", "checkOnStart": "Rechercher les mises à jour au démarrage",
"tryInferAppIdFromCode": "Essayer de déduire l'ID de l'application à partir du code source", "tryInferAppIdFromCode": "Essayer de déduire l'identifiant de l'application à partir du code source",
"removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées depuis l'extérieur", "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe",
"pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée", "pickHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
"checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application", "checkUpdateOnDetailPage": "Rechercher les mises à jour lors de l'ouverture de la page détaillée d'une application",
"disablePageTransitions": "Désactiver les animations de transition de page", "disablePageTransitions": "Désactiver les animations de transition de page",
"reversePageTransitions": "Inverser les animations de transition de page", "reversePageTransitions": "Inverser les animations de transition de page",
"minStarCount": "Nombre minimum d'étoiles", "minStarCount": "Nombre minimum d'étoiles",
"addInfoBelow": "Ajoutez ces informations ci-dessous.", "addInfoBelow": "Ajoutez cette information ci-dessous.",
"addInfoInSettings": "Ajoutez ces informations dans les paramètres.", "addInfoInSettings": "Ajoutez cette information dans les paramètres.",
"githubSourceNote": "La limite de débit GitHub peut être évitée à l'aide d'une clé API.", "githubSourceNote": "La limitation du débit de GitHub peut être évitée à l'aide d'une clé d'API.",
"sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien", "sortByLastLinkSegment": "Trier par le dernier segment du lien",
"filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière", "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière",
"customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')", "customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')",
"appsPossiblyUpdated": "Tentative de mise à jour de l'application", "appsPossiblyUpdated": "Tentative de mise à jour des applications",
"appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan", "appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan",
"xWasPossiblyUpdatedToY": "{} pourrait avoir été mis à jour vers {}.", "xWasPossiblyUpdatedToY": "{} peut être mis à jour en {}.",
"enableBackgroundUpdates": "Activer les mises à jour en arrière-plan", "enableBackgroundUpdates": "Activer les mises à jour en arrière-plan",
"backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.", "backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.",
"backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", "backgroundUpdateLimitsExplanation": "Le résultat d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.",
"verifyLatestTag": "Vérifier la balise 'latest'", "verifyLatestTag": "Vérifier la balise 'latest'",
"intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ", "intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter",
"filterByLinkText": "Filtrer les liens par le texte du lien", "filterByLinkText": "Filtrer les liens par texte du lien",
"intermediateLinkNotFound": "Lien intermédiaire introuvable", "intermediateLinkNotFound": "Lien intermédiaire introuvable",
"intermediateLink": "Lien intermédiaire", "intermediateLink": "Lien intermédiaire",
"exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)", "exemptFromBackgroundUpdates": "Exclure de la mise à jour en arrière-plan (si activé)",
"bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi", "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en WiFi",
"autoSelectHighestVersionCode": "Sélection automatique du code de version le plus élevé de l'APK", "autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK",
"versionExtractionRegEx": "Expression régulière d'extraction de version", "versionExtractionRegEx": "Extraire la version par Expression régulière",
"trimVersionString": "Découper une chaîne de version avec RegEx", "trimVersionString": "Découper la version par Expression régulière",
"matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"", "matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"",
"matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version", "matchGroupToUse": "Groupe de correspondance à utiliser pour l'extraction de la version par Expression régulière",
"highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes", "highlightTouchTargets": "Mettre en évidence les touches moins évidentes",
"pickExportDir": "Choisir le répertoire d'exportation", "pickExportDir": "Selectionner le dossier pour l'exportation",
"autoExportOnChanges": "Exporter automatiquement après modification", "autoExportOnChanges": "Exportation automatique lors de modification",
"includeSettings": "Inclure les paramètres", "includeSettings": "Inclure les paramètres",
"filterVersionsByRegEx": "Filtrer les versions par expression régulière", "filterVersionsByRegEx": "Filtrer les versions par expression régulière",
"trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de la version suggérée de l'APK", "trySelectingSuggestedVersionCode": "Essayez de sélectionner la version suggérée du Code APK",
"dontSortReleasesList": "Conserver l'ordre des versions de l'API", "dontSortReleasesList": "Conserver l'ordre de la version de l'API",
"reverseSort": "Tri inversé", "reverseSort": "Tri inversé",
"takeFirstLink": "Prendre le premier lien", "takeFirstLink": "Utiliser le premier lien",
"skipSort": "Éviter le tri", "skipSort": "Ignorer le tri",
"debugMenu": "Menu de débogage", "debugMenu": "Menu de déboggage",
"bgTaskStarted": "Tâche en arrière-plan démarrée vérifier les journaux.", "bgTaskStarted": "Tâche en arrière plan démarrée - vérifier les journaux.",
"runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan", "runBgCheckNow": "Exécuter la recherche de la mise à jour en l'arrière-plan maintenant",
"versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page", "versionExtractWholePage": "Appliquer l'extraction de la version par expression régulière à l'ensemble de la page",
"installing": "Installation", "installing": "Installation",
"skipUpdateNotifications": "Ignorer les notifications de mise à jour", "skipUpdateNotifications": "Ignorer les notifications de mise à jour",
"updatesAvailableNotifChannel": "Mises à jour disponibles", "updatesAvailableNotifChannel": "Mises à jour disponibles",
"appsUpdatedNotifChannel": "Applications mises à jour", "appsUpdatedNotifChannel": "Applications mises à jour",
"appsPossiblyUpdatedNotifChannel": "Tentative de mise à jour de l'application", "appsPossiblyUpdatedNotifChannel": "Essayer de mettre à jour les applications",
"errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour", "errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour",
"appsRemovedNotifChannel": "Applications supprimées", "appsRemovedNotifChannel": "Applications supprimées",
"downloadingXNotifChannel": "Téléchargement {}", "downloadingXNotifChannel": "Téléchargement {}",
"completeAppInstallationNotifChannel": "Installation complète de l'application", "completeAppInstallationNotifChannel": "Installation complète de l'application",
"checkingForUpdatesNotifChannel": "Vérification des mises à jour", "checkingForUpdatesNotifChannel": "Recherche de mises à jour",
"onlyCheckInstalledOrTrackOnlyApps": "Vérifier uniquement les mises à jour des applications installées et 'Suivi uniquement'", "onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications 'Suivi uniquement'",
"supportFixedAPKURL": "Prise en charge des URL APK fixes", "supportFixedAPKURL": "Prise en charge des URL APK fixes",
"selectX": "Sélectionner {}", "selectX": "Selectionner {}",
"parallelDownloads": "Autoriser le téléchargement en parallèle", "parallelDownloads": "Autoriser les téléchargements simultanés",
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation", "useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
"shizukuBinderNotFound": "Service Shizuku compatible non trouvé", "shizukuBinderNotFound": "Le service Shizuku n'es pas démarré",
"shizukuOld": "Ancienne version de Shizuku (<11) la mettre à jour", "shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour",
"shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB mettez à jour Android ou utilisez Sui à la place", "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - veuillez mettre à jour Android ou utiliser Sui à la place",
"shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)", "shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)",
"useSystemFont": "Utiliser la police du système", "useSystemFont": "Utiliser la police du système",
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation", "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation",
"requestHeader": "En-tête de demande", "requestHeader": "Intitulé de la demande",
"useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément téléversé comme date de sortie", "useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément mis en ligne comme date de sortie",
"defaultPseudoVersioningMethod": "Méthode de pseudo-version par défaut", "defaultPseudoVersioningMethod": "Methode de version fictive par défaut",
"partialAPKHash": "Hash APK partiel", "partialAPKHash": "Hash partiel de l'APK",
"APKLinkHash": "Hash de lien APK", "APKLinkHash": "Hash du lien APK",
"directAPKLink": "Lien APK direct", "directAPKLink": "Lien direct de l'APK",
"pseudoVersionInUse": "Une pseudo-version est utilisée", "pseudoVersionInUse": "Version fictive utilisé",
"installed": "Installée", "installed": "Installée",
"latest": "Dernier", "latest": "Dernière version",
"invertRegEx": "Inverser l'expression régulière", "invertRegEx": "Inverser l'expression régulière",
"note": "Note", "note": "Note",
"selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.", "selfHostedNote": "La liste déroulante \"{}\" peut être utilisé pour accéder à des instances auto-hébergées/personnalisées de n'importe quelle source.",
"badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)",
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.", "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
"wiki": "Aide/Wiki", "wiki": "Aide/Wiki",
"crowdsourcedConfigsLabel": "Configurations d'applications participative (utilisation à vos risques et périls)", "crowdsourcedConfigsLabel": "Configurations d'applications par la communauté (à utiliser à vos risques et périls)",
"removeAppQuestion": { "removeAppQuestion": {
"one": "Supprimer l'application?", "one": "Supprimer l'application?",
"other": "Supprimer les applications?" "other": "Supprimer les applications?"
}, },
"tooManyRequestsTryAgainInMinutes": { "tooManyRequestsTryAgainInMinutes": {
"one": "Trop de demandes (taux limité) réessayez dans {} minute", "one": "Trop de requêtes (taux limité) - réessayez dans {} minute",
"other": "Trop de demandes (taux limité) réessayez dans {} minutes" "other": "Trop de requêtes (taux limité) - réessayez dans {} minutes"
}, },
"bgUpdateGotErrorRetryInMinutes": { "bgUpdateGotErrorRetryInMinutes": {
"one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute", "one": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minute",
"other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minutes" "other": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minutes"
}, },
"bgCheckFoundUpdatesWillNotifyIfNeeded": { "bgCheckFoundUpdatesWillNotifyIfNeeded": {
"one": "La vérification des mises à jour en arrière-plan a trouvée {} mise à jour l'utilisateur sera notifié si nécessaire", "one": "La recherche de mises à jour en arrière-plan à trouvée {} mise à jour - l'utilisateur sera notifié si nécessaire",
"other": "La vérification des mises à jour en arrière-plan a trouvée {} mises à jour — l'utilisateur sera notifié si nécessaire" "other": "La recherche de mises à jour en arrière-plan à trouvée {} mises à jour - l'utilisateur sera notifié si nécessaire"
}, },
"apps": { "apps": {
"one": "{} Application", "one": "{} Application",
@@ -339,7 +339,7 @@
"other": "{} URL" "other": "{} URL"
}, },
"minute": { "minute": {
"one": "{} Minutes", "one": "{} Minute",
"other": "{} Minutes" "other": "{} Minutes"
}, },
"hour": { "hour": {
@@ -351,24 +351,24 @@
"other": "{} Jours" "other": "{} Jours"
}, },
"clearedNLogsBeforeXAfterY": { "clearedNLogsBeforeXAfterY": {
"one": "{n} journal effacé (avant = {before}, après = {after})", "one": "Nettoyage du journal {n} (avant = {before}, après = {after})",
"other": "{n} journaux effacés (avant = {before}, après = {after})" "other": "Nettoyage des journaux {n} (avant = {before}, après = {after})"
}, },
"xAndNMoreUpdatesAvailable": { "xAndNMoreUpdatesAvailable": {
"one": "{} et 1 autre application ont des mises à jour.", "one": "{} et 1 autre application ont des mises à jour.",
"other": "{} et {} autres applications ont des mises à jour." "other": "{} et {} autres applications ont des mises à jour."
}, },
"xAndNMoreUpdatesInstalled": { "xAndNMoreUpdatesInstalled": {
"one": "{} et 1 autre application ont été mises à jour.", "one": "{} et 1 autre application ont étés mis à jour.",
"other": "{} et {} autres applications ont été mises à jour." "other": "{} et {} autres applications ont étés mis à jour."
}, },
"xAndNMoreUpdatesFailed": { "xAndNMoreUpdatesFailed": {
"one": "Échec de la mise à jour de {} et d'une autre application.", "one": "Échec de la mise à jour de {} et 1 autre application.",
"other": "Échec de la mise à jour de {} et {} autres applications." "other": "Échec de la mise à jour de {} et {} autres applications."
}, },
"xAndNMoreUpdatesPossiblyInstalled": { "xAndNMoreUpdatesPossiblyInstalled": {
"une": "{} et 1 application supplémentaire pourraient avoir été mises à jour.", "one": "{} et 1 autre application ont peut-être étés mis à jour.",
"other": "{} et {} autres applications pourraient avoir été mises à jour." "other": "{} et {} autres applications ont peut-être étés mis à jour."
}, },
"apk": { "apk": {
"one": "{} APK", "one": "{} APK",

View File

@@ -1,5 +1,7 @@
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@@ -29,14 +31,15 @@ class APKPure extends AppSource {
@override @override
String sourceSpecificStandardizeURL(String url) { String sourceSpecificStandardizeURL(String url) {
RegExp standardUrlRegExB = RegExp( RegExp standardUrlRegExB = RegExp(
'^https?://m.${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?', '^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
caseSensitive: false); caseSensitive: false);
RegExpMatch? match = standardUrlRegExB.firstMatch(url); RegExpMatch? match = standardUrlRegExB.firstMatch(url);
if (match != null) { if (match != null) {
url = 'https://${getSourceRegex(hosts)}${Uri.parse(url).path}'; var uri = Uri.parse(url);
url = 'https://${uri.host.substring(2)}${uri.path}';
} }
RegExp standardUrlRegExA = RegExp( RegExp standardUrlRegExA = RegExp(
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?', '^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+',
caseSensitive: false); caseSensitive: false);
match = standardUrlRegExA.firstMatch(url); match = standardUrlRegExA.firstMatch(url);
if (match == null) { if (match == null) {
@@ -58,40 +61,103 @@ class APKPure extends AppSource {
) async { ) async {
String appId = (await tryInferringAppId(standardUrl))!; String appId = (await tryInferringAppId(standardUrl))!;
String host = Uri.parse(standardUrl).host; String host = Uri.parse(standardUrl).host;
var res = await sourceRequest('$standardUrl/download', additionalSettings);
var resChangelog = await sourceRequest(standardUrl, additionalSettings); var res0 = await sourceRequest('$standardUrl/versions', additionalSettings);
if (res.statusCode == 200 && resChangelog.statusCode == 200) { var versionLinks = await grabLinksCommon(res0, {
var html = parse(res.body); 'skipSort': true,
var htmlChangelog = parse(resChangelog.body); 'customLinkFilterRegex': '$standardUrl/download/[^/]+\$'
String? version = html.querySelector('span.info-sdk span')?.text.trim(); });
if (version == null) {
throw NoVersionError(); var supportedArchs = (await DeviceInfoPlugin().androidInfo).supportedAbis;
}
String? dateString = if (additionalSettings['autoApkFilterByArch'] != true) {
html.querySelector('span.info-other span.date')?.text.trim(); // No need to request multiple versions when we're not going to filter them (always pick the top one)
DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString); versionLinks = versionLinks.sublist(0, 1);
String type = html.querySelector('a.info-tag')?.text.trim() ?? 'APK';
List<MapEntry<String, String>> apkUrls = [
MapEntry('$appId.apk',
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?version=latest')
];
String author = html
.querySelector('span.info-sdk')
?.text
.trim()
.substring(version.length + 4) ??
Uri.parse(standardUrl).pathSegments.reversed.last;
String appName =
html.querySelector('h1.info-title')?.text.trim() ?? appId;
String? changeLog = htmlChangelog
.querySelector("div.whats-new-info p:not(.date)")
?.innerHtml
.trim()
.replaceAll("<br>", " \n");
return APKDetails(version, apkUrls, AppNames(author, appName),
releaseDate: releaseDate, changeLog: changeLog);
} else {
throw getObtainiumHttpError(res);
} }
if (versionLinks.isEmpty) {
throw NoReleasesError();
}
for (var i = 0; i < versionLinks.length; i++) {
var link = versionLinks[i];
var res = await sourceRequest(link.key, additionalSettings);
if (res.statusCode == 200) {
var html = parse(res.body);
var apksDiv =
html.querySelector('#version-list div div.show-more-content');
DateTime? topReleaseDate;
var apkUrls = apksDiv
?.querySelectorAll('div.group-title')
.map((e) {
String architectureString = e.text.trim();
if (architectureString.toLowerCase() == 'unlimited' ||
architectureString.toLowerCase() == 'universal') {
architectureString = '';
}
List<String> architectures = architectureString
.split(',')
.map((e) => e.trim())
.toList();
// Only take the first APK for each architecture, ignore others for now, for simplicity
// Unclear why there can even be multiple APKs for the same version and arch
var apkInfo = e.nextElementSibling?.querySelector('div.info');
String? versionCode = RegExp('[0-9]+')
.firstMatch(apkInfo
?.querySelector('div.info-top span.code')
?.text ??
'')
?.group(0)
?.trim();
String? type = apkInfo
?.querySelector('div.info-top span.tag')
?.text
.trim() ??
'APK';
String? dateString = apkInfo
?.querySelector('div.info-bottom span.time')
?.text
.trim();
DateTime? releaseDate =
parseDateTimeMMMddCommayyyy(dateString);
if (additionalSettings['autoApkFilterByArch'] == true &&
architectures.isNotEmpty &&
architectures
.where((a) => supportedArchs.contains(a))
.isEmpty) {
return const MapEntry('', '');
}
topReleaseDate ??=
releaseDate; // Just use the release date of the first APK in the list as the release date for this version
return MapEntry(
'$appId-$versionCode-$architectureString.${type.toLowerCase()}',
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode');
})
.where((e) => e.key.isNotEmpty)
.toList() ??
[];
if (apkUrls.isEmpty) {
continue;
}
String version = Uri.parse(link.key).pathSegments.last;
String author = html
.querySelector('span.info-sdk')
?.text
.trim()
.substring(version.length + 4) ??
Uri.parse(standardUrl).pathSegments.reversed.last;
String appName =
html.querySelector('h1.info-title')?.text.trim() ?? appId;
String? changeLog = html
.querySelector('div.module.change-log')
?.innerHtml
.trim()
.replaceAll("<br>", " \n");
return APKDetails(version, apkUrls, AppNames(author, appName),
releaseDate: topReleaseDate, changeLog: changeLog);
} else {
throw getObtainiumHttpError(res);
}
}
throw NoAPKError();
} }
} }

View File

@@ -92,6 +92,73 @@ bool _isNumeric(String s) {
return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57; return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57;
} }
// Given an HTTP response, grab some links according to the common additional settings
// (those that apply to intermediate and final steps)
Future<List<MapEntry<String, String>>> grabLinksCommon(
Response res, Map<String, dynamic> additionalSettings) async {
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var html = parse(res.body);
List<MapEntry<String, String>> allLinks = html
.querySelectorAll('a')
.map((element) => MapEntry(
element.attributes['href'] ?? '',
element.text.isNotEmpty
? element.text
: (element.attributes['href'] ?? '').split('/').last))
.where((element) => element.key.isNotEmpty)
.map((e) => MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value))
.toList();
if (allLinks.isEmpty) {
allLinks = RegExp(
r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?')
.allMatches(res.body)
.map((match) =>
MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? ''))
.toList();
}
List<MapEntry<String, String>> links = [];
bool skipSort = additionalSettings['skipSort'] == true;
bool filterLinkByText = additionalSettings['filterByLinkText'] == true;
if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty ==
true) {
var reg = RegExp(additionalSettings['customLinkFilterRegex']);
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return reg.hasMatch(filterLinkByText ? element.value : link);
}).toList();
} else {
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return Uri.parse(filterLinkByText ? element.value : link)
.path
.toLowerCase()
.endsWith('.apk');
}).toList();
}
if (!skipSort) {
links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true
? compareAlphaNumeric(a.key.split('/').where((e) => e.isNotEmpty).last,
b.key.split('/').where((e) => e.isNotEmpty).last)
: compareAlphaNumeric(a.key, b.key));
}
if (additionalSettings['reverseSort'] == true) {
links = links.reversed.toList();
}
return links;
}
class HTML extends AppSource { class HTML extends AppSource {
@override @override
List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems { List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems {
@@ -225,75 +292,6 @@ class HTML extends AppSource {
return url; return url;
} }
// Given an HTTP response, grab some links according to the common additional settings
// (those that apply to intermediate and final steps)
Future<List<MapEntry<String, String>>> grabLinksCommon(
Response res, Map<String, dynamic> additionalSettings) async {
if (res.statusCode != 200) {
throw getObtainiumHttpError(res);
}
var html = parse(res.body);
List<MapEntry<String, String>> allLinks = html
.querySelectorAll('a')
.map((element) => MapEntry(
element.attributes['href'] ?? '',
element.text.isNotEmpty
? element.text
: (element.attributes['href'] ?? '').split('/').last))
.where((element) => element.key.isNotEmpty)
.map((e) =>
MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value))
.toList();
if (allLinks.isEmpty) {
allLinks = RegExp(
r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?')
.allMatches(res.body)
.map((match) =>
MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? ''))
.toList();
}
List<MapEntry<String, String>> links = [];
bool skipSort = additionalSettings['skipSort'] == true;
bool filterLinkByText = additionalSettings['filterByLinkText'] == true;
if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty ==
true) {
var reg = RegExp(additionalSettings['customLinkFilterRegex']);
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return reg.hasMatch(filterLinkByText ? element.value : link);
}).toList();
} else {
links = allLinks.where((element) {
var link = element.key;
try {
link = Uri.decodeFull(element.key);
} catch (e) {
// Some links may not have valid encoding
}
return Uri.parse(filterLinkByText ? element.value : link)
.path
.toLowerCase()
.endsWith('.apk');
}).toList();
}
if (!skipSort) {
links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true
? compareAlphaNumeric(
a.key.split('/').where((e) => e.isNotEmpty).last,
b.key.split('/').where((e) => e.isNotEmpty).last)
: compareAlphaNumeric(a.key, b.key));
}
if (additionalSettings['reverseSort'] == true) {
links = links.reversed.toList();
}
return links;
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,

View File

@@ -1077,7 +1077,9 @@ class AppsPageState extends State<AppsPage> {
IconButton( IconButton(
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
style: const ButtonStyle(visualDensity: VisualDensity.compact), style: const ButtonStyle(visualDensity: VisualDensity.compact),
tooltip: '${tr('filter')}${isFilterOff ? '' : ' *'}', tooltip: isFilterOff
? tr('filterApps')
: '${tr('filter')} - ${tr('remove')}',
onPressed: isFilterOff onPressed: isFilterOff
? showFilterDialog ? showFilterDialog
: () { : () {
@@ -1086,8 +1088,8 @@ class AppsPageState extends State<AppsPage> {
}); });
}, },
icon: Icon(isFilterOff icon: Icon(isFilterOff
? Icons.filter_list_rounded ? Icons.search_rounded
: Icons.filter_list_off_rounded)), : Icons.search_off_rounded)),
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),

View File

@@ -367,7 +367,7 @@ class AppsProvider with ChangeNotifier {
AppsProvider({isBg = false}) { AppsProvider({isBg = false}) {
// Subscribe to changes in the app foreground status // Subscribe to changes in the app foreground status
foregroundStream = FGBGEvents.stream.asBroadcastStream(); foregroundStream = FGBGEvents.instance.stream.asBroadcastStream();
foregroundSubscription = foregroundStream?.listen((event) async { foregroundSubscription = foregroundStream?.listen((event) async {
isForeground = event == FGBGType.foreground; isForeground = event == FGBGType.foreground;
if (isForeground) { if (isForeground) {
@@ -572,7 +572,7 @@ class AppsProvider with ChangeNotifier {
if (!isForeground) { if (!isForeground) {
await notificationsProvider.notify(completeInstallationNotification, await notificationsProvider.notify(completeInstallationNotification,
cancelExisting: true); cancelExisting: true);
while (await FGBGEvents.stream.first != FGBGType.foreground) {} while (await FGBGEvents.instance.stream.first != FGBGType.foreground) {}
await notificationsProvider.cancel(completeInstallationNotification.id); await notificationsProvider.cancel(completeInstallationNotification.id);
} }
} }

View File

@@ -763,9 +763,9 @@ class SourceProvider {
APKPure(), APKPure(),
Aptoide(), Aptoide(),
Uptodown(), Uptodown(),
APKMirror(),
HuaweiAppGallery(), HuaweiAppGallery(),
Jenkins(), Jenkins(),
APKMirror(),
Signal(), Signal(),
VLC(), VLC(),
WhatsApp(), WhatsApp(),

View File

@@ -5,10 +5,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: android_intent_plus name: android_intent_plus
sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074" sha256: "007703c1b2cac7ca98add3336b98cffa4baa11d5133cc463293dba9daa39cdf6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.2" version: "5.1.0"
android_package_installer: android_package_installer:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -71,10 +71,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: app_links_web name: app_links_web
sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1" sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.3" version: "1.0.4"
archive: archive:
dependency: transitive dependency: transitive
description: description:
@@ -159,26 +159,26 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: connectivity_plus name: connectivity_plus
sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 sha256: "3e7d1d9dbae40ae82cbe6c23c518f0c4ffe32764ee9749b9a99d32cbac8734f6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.3" version: "6.0.4"
connectivity_plus_platform_interface: connectivity_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: connectivity_plus_platform_interface name: connectivity_plus_platform_interface
sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "2.0.1"
cross_file: cross_file:
dependency: transitive dependency: transitive
description: description:
name: cross_file name: cross_file
sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.4+1" version: "0.3.4+2"
crypto: crypto:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -215,18 +215,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info_plus name: device_info_plus
sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 sha256: "93429694c9253d2871b3af80cf11b3cbb5c65660d402ed7bf69854ce4a089f82"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.1.0" version: "10.1.1"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus_platform_interface name: device_info_plus_platform_interface
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.0" version: "7.0.1"
dynamic_color: dynamic_color:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -287,10 +287,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: "824f5b9f389bfc4dddac3dea76cd70c51092d9dff0b2ece7ef4f53db8547d258" sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.0.6" version: "8.0.7"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@@ -332,10 +332,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_fgbg name: flutter_fgbg
sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" sha256: "5e61a2ff2e2e83614ae7690bea3dfa74bbd91b5c083e81ce07692411ce65e3d7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.0" version: "0.4.0"
flutter_keyboard_visibility: flutter_keyboard_visibility:
dependency: transitive dependency: transitive
description: description:
@@ -475,10 +475,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: fraction name: fraction
sha256: "09e9504c9177bbd77df56e5d147abfbb3b43360e64bf61510059c14d6a82d524" sha256: ac0d9904bb8211eb28606bdf623ff9f222c53240d8e9b927a07c149d356eddc2
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.2" version: "5.0.3"
gtk: gtk:
dependency: transitive dependency: transitive
description: description:
@@ -547,18 +547,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.4" version: "10.0.5"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "3.0.5"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
@@ -595,18 +595,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.0" version: "0.11.1"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.12.0" version: "1.15.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@@ -643,18 +643,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.4"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: e84c8a53fe1510ef4582f118c7b4bdf15b03002b51d7c2b66983c65843d61193 sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.8" version: "2.2.9"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
@@ -699,10 +699,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_android name: permission_handler_android
sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54 sha256: eaf2a1ec4472775451e88ca6a7b86559ef2f1d1ed903942ed135e38ea0097dca
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "12.0.7" version: "12.0.8"
permission_handler_apple: permission_handler_apple:
dependency: transitive dependency: transitive
description: description:
@@ -723,10 +723,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_platform_interface name: permission_handler_platform_interface
sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.2.1" version: "4.2.2"
permission_handler_windows: permission_handler_windows:
dependency: transitive dependency: transitive
description: description:
@@ -763,10 +763,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointer_interceptor name: pointer_interceptor
sha256: d0a8e660d1204eaec5bd34b34cc92174690e076d2e4f893d9d68c486a13b07c4 sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.10.1+1" version: "0.10.1+2"
pointer_interceptor_ios: pointer_interceptor_ios:
dependency: transitive dependency: transitive
description: description:
@@ -787,10 +787,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: pointer_interceptor_web name: pointer_interceptor_web
sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.10.2" version: "0.10.2+1"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -803,74 +803,74 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: share_plus name: share_plus
sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 sha256: "59dfd53f497340a0c3a81909b220cfdb9b8973a91055c4e5ab9b9b9ad7c513c0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.0.0" version: "10.0.0"
share_plus_platform_interface: share_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: share_plus_platform_interface name: share_plus_platform_interface
sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.0" version: "5.0.0"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 sha256: c272f9cabca5a81adc9b0894381e9c1def363e980f960fa903c604c471b22f68
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.3" version: "2.3.1"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_android name: shared_preferences_android
sha256: "3d4571b3c5eb58ce52a419d86e655493d0bc3020672da79f72fa0c16ca3a8ec1" sha256: "041be4d9d2dc6079cf342bc8b761b03787e3b71192d658220a56cac9c04a0294"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.4" version: "2.3.0"
shared_preferences_foundation: shared_preferences_foundation:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_foundation name: shared_preferences_foundation
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" sha256: "671e7a931f55a08aa45be2a13fe7247f2a41237897df434b30d2012388191833"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.5.0"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_linux name: shared_preferences_linux
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" sha256: "2ba0510d3017f91655b7543e9ee46d48619de2a2af38e5c790423f7007c7ccc1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.2" version: "2.4.0"
shared_preferences_platform_interface: shared_preferences_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
sha256: "034650b71e73629ca08a0bd789fd1d83cc63c2d1e405946f7cef7bc37432f93a" sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.4.1"
shared_preferences_web: shared_preferences_web:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" sha256: "59dc807b94d29d52ddbb1b3c0d3b9d0a67fc535a64e62a5542c8db0513fcb6c2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.0" version: "2.4.1"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_windows name: shared_preferences_windows
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" sha256: "398084b47b7f92110683cac45c6dc4aae853db47e470e5ddcd52cab7f7196ab2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.2" version: "2.4.0"
shared_storage: shared_storage:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -969,10 +969,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.0" version: "0.7.2"
timezone: timezone:
dependency: transitive dependency: transitive
description: description:
@@ -1001,10 +1001,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
sha256: c24484594a8dea685610569ab0f2547de9c7a1907500a9bc5e37e4c9a3cbfb23 sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.6" version: "6.3.8"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
@@ -1041,10 +1041,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.3.3"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
@@ -1073,10 +1073,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.1" version: "14.2.4"
web: web:
dependency: transitive dependency: transitive
description: description:
@@ -1097,10 +1097,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: webview_flutter_android name: webview_flutter_android
sha256: "060e1a621add859dc822f3e4c59b01468e8515ea78cfc5ac4c6b28bc903b5f74" sha256: c66651fba15f9d7ddd31daec42da8d6bce46c85610a7127e3ebcb39a4395c3c9
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.16.5" version: "3.16.6"
webview_flutter_platform_interface: webview_flutter_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -1121,10 +1121,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.5.1" version: "5.5.3"
win32_registry: win32_registry:
dependency: transitive dependency: transitive
description: description:

View File

@@ -1,5 +1,5 @@
name: obtainium name: obtainium
description: Get Android App Updates Directly From the Source. description: Get Android app updates straight from the source.
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
@@ -17,7 +17,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 # 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 # 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. # of the product and file versions while build-number is used as the build suffix.
version: 1.1.15+2272 version: 1.1.18+2275
environment: environment:
sdk: '>=3.0.0 <4.0.0' sdk: '>=3.0.0 <4.0.0'
@@ -37,7 +37,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.5 cupertino_icons: ^1.0.5
path_provider: ^2.0.11 path_provider: ^2.0.11
flutter_fgbg: ^0.3.0 # Try removing reliance on this flutter_fgbg: ^0.4.0
flutter_local_notifications: ^17.0.0 flutter_local_notifications: ^17.0.0
provider: ^6.0.3 provider: ^6.0.3
http: ^1.0.0 http: ^1.0.0
@@ -56,7 +56,7 @@ dependencies:
url: https://github.com/ImranR98/android_package_installer url: https://github.com/ImranR98/android_package_installer
ref: main ref: main
android_package_manager: ^0.7.0 android_package_manager: ^0.7.0
share_plus: ^9.0.0 share_plus: ^10.0.0
sqflite: ^2.2.0+3 sqflite: ^2.2.0+3
easy_localization: ^3.0.1 easy_localization: ^3.0.1
android_intent_plus: ^5.0.1 android_intent_plus: ^5.0.1