From 3f50726e2a4aa3f3f9296c1c5da155a9bbfb8587 Mon Sep 17 00:00:00 2001 From: dasmikko Date: Tue, 7 Feb 2023 16:32:51 +0100 Subject: [PATCH] embed stuff --- lib/helpers/twitterApi.dart | 54 --------- lib/main.dart | 11 -- lib/main_nonfrdoid.dart | 11 -- lib/widgets/bbcode/bbcodeRendererNew.dart | 12 +- lib/widgets/post/postsElements/twitter.dart | 26 ++--- lib/widgets/post/postsElements/vocaroo.dart | 121 ++++++++++++++------ pubspec.yaml | 5 +- 7 files changed, 99 insertions(+), 141 deletions(-) delete mode 100644 lib/helpers/twitterApi.dart diff --git a/lib/helpers/twitterApi.dart b/lib/helpers/twitterApi.dart deleted file mode 100644 index e9e1c2a..0000000 --- a/lib/helpers/twitterApi.dart +++ /dev/null @@ -1,54 +0,0 @@ -// ignore_for_file: unnecessary_brace_in_string_interps - -import 'dart:convert'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:get_storage/get_storage.dart'; -import 'package:http/http.dart' as http; - -class TwitterHelper { - final String? _consumerKey = dotenv.env['TWITTER_CONSUMER']; - final String? _consumerSecret = dotenv.env['TWITTER_SECRET']; - - Future getBearerToken() async { - var bytes = utf8.encode(_consumerKey! + ':' + _consumerSecret!); - var base64Str = base64.encode(bytes); - - try { - http.Response httpResponse = - await http.post(Uri.parse('https://api.twitter.com/oauth2/token'), - headers: { - 'Authorization': 'Basic ${base64Str}', - 'Content-Type': - 'application/x-www-form-urlencoded;charset=UTF-8' - }, - body: 'grant_type=client_credentials'); - Map json = jsonDecode(httpResponse.body); - - GetStorage prefs = GetStorage(); - prefs.write('twitterBearerToken', json['access_token']); - } catch (e) { - print('Error'); - } - } - - Future?> getTweet(int tweetId) async { - GetStorage prefs = GetStorage(); - String? bearerToken = prefs.read('twitterBearerToken'); - - try { - http.Response httpResponse = await http.get( - Uri.parse('https://api.twitter.com/1.1/statuses/show.json?id=' + - tweetId.toString()), - headers: { - 'Authorization': 'Bearer ${bearerToken}', - 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' - }); - - Map? jsonMap = jsonDecode(httpResponse.body); - return jsonMap; - } catch (e) { - print('Error'); - return null; - } - } -} diff --git a/lib/main.dart b/lib/main.dart index 3d0d72b..85ffcd7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,11 +5,9 @@ import 'package:get/get.dart'; import 'package:knocky/controllers/authController.dart'; import 'package:knocky/controllers/settingsController.dart'; import 'package:knocky/helpers/themeService.dart'; -import 'package:knocky/helpers/twitterApi.dart'; import 'package:knocky/screens/forum.dart'; import 'package:get_storage/get_storage.dart'; import 'package:knocky/themes/DarkTheme.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:layout/layout.dart'; void main() async { @@ -26,9 +24,6 @@ void main() async { "allowUpdater": false, }); - // Init dotenv - await dotenv.load(fileName: 'assets/.env'); - GetStorage prefs = GetStorage(); if (prefs.read('env') == null) { @@ -47,12 +42,6 @@ void main() async { authController.getStoredAuthInfo(); - try { - await TwitterHelper().getBearerToken(); - } catch (e) { - print('Fetching bearer token failed'); - } - SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( systemNavigationBarColor: Colors.grey[900], systemNavigationBarIconBrightness: Brightness.light)); diff --git a/lib/main_nonfrdoid.dart b/lib/main_nonfrdoid.dart index 90535a4..d529b49 100644 --- a/lib/main_nonfrdoid.dart +++ b/lib/main_nonfrdoid.dart @@ -4,12 +4,10 @@ import 'package:get/get.dart'; import 'package:knocky/controllers/authController.dart'; import 'package:knocky/controllers/settingsController.dart'; import 'package:knocky/helpers/themeService.dart'; -import 'package:knocky/helpers/twitterApi.dart'; import 'package:knocky/screens/forum.dart'; import 'package:get_storage/get_storage.dart'; import 'package:knocky/themes/DarkTheme.dart'; import 'package:flutter_flavor/flutter_flavor.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:layout/layout.dart'; void main() async { @@ -26,9 +24,6 @@ void main() async { "allowUpdater": true, }); - // Init dotenv - await dotenv.load(fileName: 'assets/.env'); - GetStorage prefs = GetStorage(); if (prefs.read('env') == null) { @@ -47,12 +42,6 @@ void main() async { authController.getStoredAuthInfo(); - try { - await TwitterHelper().getBearerToken(); - } catch (e) { - print('Fetching bearer token failed'); - } - SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( systemNavigationBarColor: Colors.grey[900], systemNavigationBarIconBrightness: Brightness.light)); diff --git a/lib/widgets/bbcode/bbcodeRendererNew.dart b/lib/widgets/bbcode/bbcodeRendererNew.dart index 06359c6..dace3b1 100644 --- a/lib/widgets/bbcode/bbcodeRendererNew.dart +++ b/lib/widgets/bbcode/bbcodeRendererNew.dart @@ -63,15 +63,10 @@ class _BBcodeRendererNewState extends State { } InlineSpan _twitterNodeHandler(bbob.Element node) { - print(node.textContent); return WidgetSpan( - child: Container( - margin: EdgeInsets.only(bottom: 8), - child: EmbedWidget( - url: node.textContent, - ), - ), - ); + child: TwitterCard( + tweetUrl: node.textContent, + )); } InlineSpan _vocarooNodeHandler(bbob.Element node) { @@ -288,7 +283,6 @@ class _BBcodeRendererNewState extends State { break; case 'img': case 'img thumbnail': - print(node); spans.add(_imageNodeHandler(node)); break; case 'blockquote': diff --git a/lib/widgets/post/postsElements/twitter.dart b/lib/widgets/post/postsElements/twitter.dart index ab548b8..9f50cfd 100644 --- a/lib/widgets/post/postsElements/twitter.dart +++ b/lib/widgets/post/postsElements/twitter.dart @@ -1,11 +1,6 @@ import 'package:after_layout/after_layout.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; -import 'package:knocky/helpers/twitterApi.dart'; import 'package:knocky/widgets/InkWellOnWidget.dart'; -import 'package:measure_size/measure_size.dart'; -import 'package:tweet_ui/tweet_ui.dart'; import 'package:url_launcher/url_launcher_string.dart'; class TwitterCard extends StatefulWidget { @@ -26,8 +21,7 @@ class _TwitterCardState extends State late Map _twitterJson; @override - void afterFirstLayout(BuildContext context) { - } + void afterFirstLayout(BuildContext context) {} @override void dispose() { @@ -42,8 +36,8 @@ class _TwitterCardState extends State decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/twitter_logo_blue.png'), - fit: BoxFit.cover, - alignment: Alignment.topCenter), + fit: BoxFit.fitWidth, + alignment: Alignment.center), ), ); } @@ -58,7 +52,7 @@ class _TwitterCardState extends State child: InkWellOverWidget( onTap: () async { try { - await launchUrlString(this.widget.url!, + await launchUrlString(this.widget.tweetUrl!, mode: LaunchMode.externalNonBrowserApplication); } catch (e) { throw 'Could not launch $this.widget.url'; @@ -78,23 +72,23 @@ class _TwitterCardState extends State Container( margin: EdgeInsets.only(bottom: 15), child: Text( - 'Open tweet', + 'Tweet', style: TextStyle(fontWeight: FontWeight.bold), )), Container( margin: EdgeInsets.only(bottom: 15), - child: - Text(_description!, style: TextStyle(fontSize: 12)), + child: Text('Tap to view tweet', + style: TextStyle(fontSize: 12)), ), Text( - this.widget.url != null - ? this.widget.url! + this.widget.tweetUrl != null + ? this.widget.tweetUrl! : 'wtf no url', style: TextStyle(fontSize: 12, color: Colors.blue)), ], ), ), - ].where(notNull).toList(), + ].toList(), ), ), ), diff --git a/lib/widgets/post/postsElements/vocaroo.dart b/lib/widgets/post/postsElements/vocaroo.dart index 5f8031f..af1bee1 100644 --- a/lib/widgets/post/postsElements/vocaroo.dart +++ b/lib/widgets/post/postsElements/vocaroo.dart @@ -1,51 +1,100 @@ -import 'package:better_player/better_player.dart'; +import 'package:chewie/chewie.dart'; +import 'package:chewie_audio/chewie_audio.dart'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_custom_tabs/flutter_custom_tabs.dart'; +import 'package:video_player/video_player.dart'; -class VocarooEmbed extends StatelessWidget { +class VocarooEmbed extends StatefulWidget { final String? url; const VocarooEmbed({Key? key, this.url}) : super(key: key); @override - Widget build(BuildContext context) { - String id = url!.split('/').last; + State createState() => _VocarooEmbedState(); +} + +class _VocarooEmbedState extends State { + late VideoPlayerController videoPlayerController; + ChewieAudioController? chewieController; + + @override + void initState() { + super.initState(); + initializePlayer(); + } + + Future initializePlayer() async { + String id = widget.url!.split('/').last; + videoPlayerController = VideoPlayerController.network( + "https://media1.vocaroo.com/mp3/$id", + formatHint: VideoFormat.other, + httpHeaders: { + 'Referer': 'https://vocaroo.com/', + }); + await videoPlayerController.initialize(); + chewieController = await ChewieAudioController( + videoPlayerController: videoPlayerController, + ); + setState(() {}); + } + @override + void dispose() { + videoPlayerController?.dispose(); + chewieController?.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { return Container( - margin: EdgeInsets.only(bottom: 8), + margin: EdgeInsets.only(bottom: 12), child: ClipRRect( - borderRadius: BorderRadius.circular(8), clipBehavior: Clip.antiAlias, - child: BetterPlayer.network( - "https://media1.vocaroo.com/mp3/$id", - betterPlayerConfiguration: BetterPlayerConfiguration( - overlay: Container( - color: Color.fromARGB(255, 202, 255, 112), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - margin: EdgeInsets.only(bottom: 12), - child: ExtendedImage.network( - "https://cdn.vocaroo.com/images/mascot-robot-100px.png", - ), - ), - Text( - 'Vocaroo', - style: TextStyle(color: Colors.grey[800]), - ) - ], - ), - ), - controlsConfiguration: BetterPlayerControlsConfiguration( - enableQualities: false, - enableSubtitles: false, - enableAudioTracks: true, - enableFullscreen: false, - enableSkips: false, - ), - autoDetectFullscreenDeviceOrientation: true, - fit: BoxFit.contain, + borderRadius: BorderRadius.all( + Radius.circular(16), + ), + child: Container( + decoration: BoxDecoration( + color: Color.fromARGB(255, 202, 255, 112), ), + child: chewieController != null && + chewieController!.videoPlayerController.value.isInitialized + ? Column( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.only(bottom: 12), + child: ExtendedImage.network( + "https://cdn.vocaroo.com/images/mascot-robot-100px.png", + ), + ), + OutlinedButton( + style: OutlinedButton.styleFrom( + side: BorderSide(width: 2.0, color: Colors.black54), + ), + child: Text( + 'Open in browser', + style: TextStyle(color: Colors.black54), + ), + onPressed: () async { + try { + await launch(this.widget.url!); + } catch (e) { + throw 'Could not launch $this.widget.url'; + } + }, + ), + ], + ), + ChewieAudio( + controller: chewieController!, + ) + ], + ) + : Center(child: Text('Loading vocaroo embed')), ), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 4086866..74518b1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,11 +43,9 @@ dependencies: permission_handler: 10.2.0 matrix4_transform: 2.0.1 duration: 3.0.12 - tweet_ui: 4.0.4 chewie: 1.4.0 + chewie_audio: ^1.3.0 video_player: 2.5.1 - better_player: 0.0.83 - flutter_dotenv: 5.0.2 popover: 0.2.8 sticky_headers: 0.3.0+2 event_bus: 2.0.0 @@ -87,7 +85,6 @@ flutter: assets: - - assets/.env - assets/logo.png - assets/twitter_logo_blue.png - assets/icons.json