Pages : 1
#1 Le 03/03/2008, à 13:51
- Keuz-Pon
[C++ et Qt] Editer des tags ID3
Bonjour!
Je suis actuellement face à un problème certain: je dois réaliser (comme projet pour mon école) un petit programme capable d'aller lire dans des fichiers mp3 les tags ID3 et de modifier ceux-ci.
L'interface n'a pas à être compliquée, pas besoin de pouvoir traiter plusieurs fichiers à la fois ni rien d'autre de compliqué dans ce genre.
Le problème, c'est que je suis encore une quiche en C++ et en Qt alors que je dois utiliser ces deux éléments pour faire ledit logiciel.
La fin du délai qui m'a été accordé approche à grands pas et me voilà face à mes deux applications que j'ai réussi à coder en recopiant scrupuleusement des tutos. Bref, rien que je puisse présenter pour évaluation.
Y aurait-il quelque bonne(s) âme(s) pour me venir en secours d'une manière ou d'une autre?
D'avance, merci.
K-P
Mettez un peu de -.- dans votre café.
Hors ligne
#2 Le 03/03/2008, à 14:27
- Zapan
Re : [C++ et Qt] Editer des tags ID3
Bonjour!
Je suis actuellement face à un problème certain: je dois réaliser (comme projet pour mon école) un petit programme capable d'aller lire dans des fichiers mp3 les tags ID3 et de modifier ceux-ci.
L'interface n'a pas à être compliquée, pas besoin de pouvoir traiter plusieurs fichiers à la fois ni rien d'autre de compliqué dans ce genre.
Le problème, c'est que je suis encore une quiche en C++ et en Qt alors que je dois utiliser ces deux éléments pour faire ledit logiciel.
La fin du délai qui m'a été accordé approche à grands pas et me voilà face à mes deux applications que j'ai réussi à coder en recopiant scrupuleusement des tutos. Bref, rien que je puisse présenter pour évaluation.
Y aurait-il quelque bonne(s) âme(s) pour me venir en secours d'une manière ou d'une autre?
D'avance, merci.
K-P
Bonjour,
Copie ici le code que tu as déjà écrit si tu veux vraiment avoir de l'aide. Parceque en te lisant moi j'ai surtout l'impression que t'as rien fait et que tu veux qu'on te fasse tes devoirs ^^
Hors ligne
#3 Le 03/03/2008, à 15:32
- Keuz-Pon
Re : [C++ et Qt] Editer des tags ID3
Eh bien effectivement, pour le moment je n'ai rien codé en rapport avec cette application.
J'ai suivi deux tutoriels pour apprendre à utiliser Qt avec le C++ et on m'a donné les deux fichiers suivants pour réaliser mon projet:
audiofile.h
#ifndef AUDIOFILE_H
#define AUDIOFILE_H
#include <QtGui>
/*!
* \class AudioFile
* \brief Fichier Audio
*
* Elle fournit toutes sortes d'outils pour travailler avec les tags
*/
class AudioFile : public QFile
{
public:
/*! \enum Différents types d'informations du tag */
enum tagInfo {
tag,
titre,
artiste,
album,
annee,
commentaire,
piste,
genre
}; //enum tagInfo
AudioFile(QObject * parent);
// Lit les infos dans le tag
QString getInfo(tagInfo info);
// Récupérer la piste ou le genre
int getInfo(tagInfo info, bool blnPisteGenre);
// Ecrire les informations dans le fichier
bool setInfo(tagInfo info, QString qstrInfo);
bool setInfo(tagInfo info, int intInfo);
// Ouvrir le fichier
bool open(QIODevice::OpenMode mode);
private :
/*! \brief Taille du tag */
static const qint64 sizeTag = 128;
/*!
* \brief Position des différentes parties dans un fichiers
*/
enum posPartTag {///.
posPTag = 0,///.
posTitre = 3,///.
posArtiste = 33,///.
posAlbum = 63,///.
posAnnee = 93,///.
posCommentaire = 97,///.
posPiste = 126,///.
posGenre = 127
};
/*!
* \brief Taille des différentes parties dans un fichiers
*/
enum sizePartTag {///.
sizePTag = 3,///.
sizeTitre = 30,///.
sizeArtiste = 30,///.
sizeAlbum = 30,///.
sizeAnnee = 4,///.
sizeCommentaire = 28,///.
sizePiste = 1,///.
sizeGenre = 1,
};
qint64 getPosTag();
QByteArray getTagPart(posPartTag pos, sizePartTag size);
QByteArray readTag();
QByteArray qStringToQByteArray(QString str);
QString qByteArrayToQString(QByteArray ba);
QString whitespaceOut(QString str);
bool tagExist();
};
#endif
et audiofile.cpp
#include "audiofile.h"
/*!
* \brief Constructeur du l'0bjet fichier audio.
* \param parent : Objet parent (celui qui l'a créé).
*/
AudioFile::AudioFile(QObject * parent)
: QFile(parent)
{
}
/*!
* \brief Fonction d'ouverture d'un fichier (hérite de QFile::Open())
*/
bool AudioFile::open(QIODevice::OpenMode mode)
{
QFile::open(mode);
// Vérification du tag
if(!tagExist())
{
// Création du tag
seek(size());
QByteArray baTagEmpty("TAG");
for (int i=3;i < sizeTag ; ++i)
{
baTagEmpty[i] = 0x00;
}
baTagEmpty.resize(sizeTag);
write(baTagEmpty);
}
}
/*!
* \brief Trouve la position du premier caractère du Tag dans le fichier
* \return Retourne un entier indiquant la position du Tag à l'intérieur du fichier
*/
qint64 AudioFile::getPosTag()
{
// Position du TAG dans le fichier
qint64 qintPosTag(size() - sizeTag);
return qintPosTag;
}
/*!
* \brief Supprime les espaces blancs au début, milieu, fin de la chaine.
* \param str : Chaine dont les espaces seront supprimés.
* \return Retourne la chaine sans les espaces superflus.
*/
QString AudioFile::whitespaceOut(QString str)
{
// Suppression des espaces avant et après
str = str.trimmed();
// Suppression des espaces en trop dans la chaine
str = str.simplified();
// Retourner la chaine sans les espaces superflus
return str;
}
/*!
* \brief Trouve les informations désirées dans le tag (Artiste, Titre, ...)
* \param pos : Position de l'information dans le tag
* \param size : Taille de l'information dans le tag
* \return Un tableau de caractère (QByteArray) contenant l'information désirée
*/
QByteArray AudioFile::getTagPart(posPartTag pos, sizePartTag size)
{
QByteArray baPart;
QByteArray baTag(readTag());
// Défini une taille fixe
baPart.resize(size);
// Lire les caractères 33 à 62 du Tag
for (int i=0 ; i<size ; ++i)
{
baPart[i] = baTag[pos+i];
}
return baPart;
}
/*! \brief Lire tout le tag du fichier
* \return Le tag entier du fichier est retourné (128 caractères)
*/
QByteArray AudioFile::readTag()
{
// Ouvrir un flux
QTextStream in(this);
// Se positionner au début du tag
in.seek(getPosTag());
QString strTag = in.readLine(sizeTag);
// Retourner les caractères
return qStringToQByteArray(strTag);
}
/*!
* \brief Convertit un QByteArray (Tableau de caractère) en QString
* \param ba : Le QByteArray à convertir en QString
* \return retourne un QString équivalent au QByteArray "ba"
*/
QString AudioFile::qByteArrayToQString(QByteArray ba)
{
QString str(ba);
return str;
}
/*!
* \brief Convertit un QString en QByteArray (Tableau de caractère)
* \param str : Le QString à convertir
* \return retourne un QByteArray équivalent au QString "str"
*/
QByteArray AudioFile::qStringToQByteArray(QString str)
{
QByteArray ba;
ba = str.toAscii();
return ba;
}
// _____________________________________________________________________________
// Fontions de récupération des informations
/*!
* \brief Récupération d'une information du tag.
* \param info : Information à rechercher
* \return Retourne l'information désirée.
*/
QString AudioFile::getInfo(tagInfo info)
{
// Obtenir la position et la taille de l'information en fonction de tagInfo
posPartTag pos;
sizePartTag size;
switch (info)
{
case titre :
pos = posTitre;
size = sizeTitre;
break;
case artiste :
pos = posArtiste;
size = sizeArtiste;
break;
case album :
pos = posAlbum;
size = sizeAlbum;
break;
case annee :
pos = posAnnee;
size = sizeAnnee;
break;
case commentaire :
pos = posCommentaire;
size = sizeCommentaire;
break;
} // switch info
// Réupérer l'info
QByteArray baInfo(getTagPart(pos, size));
// Convertir le QByteArray en QString
// Retourner le titre
return whitespaceOut(qByteArrayToQString(baInfo));
}
/*!
* \brief Récupération de la piste ou du genre.
* \param info : Genre / Piste
* \param blnPisteGenre : Est utilisé pour surcharger la fonction et retourner un entier
* \return Retourne le numéro du genre ou de la piste.
*/
int AudioFile::getInfo(tagInfo info, bool blnPisteGenre)
{
// Obtenir la position et la taille de l'information en fonction de tagInfo
posPartTag pos;
sizePartTag size;
switch (info)
{
case piste :
pos = posPiste;
size = sizePiste;
break;
case genre:
pos = posGenre;
size = sizeGenre;
break;
} // switch info
// Réupérer l'info
QByteArray baInfo(getTagPart(pos, size));
// Convertir le QByteArray en int
int intInfo;
intInfo = baInfo[0];
// Retourner le titre
return intInfo;
}
// _____________________________________________________________________________
// Fontions d'écriture des informations
/*!
* \brief Enregiste l'information du tag souhaitée
* (Artiste, titre, album, commentaire, piste, .. )
* \param info : champ de l'information à écrire (artiste, ... )
* \param qstrInfo: Chaine à écrire dans le champ (Nom de l'artiste, ...)
* \return Un boolean : true -> Opération réussie
* false -> Echec de l'écriture
*/
bool AudioFile::setInfo(tagInfo info, QString qstrInfo)
{
// Obtenir la position et la taille de l'information en fonction de tagInfo
posPartTag pos;
sizePartTag size;
switch (info)
{
case titre :
pos = posTitre;
size = sizeTitre;
break;
case artiste :
pos = posArtiste;
size = sizeArtiste;
break;
case album :
pos = posAlbum;
size = sizeAlbum;
break;
case annee :
pos = posAnnee;
size = sizeAnnee;
break;
case commentaire :
pos = posCommentaire;
size = sizeCommentaire;
break;
} // switch info
// Convertir le QString en QByteArray
QByteArray baInfo;
// Initialisation
for (int i = 0;i < size ; ++i)
{
baInfo[i] = 0x00;
}
baInfo = qStringToQByteArray(qstrInfo);
baInfo.resize(size);
// Se déplacer jusqu'à la position du champs dans le fichier
this->seek(getPosTag()+pos);
// écrire les données
this->write(baInfo);
}
/*!
* \brief Enregiste l'information du tag souhaitée (int)
* (Piste ou Genre)
* \param info : champ de l'information à écrire (artiste, ... )
* \param intInfo : Entier à écrire dans le champs info
* \return Un boolean : true -> Opération réussie
* false -> Echec de l'écriture
*/
bool AudioFile::setInfo(tagInfo info, int intInfo)
{
// Obtenir la position et la taille de l'information en fonction de tagInfo
posPartTag pos;
sizePartTag size;
switch (info)
{
case genre :
pos = posGenre;
size = sizeGenre;
break;
case piste:
pos = posPiste;
size = sizePiste;
break;
} // switch info
QByteArray baInfo;
baInfo.resize(1);
// Caractère ascii correspondant au numéro
baInfo[0] = intInfo;
// Se déplacer jusqu'à la position du champs dans le fichier
this->seek(getPosTag()+pos);
// écrire les données
this->write(baInfo);
}
/*!
* \brief Permet de savoir si le fichier contient un tag ID3
* \return Retourne vrai si il y a déja un tag.
*/
bool AudioFile::tagExist()
{
// Regarde si il y a un tag à la fin du fichieir
QByteArray baTagIdentifier(readTag());
baTagIdentifier.resize(3);
if (baTagIdentifier == "TAG")
{
return true;
}
else
{
return false;
}
}
Donc je ne vais évidemment pas vous demander de tout me faire (encore que je ne cracherais pas dessus ), mais simplement si vous avez des conseils, des astuces ou des pistes sur lesquelles me lancer, ce serait avec plaisir!!
Encore merci!
Mettez un peu de -.- dans votre café.
Hors ligne
#4 Le 04/03/2008, à 14:22
- obiwankennedy
Re : [C++ et Qt] Editer des tags ID3
c'est marrant j'ai exactement le même projet cette année. Moi j'ai utilisé une librairie "ID3lib" http://id3lib.sourceforge.net/ elle est dispo dans les paquets ubuntu.
il y a des exemples d'utilisations. Toi tu veux codé aussi la partie lecture et ecriture en tag? violent...
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne