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 {
Archivo({required super.id, required this.file}):
super(
nombre: file.path.split('/').last,
nombre: file.path.split('/').last.split('.').first,
formatoOriginal: Formato.fromExtension(file.path.split('.').last)!,
icon: Formato.fromExtension(file.path.split('.').last)!.tipoMultimedia.icono
)
......
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:prueba_multimedia/modelo/archivo.dart';
import 'package:uuid/uuid.dart';
import 'convertible.dart';
import 'elemento_seleccionable.dart';
......@@ -9,37 +10,102 @@ class Carpeta extends ElementoSeleccionable {
final Directory _directory;
bool _incluirSubcarpetas = false;
final List<InfoFormato> _formatos = <InfoFormato>[];
final _elementos = <FileSystemEntity>[];
final _elementos = <Archivo>[];
final _elementosSubcarpetas = <Archivo>[];
Directory get directory => _directory;
List<InfoFormato> get formatos => List.unmodifiable(_formatos);
List<FileSystemEntity> get elementos => List.unmodifiable(_elementos);
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}):
_directory = directory,
super(nombre: directory.path.split('/').last, icon: const Icon(Icons.folder_outlined))
{
final archivos = directory.listSync(recursive: false, followLinks: false);
for(var a in archivos) {
Formato? f = Formato.fromExtension(a.path.split(".").last);
if(f != null){
final i = InfoFormato(
formato: f,
final fsEntities = directory.listSync(recursive: false, followLinks: false);
// Guardamos los archivos
for(var file in fsEntities.whereType<File>()) {
Archivo archivo = Archivo(id: Uuid().v1(), file: file);
_elementos.add(archivo);
final f = InfoFormato(
formato: archivo.formatoOriginal,
carpeta: this,
subCarpeta: false);
if(!_formatos.contains(i)){
_formatos.add(i);
}
subCarpeta: false
);
if(!_formatos.contains(f)){
_formatos.add(f);
}
}
final subcarpeta = directory.listSync(recursive: true, followLinks: false);
for(var a in subcarpeta) {
Formato? f = Formato.fromExtension(a.path.split(".").last);
if(f != null){
// Guardamos los archivos de las subcarpetas
// Ahora mismo solo consultamos un nivel de subcarpetas y no mas
for(var directory in fsEntities.whereType<Directory>()) {
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(
formato: f,
formato: archivo.formatoOriginal,
carpeta: this,
subCarpeta: true);
if(!_formatos.contains(i)){
......@@ -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}){
for(InfoFormato i in _formatos){
if(i.formatoOriginal == formato){
......
......@@ -12,7 +12,7 @@ abstract class Conversor {
/// Se llama una vez el usuario pulsa convertir
static Future<ReturnCode?> convertir(Archivo archivo, String pathSalida) async {
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";
FFmpegSession session = await FFmpegKit.execute(comando);
......
......@@ -23,6 +23,8 @@ class PaginaConfiguracionCarpeta extends StatefulWidget {
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> {
final Map<TipoMultimedia, List<Formato>> _formatos = {};
final Map<TipoMultimedia, bool?> _allOfType = {};
......
......@@ -135,6 +135,15 @@ class ActionButton extends StatelessWidget {
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();
}
}
......
......@@ -50,8 +50,9 @@ class _CarpetaWidgetState extends State<CarpetaWidget>
@override
Widget build(BuildContext context) {
seleccionados = [];
bool incluimosSubcarpetas = widget.carpeta.incluyeSubcarpetas;
for(var i in widget.carpeta.formatos) {
if(i.seleccionado && i.carpeta.incluyeSubcarpetas){
if(i.seleccionado && (!i.subCarpeta || (i.subCarpeta && incluimosSubcarpetas))){
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