Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/03/2008, à 14: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, à 15:27

Zapan

Re : [C++ et Qt] Editer des tags ID3

Keuz-Pon a écrit :

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, à 16: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 wink ), 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, à 15: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