Terminado la parte de extraer metadatos pero queda juntarlo todo

parent 91360449
import 'dart:io';
import 'package:prueba_multimedia/modelo/conversor.dart';
import 'convertible.dart';
import 'formato.dart';
// TODO: QUE PASA SI NO RECONOCEMOS EL FORMATO?
class Archivo extends Convertible {
final File _file;
List<String> metadatos = [];
late final List<Metadato> _metadatos;
bool _metadatosComplete = false;
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}):
_file = file,
super(nombre: file.path.split('/').last,
super(
nombre: file.path.split('/').last,
// TODO: POR AHORA USAMOS (!) PERO HAY QUE TENERLO EN CUENTA
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 {
/// 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
var archivoSalida = "${archivo.nombre}.ffmeta";
var cacheDirectory = await getApplicationCacheDirectory();
......@@ -33,23 +33,32 @@ abstract class Conversor {
FFmpegSession session = await FFmpegKit.execute(comando);
// Leemos archivo metadatos
var metadatos = <Metadato>[];
var returnCode = await session.getReturnCode();
if (returnCode == null || returnCode.getValue() != 0) {
return null;
return metadatos;
}
var archivoMetadatos = File(pathArchivoSalida);
var lineas = await archivoMetadatos.readAsLines();
archivoMetadatos.delete(recursive: false);
// Procesar metadatos
var metadatos = <String, String>{};
for (var linea in lineas) {
// Vacio, comentario o indicar sección
if (linea.isEmpty || linea.startsWith(RegExp("[;#[]"))) {
continue;
}
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;
......
......@@ -15,8 +15,8 @@ enum Formato {
),
mp3('MPEG-1 Layer III', TipoMultimedia.audio, Clasificacion.calidad,
[ Metadato.title, Metadato.artist, Metadato.album, Metadato.genre,
Metadato.composer, Metadato.track, Metadato.language],
[ MetadatoInfo.title, MetadatoInfo.artist, MetadatoInfo.album, MetadatoInfo.genre,
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.'
),
......@@ -29,33 +29,33 @@ enum Formato {
),
mp4('MPEG-4 Parte 14', TipoMultimedia.video, Clasificacion.calidad,
[ Metadato.title, Metadato.author, Metadato.album, Metadato.year,
Metadato.genre, Metadato.composer, Metadato.track,
Metadato.description, Metadato.comment],
[ MetadatoInfo.title, MetadatoInfo.author, MetadatoInfo.album, MetadatoInfo.year,
MetadatoInfo.genre, MetadatoInfo.composer, MetadatoInfo.track,
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.'
),
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.'
),
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.'
);
final String _nombreCompleto;
final TipoMultimedia _tipoMultimedia;
final Clasificacion _clasificacion;
final List<Metadato> _metadatos;
final List<MetadatoInfo> _metadatos;
final String _descripcion;
String get extension => name;
String get nombre => _nombreCompleto;
Clasificacion get clasificacion => _clasificacion;
TipoMultimedia get tipoMultimedia => _tipoMultimedia;
List<Metadato> get metadatos => _metadatos;
List<MetadatoInfo> get metadatos => _metadatos;
String get descripcion => _descripcion;
const Formato(this._nombreCompleto, this._tipoMultimedia, this._clasificacion,
......@@ -106,7 +106,7 @@ enum Calidad {
const Calidad(this.texto);
}
enum Metadato {
enum MetadatoInfo {
title("Título"),
artist("Artista"),
author("Autor"),
......@@ -126,5 +126,12 @@ enum Metadato {
String get nombreMostrado => _nombreMostrado;
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 {
}
class _PaginaMetadatosState extends State<PaginaMetadatos> {
late final List<Metadato> _metadatos;
late final List<MetadatoInfo> _metadatos;
final List<TextEditingController> _controladores = [];
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