Terminado la parte de extraer metadatos pero queda juntarlo todo

parent 91360449
import 'dart:io'; import 'dart:io';
import 'package:prueba_multimedia/modelo/conversor.dart';
import 'convertible.dart'; import 'convertible.dart';
import 'formato.dart'; import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO? // TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
class Archivo extends Convertible { class Archivo extends Convertible {
final File _file; final File _file;
List<String> metadatos = []; late final List<Metadato> _metadatos;
bool _metadatosComplete = false;
File get file => _file; File get file => _file;
List<Metadato>? get metadatos => _metadatosComplete ? _metadatos : null;
void getMetadatos() async {
var futureMetadatos = Conversor.getMetadatos(this);
futureMetadatos.whenComplete( () {_metadatosComplete = true; } );
_metadatos = await futureMetadatos;
}
Archivo({required super.id, required File file}): Archivo({required super.id, required File file}):
_file = file, _file = file,
super(nombre: file.path.split('/').last, super(
nombre: file.path.split('/').last,
// TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA // TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA
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
)
{
getMetadatos();
}
} }
\ No newline at end of file
...@@ -24,7 +24,7 @@ abstract class Conversor { ...@@ -24,7 +24,7 @@ abstract class Conversor {
/// Devuelve los metadatos del archivo o null si ha habido un problema /// Devuelve los metadatos del archivo o null si ha habido un problema
static Future<Map<String, String>?> getMetadatos(Archivo archivo) async { static Future<List<Metadato>> getMetadatos(Archivo archivo) async {
// Creamos archivo metadatos // Creamos archivo metadatos
var archivoSalida = "${archivo.nombre}.ffmeta"; var archivoSalida = "${archivo.nombre}.ffmeta";
var cacheDirectory = await getApplicationCacheDirectory(); var cacheDirectory = await getApplicationCacheDirectory();
...@@ -33,23 +33,32 @@ abstract class Conversor { ...@@ -33,23 +33,32 @@ abstract class Conversor {
FFmpegSession session = await FFmpegKit.execute(comando); FFmpegSession session = await FFmpegKit.execute(comando);
// Leemos archivo metadatos // Leemos archivo metadatos
var metadatos = <Metadato>[];
var returnCode = await session.getReturnCode(); var returnCode = await session.getReturnCode();
if (returnCode == null || returnCode.getValue() != 0) { if (returnCode == null || returnCode.getValue() != 0) {
return null; return metadatos;
} }
var archivoMetadatos = File(pathArchivoSalida); var archivoMetadatos = File(pathArchivoSalida);
var lineas = await archivoMetadatos.readAsLines(); var lineas = await archivoMetadatos.readAsLines();
archivoMetadatos.delete(recursive: false); archivoMetadatos.delete(recursive: false);
// Procesar metadatos // Procesar metadatos
var metadatos = <String, String>{};
for (var linea in lineas) { for (var linea in lineas) {
// Vacio, comentario o indicar sección // Vacio, comentario o indicar sección
if (linea.isEmpty || linea.startsWith(RegExp("[;#[]"))) { if (linea.isEmpty || linea.startsWith(RegExp("[;#[]"))) {
continue; continue;
} }
var campos = linea.split("="); var campos = linea.split("=");
metadatos.putIfAbsent(campos[0], () => campos[1]); // TODO: Chequear metadatos que falten
try {
metadatos.add(
Metadato(
info: MetadatoInfo.values.byName(campos[0]),
valor: campos[1]
));
} catch (e) {
print("No se ha podido añadir un metadato " + campos[0]);
}
} }
return metadatos; return metadatos;
......
...@@ -15,8 +15,8 @@ enum Formato { ...@@ -15,8 +15,8 @@ enum Formato {
), ),
mp3('MPEG-1 Layer III', TipoMultimedia.audio, Clasificacion.calidad, mp3('MPEG-1 Layer III', TipoMultimedia.audio, Clasificacion.calidad,
[ Metadato.title, Metadato.artist, Metadato.album, Metadato.genre, [ MetadatoInfo.title, MetadatoInfo.artist, MetadatoInfo.album, MetadatoInfo.genre,
Metadato.composer, Metadato.track, Metadato.language], MetadatoInfo.composer, MetadatoInfo.track, MetadatoInfo.language],
'Un formato de compresión de audio digital que usa un algoritmo con pérdida para conseguir un menor tamaño de archivo. Es un formato de audio común utilizado para música tanto en computadoras como en reproductores de audio portátil.' 'Un formato de compresión de audio digital que usa un algoritmo con pérdida para conseguir un menor tamaño de archivo. Es un formato de audio común utilizado para música tanto en computadoras como en reproductores de audio portátil.'
), ),
...@@ -29,33 +29,33 @@ enum Formato { ...@@ -29,33 +29,33 @@ enum Formato {
), ),
mp4('MPEG-4 Parte 14', TipoMultimedia.video, Clasificacion.calidad, mp4('MPEG-4 Parte 14', TipoMultimedia.video, Clasificacion.calidad,
[ Metadato.title, Metadato.author, Metadato.album, Metadato.year, [ MetadatoInfo.title, MetadatoInfo.author, MetadatoInfo.album, MetadatoInfo.year,
Metadato.genre, Metadato.composer, Metadato.track, MetadatoInfo.genre, MetadatoInfo.composer, MetadatoInfo.track,
Metadato.description, Metadato.comment], MetadatoInfo.description, MetadatoInfo.comment],
'Un formato contenedor especificado como parte del estándar internacional MPEG-4 de ISO/IEC. Es utilizado para almacenar los formatos audiovisuales especificados por ISO/IEC y el grupo MPEG (Moving Picture Experts Group) al igual que otros formatos audiovisuales disponibles.' 'Un formato contenedor especificado como parte del estándar internacional MPEG-4 de ISO/IEC. Es utilizado para almacenar los formatos audiovisuales especificados por ISO/IEC y el grupo MPEG (Moving Picture Experts Group) al igual que otros formatos audiovisuales disponibles.'
), ),
mkv('Matroshka', TipoMultimedia.video, Clasificacion.calidad, mkv('Matroshka', TipoMultimedia.video, Clasificacion.calidad,
[ Metadato.title, Metadato.description, Metadato.language ], [ MetadatoInfo.title, MetadatoInfo.description, MetadatoInfo.language ],
'Un formato contenedor abierto que puede almacenar una cantidad muy grande de vídeo, audio, imagen o pistas de subtítulos dentro de un solo archivo. Su finalidad es la de servir como formato universal para el almacenamiento de contenidos audiovisuales y multimedia, como películas o programas de televisión, imágenes y textos.' 'Un formato contenedor abierto que puede almacenar una cantidad muy grande de vídeo, audio, imagen o pistas de subtítulos dentro de un solo archivo. Su finalidad es la de servir como formato universal para el almacenamiento de contenidos audiovisuales y multimedia, como películas o programas de televisión, imágenes y textos.'
), ),
wmv('Windows Media Video', TipoMultimedia.video, Clasificacion.calidad, wmv('Windows Media Video', TipoMultimedia.video, Clasificacion.calidad,
[ Metadato.title, Metadato.author, Metadato.rating, Metadato.comment ], [ MetadatoInfo.title, MetadatoInfo.author, MetadatoInfo.rating, MetadatoInfo.comment ],
'Un formato de vídeo desarrollado por Microsoft, que forma parte del framework Windows Media. No está contruida solo con tecnología interna de Microsoft. Desde la versión 7 (WMV1), Microsoft ha utilizado su propia versión no estandarizada de MPEG-4. El vídeo a menudo se combina con sonido en formato Windows Media Audio.' 'Un formato de vídeo desarrollado por Microsoft, que forma parte del framework Windows Media. No está contruida solo con tecnología interna de Microsoft. Desde la versión 7 (WMV1), Microsoft ha utilizado su propia versión no estandarizada de MPEG-4. El vídeo a menudo se combina con sonido en formato Windows Media Audio.'
); );
final String _nombreCompleto; final String _nombreCompleto;
final TipoMultimedia _tipoMultimedia; final TipoMultimedia _tipoMultimedia;
final Clasificacion _clasificacion; final Clasificacion _clasificacion;
final List<Metadato> _metadatos; final List<MetadatoInfo> _metadatos;
final String _descripcion; final String _descripcion;
String get extension => name; String get extension => name;
String get nombre => _nombreCompleto; String get nombre => _nombreCompleto;
Clasificacion get clasificacion => _clasificacion; Clasificacion get clasificacion => _clasificacion;
TipoMultimedia get tipoMultimedia => _tipoMultimedia; TipoMultimedia get tipoMultimedia => _tipoMultimedia;
List<Metadato> get metadatos => _metadatos; List<MetadatoInfo> get metadatos => _metadatos;
String get descripcion => _descripcion; String get descripcion => _descripcion;
const Formato(this._nombreCompleto, this._tipoMultimedia, this._clasificacion, const Formato(this._nombreCompleto, this._tipoMultimedia, this._clasificacion,
...@@ -106,7 +106,7 @@ enum Calidad { ...@@ -106,7 +106,7 @@ enum Calidad {
const Calidad(this.texto); const Calidad(this.texto);
} }
enum Metadato { enum MetadatoInfo {
title("Título"), title("Título"),
artist("Artista"), artist("Artista"),
author("Autor"), author("Autor"),
...@@ -126,5 +126,12 @@ enum Metadato { ...@@ -126,5 +126,12 @@ enum Metadato {
String get nombreMostrado => _nombreMostrado; String get nombreMostrado => _nombreMostrado;
bool get numerico => _esNumerico; bool get numerico => _esNumerico;
const Metadato(this._nombreMostrado, [this._esNumerico = false]); const MetadatoInfo(this._nombreMostrado, [this._esNumerico = false]);
}
class Metadato {
final MetadatoInfo info;
String valor;
Metadato({required this.info, required this.valor});
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ class PaginaMetadatos extends StatefulWidget { ...@@ -11,7 +11,7 @@ class PaginaMetadatos extends StatefulWidget {
} }
class _PaginaMetadatosState extends State<PaginaMetadatos> { class _PaginaMetadatosState extends State<PaginaMetadatos> {
late final List<Metadato> _metadatos; late final List<MetadatoInfo> _metadatos;
final List<TextEditingController> _controladores = []; final List<TextEditingController> _controladores = [];
final List<String> _valoresElegidos = []; final List<String> _valoresElegidos = [];
......
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