Añadida la conversión de carpetas y subcarpetas. Parece haber algunos bugs en la…

Añadida la conversión de carpetas y subcarpetas. Parece haber algunos bugs en la pagina configuracion carpeta pero ya se arreglaran
parent 08ff2f1b
...@@ -10,7 +10,7 @@ class Archivo extends Convertible { ...@@ -10,7 +10,7 @@ class Archivo extends Convertible {
Archivo({required super.id, required this.file}): Archivo({required super.id, required this.file}):
super( super(
nombre: file.path.split('/').last, nombre: file.path.split('/').last.split('.').first,
formatoOriginal: Formato.fromExtension(file.path.split('.').last)!, formatoOriginal: Formato.fromExtension(file.path.split('.').last)!,
icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono
) )
......
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/archivo.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
import 'convertible.dart'; import 'convertible.dart';
import 'elemento_seleccionable.dart'; import 'elemento_seleccionable.dart';
...@@ -9,37 +10,102 @@ class Carpeta extends ElementoSeleccionable { ...@@ -9,37 +10,102 @@ class Carpeta extends ElementoSeleccionable {
final Directory _directory; final Directory _directory;
bool _incluirSubcarpetas = false; bool _incluirSubcarpetas = false;
final List<InfoFormato> _formatos = <InfoFormato>[]; final List<InfoFormato> _formatos = <InfoFormato>[];
final _elementos = <FileSystemEntity>[]; final _elementos = <Archivo>[];
final _elementosSubcarpetas = <Archivo>[];
Directory get directory => _directory; Directory get directory => _directory;
List<InfoFormato> get formatos => List.unmodifiable(_formatos); List<InfoFormato> get formatos => List.unmodifiable(_formatos);
List<FileSystemEntity> get elementos => List.unmodifiable(_elementos);
bool get incluyeSubcarpetas => _incluirSubcarpetas; bool get incluyeSubcarpetas => _incluirSubcarpetas;
/// Un getter que da todos los archivos según los filtros elegidos
List<Archivo> get elementosSeleccionados {
final seleccionado = <Archivo>[];
// Primero averiguamos los formatos seleccionados
final formatosSeleccionados = <Formato, Formato>{};
final formatosSeleccionadosSubcarpetas = <Formato, Formato>{};
for (var infoFormato in _formatos) {
bool seleccionado = infoFormato.seleccionado;
bool destinoNoNulo = infoFormato.formatoDestino != null;
bool noEsSubcarpeta = !infoFormato.subCarpeta;
if (seleccionado && destinoNoNulo)
{
if (noEsSubcarpeta) {
formatosSeleccionados.putIfAbsent(
infoFormato.formatoOriginal,
() => infoFormato.formatoDestino!
);
} else if (_incluirSubcarpetas) {
formatosSeleccionadosSubcarpetas.putIfAbsent(
infoFormato.formatoOriginal,
() => infoFormato.formatoDestino!
);
}
}
}
// Devolvemos archivos que tengan formato seleccionado
for (var archivo in _elementos.whereType<Archivo>()) {
if (formatosSeleccionados.keys.contains(archivo.formatoOriginal)) {
archivo.formatoDestino = formatosSeleccionados[archivo.formatoOriginal];
seleccionado.add(archivo);
}
}
for (var archivo in _elementosSubcarpetas.whereType<Archivo>()) {
if (formatosSeleccionadosSubcarpetas.keys.contains(archivo.formatoOriginal)) {
archivo.formatoDestino = formatosSeleccionadosSubcarpetas[archivo.formatoOriginal];
seleccionado.add(archivo);
}
}
return seleccionado;
}
List<InfoFormato> get formatosSeleccionados {
final seleccionados = <InfoFormato>[];
for (var infoFormato in _formatos) {
bool seleccionado = infoFormato.seleccionado;
bool noEsSubcarpeta = !infoFormato.subCarpeta;
if (seleccionado && (noEsSubcarpeta || _incluirSubcarpetas)) {
seleccionados.add(infoFormato);
}
}
return seleccionados;
}
Carpeta({required super.id, required Directory directory}): Carpeta({required super.id, required Directory directory}):
_directory = directory, _directory = directory,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined)) super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined))
{ {
final archivos = directory.listSync(recursive: false, followLinks: false); final fsEntities = directory.listSync(recursive: false, followLinks: false);
for(var a in archivos) {
Formato? f = Formato.fromExtension(a.path.split(".").last); // Guardamos los archivos
if(f != null){ for(var file in fsEntities.whereType<File>()) {
final i = InfoFormato( Archivo archivo = Archivo(id: Uuid().v1(), file: file);
formato: f, _elementos.add(archivo);
carpeta: this, final f = InfoFormato(
subCarpeta: false); formato: archivo.formatoOriginal,
if(!_formatos.contains(i)){ carpeta: this,
_formatos.add(i); subCarpeta: false
} );
if(!_formatos.contains(f)){
_formatos.add(f);
} }
} }
final subcarpeta = directory.listSync(recursive: true, followLinks: false); // Guardamos los archivos de las subcarpetas
for(var a in subcarpeta) { // Ahora mismo solo consultamos un nivel de subcarpetas y no mas
Formato? f = Formato.fromExtension(a.path.split(".").last); for(var directory in fsEntities.whereType<Directory>()) {
if(f != null){ final files = directory.listSync(recursive: false, followLinks: false)
.whereType<File>();
for (var file in files) {
Archivo archivo = Archivo(id: Uuid().v1(), file: file);
_elementosSubcarpetas.add(archivo);
final i = InfoFormato( final i = InfoFormato(
formato: f, formato: archivo.formatoOriginal,
carpeta: this, carpeta: this,
subCarpeta: true); subCarpeta: true);
if(!_formatos.contains(i)){ if(!_formatos.contains(i)){
...@@ -50,12 +116,6 @@ class Carpeta extends ElementoSeleccionable { ...@@ -50,12 +116,6 @@ class Carpeta extends ElementoSeleccionable {
} }
/*
Carpeta.fromList({required super.id, required Directory directory, required List<InfoFormato> formatos}):
_directory = directory, _formatos = formatos,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined));
*/
InfoFormato? getInfoFormato({required Formato formato}){ InfoFormato? getInfoFormato({required Formato formato}){
for(InfoFormato i in _formatos){ for(InfoFormato i in _formatos){
if(i.formatoOriginal == formato){ if(i.formatoOriginal == formato){
......
...@@ -12,7 +12,7 @@ abstract class Conversor { ...@@ -12,7 +12,7 @@ abstract class Conversor {
/// Se llama una vez el usuario pulsa convertir /// Se llama una vez el usuario pulsa convertir
static Future<ReturnCode?> convertir(Archivo archivo, String pathSalida) async { static Future<ReturnCode?> convertir(Archivo archivo, String pathSalida) async {
String path = archivo.file.path; String path = archivo.file.path;
String nuevoPath = "$pathSalida${archivo.nombre}.${archivo.formatoDestino!.name}"; String nuevoPath = "$pathSalida/${archivo.nombre}.${archivo.formatoDestino!.name}";
String comando = "-i $path $nuevoPath"; String comando = "-i $path $nuevoPath";
FFmpegSession session = await FFmpegKit.execute(comando); FFmpegSession session = await FFmpegKit.execute(comando);
......
...@@ -23,6 +23,8 @@ class PaginaConfiguracionCarpeta extends StatefulWidget { ...@@ -23,6 +23,8 @@ class PaginaConfiguracionCarpeta extends StatefulWidget {
State<PaginaConfiguracionCarpeta> createState() => _PaginaConfiguracionCarpetaState(); State<PaginaConfiguracionCarpeta> createState() => _PaginaConfiguracionCarpetaState();
} }
// TODO: Se muestran formatos repetidos porque se consideran distintos
// al ser un de subcarpeta y otro no
class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> { class _PaginaConfiguracionCarpetaState extends State<PaginaConfiguracionCarpeta> {
final Map<TipoMultimedia, List<Formato>> _formatos = {}; final Map<TipoMultimedia, List<Formato>> _formatos = {};
final Map<TipoMultimedia, bool?> _allOfType = {}; final Map<TipoMultimedia, bool?> _allOfType = {};
......
...@@ -135,6 +135,15 @@ class ActionButton extends StatelessWidget { ...@@ -135,6 +135,15 @@ class ActionButton extends StatelessWidget {
Conversor.convertir(archivo, directorioSalida); Conversor.convertir(archivo, directorioSalida);
} }
// Convertimos las carpetas
List<Carpeta> carpetas = manager.seleccionables.whereType<Carpeta>().toList();
for (var carpeta in carpetas) {
for (var archivo in carpeta.elementosSeleccionados) {
Directory d = await Directory("$directorioSalida/${carpeta.nombre}").create();
Conversor.convertir(archivo, d.path);
}
}
manager.finalizarConversion(); manager.finalizarConversion();
} }
} }
......
...@@ -50,8 +50,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget> ...@@ -50,8 +50,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
seleccionados = []; seleccionados = [];
bool incluimosSubcarpetas = widget.carpeta.incluyeSubcarpetas;
for(var i in widget.carpeta.formatos) { for(var i in widget.carpeta.formatos) {
if(i.seleccionado && i.carpeta.incluyeSubcarpetas){ if(i.seleccionado && (!i.subCarpeta || (i.subCarpeta && incluimosSubcarpetas))){
seleccionados.add(i); seleccionados.add(i);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment