mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 05:23:28 +01:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
			v0.11.11-b
			...
			v0.11.12-b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | cd86d6112b | ||
|  | 1112c79c14 | ||
|  | 08555bac75 | ||
|  | 6db31e2b24 | ||
|  | 48d2532323 | ||
|  | f1fc43a3e7 | ||
|  | 280827d8ec | 
| @@ -20,6 +20,7 @@ Currently supported App sources: | ||||
|   - Any URLs ending with `/fdroid/<word>`, where `<word>` can be anything - most often `repo` | ||||
| - [Steam](https://store.steampowered.com/mobile) | ||||
| - [Telegram App](https://telegram.org) | ||||
| - [VLC](https://www.videolan.org/vlc/download-android.html) | ||||
| - [Neutron Code](https://neutroncode.com) | ||||
| - "HTML" (Fallback) | ||||
|   - Any other URL that returns an HTML page with links to APK files (if multiple, the last file alphabetically is picked) | ||||
|   | ||||
							
								
								
									
										62
									
								
								lib/app_sources/vlc.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								lib/app_sources/vlc.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| import 'package:html/parser.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
|  | ||||
| class VLC extends AppSource { | ||||
|   VLC() { | ||||
|     host = 'videolan.org'; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String standardizeURL(String url) { | ||||
|     return 'https://$host'; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<APKDetails> getLatestAPKDetails( | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     Response res = await get( | ||||
|         Uri.parse('https://www.videolan.org/vlc/download-android.html')); | ||||
|     if (res.statusCode == 200) { | ||||
|       var dwUrlBase = 'get.videolan.org/vlc-android'; | ||||
|       var dwLinks = parse(res.body) | ||||
|           .querySelectorAll('a') | ||||
|           .where((element) => | ||||
|               element.attributes['href']?.contains(dwUrlBase) ?? false) | ||||
|           .toList(); | ||||
|       String? version = dwLinks.isNotEmpty | ||||
|           ? dwLinks.first.attributes['href'] | ||||
|               ?.split('/') | ||||
|               .where((s) => s.isNotEmpty) | ||||
|               .last | ||||
|           : null; | ||||
|       if (version == null) { | ||||
|         throw NoVersionError(); | ||||
|       } | ||||
|       String? targetUrl = 'https://$dwUrlBase/$version/'; | ||||
|       Response res2 = await get(Uri.parse(targetUrl)); | ||||
|       String mirrorDwBase = | ||||
|           'https://plug-mirror.rcac.purdue.edu/vlc/vlc-android/$version/'; | ||||
|       List<String> apkUrls = []; | ||||
|       if (res2.statusCode == 200) { | ||||
|         apkUrls = parse(res2.body) | ||||
|             .querySelectorAll('a') | ||||
|             .map((e) => e.attributes['href']) | ||||
|             .where((h) => | ||||
|                 h != null && h.isNotEmpty && h.toLowerCase().endsWith('.apk')) | ||||
|             .map((e) => mirrorDwBase + e!) | ||||
|             .toList(); | ||||
|       } else { | ||||
|         throw getObtainiumHttpError(res2); | ||||
|       } | ||||
|  | ||||
|       return APKDetails(version, apkUrls, AppNames('VideoLAN', 'VLC')); | ||||
|     } else { | ||||
|       throw getObtainiumHttpError(res); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -476,6 +476,7 @@ class _GeneratedFormState extends State<GeneratedForm> { | ||||
|         rowItems.add(Expanded( | ||||
|             child: Column( | ||||
|                 crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|                 mainAxisSize: MainAxisSize.min, | ||||
|                 children: [ | ||||
|               rowInput.value, | ||||
|               ...widget.items[rowInputs.key][rowInput.key].belowWidgets | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; | ||||
| // ignore: implementation_imports | ||||
| import 'package:easy_localization/src/localization.dart'; | ||||
|  | ||||
| const String currentVersion = '0.11.11'; | ||||
| const String currentVersion = '0.11.12'; | ||||
| const String currentReleaseTag = | ||||
|     'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:flutter_markdown/flutter_markdown.dart'; | ||||
| import 'package:obtainium/components/custom_app_bar.dart'; | ||||
| import 'package:obtainium/components/generated_form.dart'; | ||||
| import 'package:obtainium/components/generated_form_modal.dart'; | ||||
| @@ -14,6 +15,7 @@ import 'package:obtainium/providers/source_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| import 'package:share_plus/share_plus.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
| import 'package:markdown/markdown.dart' as md; | ||||
|  | ||||
| class AppsPage extends StatefulWidget { | ||||
|   const AppsPage({super.key}); | ||||
| @@ -229,8 +231,9 @@ class AppsPageState extends State<AppsPage> { | ||||
|             SliverList( | ||||
|                 delegate: SliverChildBuilderDelegate( | ||||
|                     (BuildContext context, int index) { | ||||
|               String? changesUrl = SourceProvider() | ||||
|                   .getSource(listedApps[index].app.url) | ||||
|               AppSource appSource = | ||||
|                   SourceProvider().getSource(listedApps[index].app.url); | ||||
|               String? changesUrl = appSource | ||||
|                   .changeLogPageFromStandardUrl(listedApps[index].app.url); | ||||
|               String? changeLog = listedApps[index].app.changeLog; | ||||
|               var showChanges = (changeLog == null && changesUrl == null) | ||||
| @@ -242,14 +245,8 @@ class AppsPageState extends State<AppsPage> { | ||||
|                             builder: (BuildContext context) { | ||||
|                               return GeneratedFormModal( | ||||
|                                 title: tr('changes'), | ||||
|                                 items: [], | ||||
|                                 items: const [], | ||||
|                                 additionalWidgets: [ | ||||
|                                   Text(changeLog), | ||||
|                                   changesUrl != null | ||||
|                                       ? const SizedBox( | ||||
|                                           height: 16, | ||||
|                                         ) | ||||
|                                       : const SizedBox.shrink(), | ||||
|                                   changesUrl != null | ||||
|                                       ? GestureDetector( | ||||
|                                           child: Text( | ||||
| @@ -265,7 +262,48 @@ class AppsPageState extends State<AppsPage> { | ||||
|                                                     .externalApplication); | ||||
|                                           }, | ||||
|                                         ) | ||||
|                                       : const SizedBox.shrink() | ||||
|                                       : const SizedBox.shrink(), | ||||
|                                   changesUrl != null | ||||
|                                       ? const SizedBox( | ||||
|                                           height: 16, | ||||
|                                         ) | ||||
|                                       : const SizedBox.shrink(), | ||||
|                                   appSource.changeLogIfAnyIsMarkDown | ||||
|                                       ? SizedBox( | ||||
|                                           width: | ||||
|                                               MediaQuery.of(context).size.width, | ||||
|                                           height: MediaQuery.of(context) | ||||
|                                                   .size | ||||
|                                                   .height - | ||||
|                                               350, | ||||
|                                           child: Markdown( | ||||
|                                             data: changeLog, | ||||
|                                             onTapLink: (text, href, title) { | ||||
|                                               if (href != null) { | ||||
|                                                 launchUrlString( | ||||
|                                                     href.startsWith( | ||||
|                                                                 'http://') || | ||||
|                                                             href.startsWith( | ||||
|                                                                 'https://') | ||||
|                                                         ? href | ||||
|                                                         : '${Uri.parse(listedApps[index].app.url).origin}/$href', | ||||
|                                                     mode: LaunchMode | ||||
|                                                         .externalApplication); | ||||
|                                               } | ||||
|                                             }, | ||||
|                                             extensionSet: md.ExtensionSet( | ||||
|                                               md.ExtensionSet.gitHubFlavored | ||||
|                                                   .blockSyntaxes, | ||||
|                                               [ | ||||
|                                                 md.EmojiSyntax(), | ||||
|                                                 ...md | ||||
|                                                     .ExtensionSet | ||||
|                                                     .gitHubFlavored | ||||
|                                                     .inlineSyntaxes | ||||
|                                               ], | ||||
|                                             ), | ||||
|                                           )) | ||||
|                                       : Text(changeLog), | ||||
|                                 ], | ||||
|                                 singleNullReturnButton: tr('ok'), | ||||
|                               ); | ||||
| @@ -413,7 +451,9 @@ class AppsPageState extends State<AppsPage> { | ||||
|                                           child: Text( | ||||
|                                             listedApps[index].app.releaseDate == | ||||
|                                                     null | ||||
|                                                 ? tr('changes') | ||||
|                                                 ? showChanges != null | ||||
|                                                     ? tr('changes') | ||||
|                                                     : '' | ||||
|                                                 : DateFormat('yyyy-MM-dd') | ||||
|                                                     .format(listedApps[index] | ||||
|                                                         .app | ||||
|   | ||||
| @@ -20,6 +20,7 @@ import 'package:obtainium/app_sources/signal.dart'; | ||||
| import 'package:obtainium/app_sources/sourceforge.dart'; | ||||
| import 'package:obtainium/app_sources/steammobile.dart'; | ||||
| import 'package:obtainium/app_sources/telegramapp.dart'; | ||||
| import 'package:obtainium/app_sources/vlc.dart'; | ||||
| import 'package:obtainium/components/generated_form.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/mass_app_sources/githubstars.dart'; | ||||
| @@ -228,6 +229,7 @@ class AppSource { | ||||
|   String? host; | ||||
|   late String name; | ||||
|   bool enforceTrackOnly = false; | ||||
|   bool changeLogIfAnyIsMarkDown = true; | ||||
|  | ||||
|   AppSource() { | ||||
|     name = runtimeType.toString(); | ||||
| @@ -347,6 +349,7 @@ class SourceProvider { | ||||
|     FDroidRepo(), | ||||
|     SteamMobile(), | ||||
|     TelegramApp(), | ||||
|     VLC(), | ||||
|     NeutronCode(), | ||||
|     HTML() // This should ALWAYS be the last option as they are tried in order | ||||
|   ]; | ||||
|   | ||||
							
								
								
									
										24
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -235,6 +235,14 @@ packages: | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   flutter_markdown: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_markdown | ||||
|       sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.6.14" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -325,6 +333,14 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.0.1" | ||||
|   markdown: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: markdown | ||||
|       sha256: b3c60dee8c2af50ad0e6e90cceba98e47718a6ee0a7a6772c77846a0cc21f78b | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "7.0.1" | ||||
|   matcher: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -702,10 +718,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: url_launcher_ios | ||||
|       sha256: "7ab1e5b646623d6a2537aa59d5d039f90eebef75a7c25e105f6f75de1f7750c3" | ||||
|       sha256: "3dedc66ca3c0bef9e6a93c0999aee102556a450afcc1b7bcfeace7a424927d92" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.1.2" | ||||
|     version: "6.1.3" | ||||
|   url_launcher_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -766,10 +782,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: webview_flutter | ||||
|       sha256: b6cd42db3ced5411f3d01599906156885b18e4188f7065a8a351eb84bee347e0 | ||||
|       sha256: "47663d51a9061451aa3880a214ee9a65dcbb933b77bc44388e194279ab3ccaf6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.0.6" | ||||
|     version: "4.0.7" | ||||
|   webview_flutter_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|   | ||||
| @@ -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 | ||||
| # 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: 0.11.11+132 # When changing this, update the tag in main() accordingly | ||||
| version: 0.11.12+133 # When changing this, update the tag in main() accordingly | ||||
|  | ||||
| environment: | ||||
|   sdk: '>=2.18.2 <3.0.0' | ||||
| @@ -59,6 +59,7 @@ dependencies: | ||||
|   sqflite: ^2.2.0+3 | ||||
|   easy_localization: ^3.0.1 | ||||
|   android_intent_plus: ^3.1.5 | ||||
|   flutter_markdown: ^0.6.14 | ||||
|  | ||||
|  | ||||
| dev_dependencies: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user