The objective of this mini-project is to create a command line application to manage a collection of multimedia files

Related tags

Video Media-Manager
Overview

Gestionnaire de fichiers multimédia

L’objectif de ce mini-projet est de créer une application en ligne commande pour gérer une collection de fichiers multimédia. L’application proposera une double interface utilisateur :

  • les arguments pourront être passés en paramètre de l’exécutable,

  • si l’exécutable est lancé sans argument, un mode interactif sera proposé à l’utilisateur.

L’utilisateur saisira une commande suivie d’arguments. Les commandes à implémenter sont les suivantes :

  • scan : analyser récursivement un répertoire pour collecter les fichiers supportés

    • l’analyse doit extraire les métadonnées du fichier

  • search : effectue une recherche sur les données gérées (format de la requête ?)

  • scrap : récupérer des données sur le web pour un ensemble de fichiers

  • write2md : génèrer un fichier Markdown contenant le résultat d’une requête

  • `write2??? : générer des playlists, …​

  • tag : ajoute un tag à un ensemble de fichiers (requêtes). Les données analysées peuvent être sauvegardées au format JSON pour une réutilisation ultérieure.

Ce sujet contient des parties obligatoires et des parties optionnelles. Les parties optionnelles sont là pour vous donner des pistes d’évolutions possibles concernant cette application. Enfin, le sujet est volontairement peu contraignant afin de vous laisser proposer vos propres évolutions.

Caution
  • Compilez et exécutez votre programme après chaque modification.

  • Pensez à valider régulièrement votre travail avec git.

  • Respectez le guide de style Rust dans votre code source.

  • En particulier, documentez vos API conformément aux recommandations.

Structure du projet

Le projet initial est géré avec cargo et est structuré en plusieurs modules et fichiers.

  1. Quelles bibliothèques externes sont utilisées dans le projet ? Expliquez en une phrase leur utilité et donnez l’URL de leur documentation + bibliothèques utilisées : StructOpt: Perlet de personnaliser des commandes dans le terminal WalkDir : Permet de parcourirs les dossiers et de créer des variables contenant le chemin Audiotags: Permet de récupérer les méta-données de fichier mp3 Serde: Permet de sauvegarder/charger des variables Colored: Permet de manipuler les couleurs dans le terminal pour aider au débuggage Markdown-gen: Permet de créer des fichier .md à partir d’un fichier .rs

. Expliquez le rôle de chacun des modules/fichiers du projet et examinez attentivement les exportations (mot-clé `pub`)
+ Modules/fichier utilisées :

Modules: main.rs: Module appelant les fonctions des autres modules pour concevoir le programme demandé, possède également des tests. cli.rs: Module gerant les commandes d’entrée SCAN et SEARCH dans le terminal. musicfile.rs: Module qui extrait les métadonnées d’une musique à partir de son path. Contient également les fonctions Save et Load permmettant de sauvegarder et charger les variables. scan.rs: Module scannant un dossier d’entrée et appellant l’extraction des métadonnées du module musicfile pour chaque fichier mp3 trouvés. search.rs: Module gérant les différentes requêtes de l’utilisateur, prend en entrée le vecteur de données généré par musicfile, et renvoi le vecteur de données de la requête. write2md.rs: Module permettant de généré un fichier markdownn prend en entrée le nouveau vecteur de base de donnée.

Fichiers:
result.md: Fichier Markdown contenant le résultat de la requête.
data.json: Fichier de sérialisation, contenant la sauvegarde du dossier scanné.

== Structure de données initiale pour les fichiers audio
Dans un premier temps, seuls les fichiers audio seront pris en compte.

. Trouvez et documentez dans le code source l'ébauche d'API pour gérer les fichiers audio

== Implémentation des fonctionnalités
Certaines des fonctionnalités ci-dessous sont à intégrer obligatoirement dans le projet.
D'autres sont optionnelles.
L'usage de bibliothèques externes pour l'implémentation est non seulement autorisé mais même encouragé.

=== Analyse d'un répertoire (`scan`)
La fonction `scan` (obligatoire) doit analyser récursivement un répertoire pour collecter les fichiers supportés.
L'analyse doit extraire les métadonnées du fichier.
Ces dernières sont issues du système de fichiers (date de création, ...) ou extraites du fichier de média à l'aide d'une bibliothèque spécifique (https://crates.io/crates/mp3-metadata[mp3-metadata], https://crates.io/crates/ogg_metadata[ogg_metadata], ...).

Les données analysées peuvent être sauvegardées par exemple au format JSON pour une réutilisation ultérieure.
Des bibliothèques comme https://crates.io/crates/serde[Serde] pour sérialiser/désérialiser ou https://crates.io/crates/json[json] peuvent être utiliser pour cela.

=== Recherche dans les métadonnées des fichiers (`search`)
La fonction `search` (obligatoire) effectue une recherche sur les données gérées et retourne l'ensemble des médias correspondant.
Le format de la requête doit permettre d'interroger les différents champs des fichiers médias.
Vous pouvez par exemple vous inspirer d'une partie de la syntaxe d'outils de recherche par mots-clé comme https://lucene.apache.org/core/2_9_4/queryparsersyntax.html[Apache Lucene].

=== Générer une liste au format Markdown (`write2md`)
La fonction `write2md` (obligatoire) permet de génèrer un fichier _Markdown_ contenant le résultat d'une requête.
La bibliothèque https://crates.io/crates/markdown-gen[markdown-gen] permet par exemple de générer du Markdown.

=== Générer une playlist (`write2???`)
La fonction `write2???` génère une playlist à partir du résultat d'une requête destiné à un logiciel externe comme https://www.videolan.org/vlc/index.fr.html[vlc].

Cette fonctionnalité étant très proche de la précédente, la définition d'une abstraction représentant le type de sortie (affichage, markdown, playlist, ...) permettrait d'améliorer la conception du programme.

=== Enrichir les données à partir du web (`scrap`)
La fonction `scrap` (optionnelle) récupère des données sur le web pour un ensemble de fichiers.
Ces métadonnées complémentaires viendront enrichir les informations conservées pour chaque fichier afin d'en améliorer l'affichage ou de permettre des recherches plus précises.

=== Ajouter des métadonnées (`tag`)
La fonction `tag` (optionnelle) ajoute un mot-clé à un ensemble de fichiers (requête).
Ce mot-clé peut ensuite être stocké dans le fichier lui-même afin d'être utilisable à l'extérieure de l'application.

== Un type abstrait pour généraliser à d'autres types de fichiers
L'idée est de pouvoir généraliser les fonctionnalités ci-dessus à d'autres types de média (photos, vidéo, ...).

. Proposez un type abstrait représentant un fichier de média quelconque.
. Modifiez votre implémentation des fichiers audio pour utiliser ce tye abstrait

Pour la généralisation, vous pouvez vous restreindre à un sous-ensemble des fonctionnalités proposées ci-dessus.

== Extension à d'autres types de média
. Implémentez le type abstrait pour un autre type de média de votre choix (photos, vidéo, ...).

== Références
* https://doc.rust-lang.org/book/ch12-00-an-io-project.html[An I/O Project: Building  Command Line Program]
* https://rust-cli.github.io/book/index.html[Command line apps in Rust]
* https://github.com/andrewgremlich/media_organizer[Media Organizer]
* https://github.com/pdeljanov/Symphonia[Symphonia]
* Quelques bibliothèques externes en lien avec ce projet
** https://crates.io/crates/kamadak-exif[kamadak-exif] pour extraite les métadonnées 'images
** https://crates.io/crates/ffmpeg-next[ffmpeg-next] pour interagir avec FFMPEG
** https://crates.io/crates/structopt[StructOpt] / https://crates.io/crates/clap[clap] pour parser les arguments de CLI
** https://crates.io/crates/console[console] pour agrémenter les affichages
** https://crates.io/crates/pancurses[pancurses] pour créer une IHM dans le terminal
** https://crates.io/crates/terminal_cli[terminal_cli] pour créer un appli CLI nteractive
** https://crates.io/crates/walkdir[walkdir] / https://github.com/rust-lang-nursery/lob[glob] pour chercher des fichiers dans le FS

 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
You might also like...
envelope - a command line utility and tool to help you manage your .env files

envelope envelope is a command line utility and tool to help you manage your .env files. How it works envelope is basically a command line utility tha

Create, open, manage your Python projects with ease, a project aimed to make python development experience a little better
Create, open, manage your Python projects with ease, a project aimed to make python development experience a little better

Create, open, manage your Python projects with ease, a project aimed to make python development experience a little better

Create a Python project automatically with rust (like create-react-app but for python)

create-python-project Create a Python project automatically with rust (like create-react-app but for python) Installation cargo install create-python-

Manas project aims to create a modular framework and ecosystem to create robust storage servers adhering to Solid protocol in rust.

मनस् | Manas Solid is a web native protocol to enable interoperable, read-write, collaborative, and decentralized web, truer to web's original vision.

Create `.gitignore` files using one or more templates from TopTal, GitHub or your own collection
Create `.gitignore` files using one or more templates from TopTal, GitHub or your own collection

gitnr A cross-platform CLI utility to create .gitignore files using templates. Use templates from the GitHub & TopTal collections Use local files and

SKYULL is a command-line interface (CLI) in development that creates REST API project structure templates with the aim of making it easy and fast to start a new project.

SKYULL is a command-line interface (CLI) in development that creates REST API project structure templates with the aim of making it easy and fast to start a new project. With just a few primary configurations, such as project name, you can get started quickly.

A metrics collection application for Linux machines. Created for MSCS 710 Project at Marist College.

Linux-Metrics-Collector A metrics collection application for Linux machines. Created for MSCS 710 Project at Marist College. Development Environment S

Create That Project. Project Creation That Rocks 🎸🧱.
Create That Project. Project Creation That Rocks 🎸🧱.

Create That Project Config Example Install $ cargo install ctp Basic Info In any file or even in the commands sections of your config file you can pla

Command line interface to manage clipboard

cb Command line interface to manage clipboard How to install Pre-Compiled you can download a pre-compiled executable, then you should copy that execut

Command-line program to manage PS battle logs. WIP.

psbattletools psbattletools is a command-line tool written in Rust for manipulating Pokémon Showdown battle logs. Installation psbattletools currently

A command line tool, manage your hundreds of repository, written with Rust

A command line tool, manage your hundreds of repository, written with Rust

☘️ A simple command line tool to manage your Minecraft Bedrock worlds
☘️ A simple command line tool to manage your Minecraft Bedrock worlds

☘️ Haze A simple command line tool to manage your Minecraft Bedrock worlds Haze allows you to keep your project's worlds out of the com.mojang directo

A cross-platform and safe Rust API to create and manage memory mappings in the virtual address space of the calling process.

mmap-rs A cross-platform and safe Rust API to create and manage memory mappings in the virtual address space of the calling process. This crate can be

📦  Crate Protocol allows anyone to create, manage, and trade a tokenized basket of assets, which we refer to as a Crate.
📦 Crate Protocol allows anyone to create, manage, and trade a tokenized basket of assets, which we refer to as a Crate.

📦 Crate Protocol Crate Protocol allows anyone to create, manage, and trade a tokenized basket of assets, which we refer to as a Crate. A Crate is alw

IDP2P is a peer-to-peer identity protocol which enables a controller to create, manage and share its own proofs as well as did documents
IDP2P is a peer-to-peer identity protocol which enables a controller to create, manage and share its own proofs as well as did documents

IDP2P Experimental, inspired by ipfs, did:peer and keri Background See also (related topics): Decentralized Identifiers (DIDs) Verifiable Credentials

Create, manage and deploy p2panda schemas
Create, manage and deploy p2panda schemas

fishy Create, manage and deploy p2panda schemas Releases | Contribute | Website Command-line-tool to easily create update and share your p2panda schem

A Bevy plugin to easily create and manage windows that remember where they were.

bevy-persistent-windows A Bevy plugin to easily create and manage windows that remember where they were. Background When you're developing a game, thu

Small command-line tool to switch monitor inputs from command line

swmon Small command-line tool to switch monitor inputs from command line Installation git clone https://github.com/cr1901/swmon cargo install --path .

A command-line tool collection to assist development written in RUST

dtool dtool is a command-line tool collection to assist development Table of Contents Description Usage Tips Installation Description Now dtool suppor

Owner
Bynawers
Bynawers
Play your favorite live streams from command line

Streamlib Streamlib is a meta-player for media streams. The streamlib CLI works against a curated library of video and audio streams, and enables quer

Streamlib 27 Jul 4, 2021
Gyroflow is an application that can stabilize your video by using motion data from a gyroscope and optionally an accelerometer

Gyroflow is an application that can stabilize your video by using motion data from a gyroscope and optionally an accelerometer. Modern cameras record that data internally (GoPro, Sony, Insta360 etc), and this application stabilizes the captured footage precisely by using them. It can also use gyro data from an external source (eg. from Betaflight blackbox).

Gyroflow 3.9k Jan 5, 2023
Simple playground project to explore the YUV4MPEG2 format.

2mpeg4yuv Simple playground project to explore the YUV4MPEG2 format. Quick Start Install the Rust Compiler Preview $ ./build.sh $ ./2mpeg4yuv preview

Tsoding 19 Dec 28, 2022
A small utility to cast video files from a desktop to a chromecast.

μCaster (mucaster) Once completed, μCaster is a cross-platform Chromecast controller that can play files directly from a host computer. This project i

Jayden Dumouchel 4 Oct 10, 2022
A Command-line tool to create, manage and deploy your python projects

PPM A Command-line tool to create, manage and deploy your python projects Table of Contents PPM Main Features Create a Project project.ini file Projec

FUSEN 6 Aug 30, 2022
Objective-C Runtime bindings and wrapper for Rust.

Objective-C Runtime bindings and wrapper for Rust. Documentation: http://ssheldon.github.io/rust-objc/objc/ Crate: https://crates.io/crates/objc Messa

Steven Sheldon 336 Jan 2, 2023
High-level RTSP multimedia streaming library, in Rust

High-level RTSP multimedia streaming library, in Rust. Good support for ONVIF RTSP/1.0 IP surveillance cameras, as needed by Moonfire NVR. Works around brokenness in cheap closed-source cameras.

Scott Lamb 108 Jan 8, 2023
A react-inspired UI library for building multimedia desktop apps with rust and vulkan.

narui A react-inspired UI library for building multimedia desktop apps with rust and vulkan. declarative UI with Ergonomics similar to React with hook

apertus° - open source cinema 42 Jan 1, 2023
This tool allows you to create the files needed for a Visual Studio project so that you can continue coding on a Mac for C++ with Visual Studio Code and then submit the Visual Studio project for Class Assignments

This tool allows you to create the files needed for a Visual Studio project so that you can continue coding on a Mac for C++ with Visual Studio Code and then submit the Visual Studio project for Class Assignments

cameron 3 Jan 18, 2023