From 677986e1e1ea91a00be0dc09db3013b301653ab9 Mon Sep 17 00:00:00 2001 From: jscampucci Date: Fri, 5 Jul 2024 15:24:41 +0200 Subject: [PATCH 1/3] [format] add M4A --- lib/constants.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/constants.dart b/lib/constants.dart index 542cad3..053ca64 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -10,10 +10,12 @@ const colorMainBlue = Color(0xFF1f74ad); enum Format { mp3( format: 'MP3', + ytCmd: 'bestaudio[ext=m4a]/bestaudio[ext=webm]', ffmpegCmd: '-f mp3 -loglevel quiet -ab 192k -vn', extension: 'mp3'), mp3HD( format: 'MP3 HD', + ytCmd: 'bestaudio[ext=m4a]/bestaudio[ext=webm]', ffmpegCmd: '-f mp3 -loglevel quiet -ab 320k -vn', extension: 'mp3'), mp4(format: 'MP4'), @@ -35,7 +37,11 @@ enum Format { ffmpegCmd: '-vcodec libx264 -preset slower -b 512k -bt 512k -threads 0 -s 640x360 -aspect 16:9 -acodec libmp3lame -ar 44100 -ab 32 -progress pipe:1', extension: 'flv'), - m4a(format: 'M4A'), + m4a( + format: 'M4A', + ytCmd: 'bestaudio[ext=m4a]', + extension: 'm4a', + ), ; final String ytCmd; From b6ff203e4b45b7c45c800ac0b22268c6ab06d961 Mon Sep 17 00:00:00 2001 From: jscampucci Date: Fri, 5 Jul 2024 15:25:46 +0200 Subject: [PATCH 2/3] [clean] add logger --- lib/main.dart | 12 ++++++++++ lib/services/download.dart | 24 +++++++++++++++++-- lib/services/file_logger.dart | 45 +++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 lib/services/file_logger.dart diff --git a/lib/main.dart b/lib/main.dart index 8f35de8..e88978a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,13 +1,19 @@ +import 'dart:async'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:logger/logger.dart'; import 'package:notube/screens/settings.dart'; import 'package:notube/wrapper.dart'; import 'package:notube/constants.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:window_manager/window_manager.dart'; import 'package:upgrader/upgrader.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:notube/videoList/cubit/videos_cubit.dart'; +import 'package:notube/services/file_logger.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -25,6 +31,12 @@ void main() async { await windowManager.focus(); }); + await FileLogger().init(); + + FlutterError.onError = (FlutterErrorDetails details) { + FileLogger().e('FlutterError', details.exception, details.stack); + }; + runApp( EasyLocalization( supportedLocales: [Locale('en', 'US'), Locale('fr', 'FR')], diff --git a/lib/services/download.dart b/lib/services/download.dart index 7a981ef..f261797 100644 --- a/lib/services/download.dart +++ b/lib/services/download.dart @@ -2,8 +2,11 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'package:get/get_navigation/src/nav2/get_router_delegate.dart'; +import 'package:logger/logger.dart'; import 'package:notube/constants.dart'; import 'package:notube/models/video.dart'; +import 'package:notube/services/file_logger.dart'; import 'package:path_provider/path_provider.dart'; import 'package:process_run/shell.dart'; @@ -91,12 +94,29 @@ class DLServices { var command = '${url.trim()} -q --flat-playlist -J'; var shellLinesController = ShellLinesController(); - var shell = Shell(stdout: shellLinesController.sink, verbose: false); + var shellErrorController = ShellLinesController(); + + shellErrorController.stream.listen((event) { + debugPrint('Analyse error: $event'); + FileLogger().e('Analyse error: $event'); + }); + + var shell = Shell( + stdout: shellLinesController.sink, + stderr: shellErrorController.sink, + verbose: false); await shell.run(''' $ytDlpPath $command ''').then((result) { - debugPrint('Analyse result: $result'); + debugPrint('Analyse error: $result'); + + FileLogger().d('Analyse result: ${result.toString()}'); + }).catchError(( + error, + stackTrace, + ) { + FileLogger().e('Analyse error: $error'); }); return shellLinesController.stream; diff --git a/lib/services/file_logger.dart b/lib/services/file_logger.dart new file mode 100644 index 0000000..08057e9 --- /dev/null +++ b/lib/services/file_logger.dart @@ -0,0 +1,45 @@ +import 'dart:io'; +import 'package:path_provider/path_provider.dart'; +import 'package:logger/logger.dart'; +import 'package:flutter/foundation.dart'; + +class FileLogger { + static final FileLogger _instance = FileLogger._internal(); + late Logger _logger; + late File _logFile; + + factory FileLogger() { + return _instance; + } + + FileLogger._internal(); + + Future init() async { + _logFile = File('apps_logs.txt'); + + _logger = Logger( + printer: PrettyPrinter(), + output: FileOutput(file: _logFile), + ); + } + + void d(String message) { + _logger.d(message); + } + + void i(String message) { + _logger.i(message); + } + + void w(String message) { + _logger.w(message); + } + + void e(String message, [dynamic error, StackTrace? stackTrace]) { + _logger.e(message, error: error, stackTrace: stackTrace); + } + + Future getLogContent() async { + return await _logFile.readAsString(); + } +} From b3fd91590c0cbc8cb246e9da4b2313d250d5d263 Mon Sep 17 00:00:00 2001 From: jscampucci Date: Fri, 5 Jul 2024 15:26:13 +0200 Subject: [PATCH 3/3] [video] archive videos --- .gitignore | 3 +- lib/dlForm/formComponents/submit_button.dart | 2 + lib/screens/home.dart | 40 +++++++- lib/translations/en-US.json | 3 +- lib/translations/fr-FR.json | 3 +- lib/videoList/cubit/videos_cubit.dart | 96 +++++++++++--------- lib/videoList/cubit/videos_state.dart | 9 +- pubspec.lock | 2 +- pubspec.yaml | 1 + 9 files changed, 106 insertions(+), 53 deletions(-) diff --git a/.gitignore b/.gitignore index 52a302f..a67ef55 100644 --- a/.gitignore +++ b/.gitignore @@ -46,4 +46,5 @@ app.*.map.json /android/app/profile /android/app/release -samples/ \ No newline at end of file +samples/ +apps_logs.txt \ No newline at end of file diff --git a/lib/dlForm/formComponents/submit_button.dart b/lib/dlForm/formComponents/submit_button.dart index d2bd990..aba200c 100644 --- a/lib/dlForm/formComponents/submit_button.dart +++ b/lib/dlForm/formComponents/submit_button.dart @@ -20,6 +20,7 @@ class _SubmitButtonState extends State { void addVideosListener(BuildContext context, DlFormState state) { if (state.isParsed) { + context.read().setGlobalStatus('loaded'); for (Video video in state.videos) { debugPrint('Adding video: $video'); context.read().addVideo(video); @@ -45,6 +46,7 @@ class _SubmitButtonState extends State { }, child: GestureDetector( onTap: () { + context.read().setGlobalStatus('loading'); context.read().parseUrl(); }, child: Container( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index cf84900..7d12dd8 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -47,10 +47,41 @@ class Home extends StatelessWidget { child: BlocConsumer( listener: (context, state) {}, builder: (context, state) { - return ListView.builder( - itemCount: state.videoList.length, + var returnWidget = []; + switch (state.status) { + case 'loading': + returnWidget.add(Center( + child: CircularProgressIndicator())); + case 'error': + returnWidget.add(Center( + child: Text('home_dl_error').tr(), + )); + default: + returnWidget.add(ListView.builder( + itemCount: state.videoList.length, + itemBuilder: (context, index) { + var currentVideo = + state.videoList[index]; + return ListTile( + leading: SizedBox( + width: 72, + height: 48, + child: Image.network( + currentVideo.thumbnail, + fit: BoxFit.cover), + ), + title: Text(currentVideo.title), + subtitle: Text( + '${currentVideo.status} - ${currentVideo.format.format}'), + ); + }, + )); + } + returnWidget.add(ListView.builder( + itemCount: state.archiveList.length, itemBuilder: (context, index) { - var currentVideo = state.videoList[index]; + var currentVideo = + state.archiveList[index]; return ListTile( leading: SizedBox( width: 72, @@ -64,6 +95,9 @@ class Home extends StatelessWidget { '${currentVideo.status} - ${currentVideo.format.format}'), ); }, + )); + return Stack( + children: returnWidget, ); })), ], diff --git a/lib/translations/en-US.json b/lib/translations/en-US.json index ace7174..458df19 100644 --- a/lib/translations/en-US.json +++ b/lib/translations/en-US.json @@ -7,5 +7,6 @@ "download_folder": "Download folder", "en_US": "English", "fr_FR": "French", - "Ok": "OK" + "Ok": "OK", + "home_dl_error": "Error while downloading the video" } \ No newline at end of file diff --git a/lib/translations/fr-FR.json b/lib/translations/fr-FR.json index b0d82df..740f567 100644 --- a/lib/translations/fr-FR.json +++ b/lib/translations/fr-FR.json @@ -7,5 +7,6 @@ "download_folder": "Dossier de téléchargement", "en_US": "Anglais", "fr_FR": "Français", - "Ok": "OK" + "Ok": "OK", + "home_dl_error": "Erreur lors du téléchargement de la vidéo" } \ No newline at end of file diff --git a/lib/videoList/cubit/videos_cubit.dart b/lib/videoList/cubit/videos_cubit.dart index c22bb83..9b7a7c5 100644 --- a/lib/videoList/cubit/videos_cubit.dart +++ b/lib/videoList/cubit/videos_cubit.dart @@ -19,41 +19,54 @@ class VideosCubit extends Cubit { late DLServices dlService; late ConverterService converterService; - final List