You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1252 lines
37 KiB
C++

#include "cmediainfo.h"
#include "common.h"
#include <QFileInfo>
#include <QSqlQuery>
#include <QSqlError>
#include <QVariant>
#include <QByteArray>
#include <QImage>
#include <QPixmap>
#include <QBuffer>
#include <QDebug>
cMediaInfo::cMediaInfo(bool bAPE, bool bID3V1, bool bID3V2, bool bProperties, QObject *parent) :
QObject(parent), m_bAPE(bAPE), m_bID3V1(bID3V1), m_bID3V2(bID3V2), m_bProperties(bProperties), m_bIsValid(false), m_fileType(MEDIA_TYPE_UNKNOWN)
{
}
cMediaInfo::~cMediaInfo()
{
clear();
}
void cMediaInfo::clear()
{
m_szFileName = "";
m_fileType = MEDIA_TYPE_UNKNOWN;
m_bIsValid = false;
m_iLength = -1;
m_iBitrate = -1;
m_iSampleRate = -1;
m_iChannels = -1;
m_iBitsPerSample = -1;
m_iLayer = -1;
m_iVersion = -1;
m_iSampleWidth = -1;
m_ullSampleFrames = 0;
m_bIsEncrypted = false;
m_iTrackGain = -1;
m_iAlbumGain = -1;
m_iTrackPeak = -1;
m_iAlbumPeak = -1;
m_bProtectionEnabled = false;
m_channelMode = CHANNEL_MODE_UNKNOWN;
m_bIsCopyrighted = false;
m_bIsOriginal = false;
m_szContentGroupDescription = "";
m_szTitle = "";
m_szSubTitle = "";
m_szAlbum = "";
m_szOriginalAlbum = "";
m_szTrackNumber = "";
m_szPartOfSet = "";
m_szSubTitleOfSet = "";
m_szInternationalStandardRecordingCode = "";
m_szContentGroupDescription = "";
m_szTitle = "";
m_szSubTitle = "";
m_szAlbum = "";
m_szOriginalAlbum = "";
m_szPartOfSet = "";
m_szSubTitleOfSet = "";
m_szInternationalStandardRecordingCode = "";
m_szLeadArtist = "";
m_szBand = "";
m_szConductor = "";
m_szInterpret.clear();
m_szOriginalArtist = "";
m_szTextWriter = "";
m_szOriginalTextWriter = "";
m_szComposer = "";
m_szEncodedBy = "";
m_iBeatsPerMinute = -1;
m_szLanguage.clear();
m_szContentType.clear();
m_szFileType = "";
m_szMediaType.clear();
m_szMood = "";
m_szCopyright = "";
m_szProducedNotice = "";
m_szPublisher = "";
m_szFileOwner = "";
m_szInternetRadioStationName = "";
m_szInternetRadioStationOwner = "";
m_szOriginalFilename = "";
m_iPlaylistDelay = -1;
m_szswhwSettings.clear();
m_szAlbumSortOrder = "";
m_szPerformerSortOrder = "";
m_szTitleSortOrder = "";
m_szSynchronizedLyrics.clear();
m_szSynchronizedLyricsLanguage = "";
m_szSynchronizedLyricsDescription = "";
m_szUnsynchronizedLyrics.clear();
m_szUnsynchronizedLyricsLanguage = "";
m_szUnsynchronizedLyricsDescription = "";
m_szAlbum = "";
m_szArtistList.clear();
m_szAlbumArtistList.clear();
m_szComposerList.clear();
m_szComment = "";
m_szGenreList.clear();
m_szTitle = "";
m_szRating = "";
m_szCopyright = "";
m_iYear = -1;
m_iID3v2Version = -1;
m_iID3v2Revision = -1;
m_iID3v2Size = -1;
m_TAGAPEList.clear();
m_TAGPropertiesList.clear();
m_pixmapList.clear();
}
bool cMediaInfo::readFromFile(const QString& szFileName)
{
clear();
QFileInfo fileInfo(szFileName);
if(!fileInfo.exists())
return(false);
if(!fileInfo.suffix().compare("APE", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_APE;
else if(!fileInfo.suffix().compare("WMA", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_ASF;
else if(!fileInfo.suffix().compare("FLAC", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_FLAC;
else if(!fileInfo.suffix().compare("AAC", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MP4;
else if(!fileInfo.suffix().compare("MP4", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MP4;
else if(!fileInfo.suffix().compare("M4A", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MP4;
else if(!fileInfo.suffix().compare("MPC", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MPC;
else if(!fileInfo.suffix().compare("MP1", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MPEG;
else if(!fileInfo.suffix().compare("MP2", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MPEG;
else if(!fileInfo.suffix().compare("MP3", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_MPEG;
else if(!fileInfo.suffix().compare("TTA", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_TRUEAUDIO;
else if(!fileInfo.suffix().compare("WV", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_WAVPACK;
else if(!fileInfo.suffix().compare("WAV", Qt::CaseInsensitive))
m_fileType = MEDIA_TYPE_WAV;
if(m_fileType == MEDIA_TYPE_UNKNOWN)
return(false);
m_szFileName = szFileName;
ID3v1::Tag* lpTagV1 = 0;
ID3v2::Tag* lpTagV2 = 0;
APE::Tag* lpTagAPE = 0;
APE::File* lpApe = 0;
ASF::File* lpASF = 0;
FLAC::File* lpFlac = 0;
MP4::File* lpMP4 = 0;
MPC::File* lpMPC = 0;
MPEG::File* lpMPEG = 0;
TrueAudio::File* lpTrueAudio = 0;
WavPack::File* lpWavPack = 0;
RIFF::WAV::File* lpWav = 0;
TagLib::PropertyMap tags;
QString szTmp;
switch(m_fileType)
{
case MEDIA_TYPE_APE:
{
lpApe = new APE::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpApe->ID3v1Tag();
lpTagAPE = lpApe->APETag();
tags = lpApe->properties();
APE::Properties* lpAudioProperties = lpApe->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iBitsPerSample = lpAudioProperties->bitsPerSample();
m_iVersion = lpAudioProperties->version();
}
break;
}
case MEDIA_TYPE_ASF:
{
lpASF = new ASF::File(m_szFileName.toLocal8Bit().data());
TagLib::ASF::Tag* lpTag = lpASF->tag();
m_szTitle = QString::fromStdWString(lpTag->title().toWString());
szTmp = QString::fromStdWString(lpTag->artist().toWString());
if(!szTmp.isEmpty() && m_bID3V1)
m_szArtistList = szTmp.split("\n");
m_szAlbum = QString::fromStdWString(lpTag->album().toWString());
m_szComment = QString::fromStdWString(lpTag->comment().toWString());
szTmp = QString::fromStdWString(lpTag->genre().toWString());
if(!szTmp.isEmpty() && m_bID3V1)
m_szGenreList = szTmp.split("\n");
m_szRating = QString::fromStdWString(lpTag->genre().toWString());
m_szCopyright = QString::fromStdWString(lpTag->copyright().toWString());
m_iYear = lpTag->year();
m_szTrackNumber = QString("%1").arg(lpTag->track());
tags = lpASF->properties();
ASF::Properties* lpAudioProperties = lpASF->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_bIsEncrypted = lpAudioProperties->isEncrypted();
}
break;
}
case MEDIA_TYPE_FLAC:
{
lpFlac = new FLAC::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpFlac->ID3v1Tag();
lpTagV2 = lpFlac->ID3v2Tag();
tags = lpFlac->properties();
FLAC::Properties* lpAudioProperties = lpFlac->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iSampleWidth = lpAudioProperties->sampleWidth();
m_ullSampleFrames = lpAudioProperties->sampleFrames();
}
break;
}
case MEDIA_TYPE_MP4:
{
lpMP4 = new MP4::File(m_szFileName.toLocal8Bit().data());
TagLib::MP4::Tag* lpTag = lpMP4->tag();
m_szTitle = QString::fromStdWString(lpTag->title().toWString());
szTmp = QString::fromStdWString(lpTag->artist().toWString());
if(!szTmp.isEmpty() && m_bID3V1)
m_szArtistList = szTmp.split("\n");
m_szAlbum = QString::fromStdWString(lpTag->album().toWString());
m_szComment = QString::fromStdWString(lpTag->comment().toWString());
szTmp = QString::fromStdWString(lpTag->genre().toWString());
if(!szTmp.isEmpty() && m_bID3V1)
m_szGenreList = szTmp.split("\n");
m_iYear = lpTag->year();
m_szTrackNumber = QString("%1").arg(lpTag->track());
tags = lpMP4->properties();
MP4::Properties* lpAudioProperties = lpMP4->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iBitsPerSample = lpAudioProperties->bitsPerSample();
m_bIsEncrypted = lpAudioProperties->isEncrypted();
}
break;
}
case MEDIA_TYPE_MPC:
{
lpMPC = new MPC::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpMPC->ID3v1Tag();
lpTagAPE = lpMPC->APETag();
tags = lpMPC->properties();
MPC::Properties* lpAudioProperties = lpMPC->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iVersion = lpAudioProperties->mpcVersion();
m_ullSampleFrames = lpAudioProperties->sampleFrames();
m_iTrackGain = lpAudioProperties->trackGain();
m_iAlbumGain = lpAudioProperties->albumGain();
m_iTrackPeak = lpAudioProperties->trackPeak();
m_iAlbumPeak = lpAudioProperties->albumPeak();
}
break;
}
case MEDIA_TYPE_MPEG:
{
lpMPEG = new MPEG::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpMPEG->ID3v1Tag();
lpTagV2 = lpMPEG->ID3v2Tag();
lpTagAPE = lpMPEG->APETag();
tags = lpMPEG->properties();
MPEG::Properties* lpAudioProperties = lpMPEG->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iLayer = lpAudioProperties->layer();
switch(lpAudioProperties->version())
{
case MPEG::Header::Version1:
m_iVersion = 10;
break;
case MPEG::Header::Version2:
m_iVersion = 20;
break;
case MPEG::Header::Version2_5:
m_iVersion = 25;
break;
}
m_bProtectionEnabled = lpAudioProperties->protectionEnabled();
switch(lpAudioProperties->channelMode())
{
case MPEG::Header::Stereo:
m_channelMode = CHANNEL_MODE_STEREO;
break;
case MPEG::Header::JointStereo:
m_channelMode = CHANNEL_MODE_JOINTSTEREO;
break;
case MPEG::Header::DualChannel:
m_channelMode = CHANNEL_MODE_DUALMONO;
break;
case MPEG::Header::SingleChannel:
m_channelMode = CHANNEL_MODE_MONO;
break;
}
m_bIsCopyrighted = lpAudioProperties->isCopyrighted();
m_bIsOriginal = lpAudioProperties->isOriginal();
}
break;
}
case MEDIA_TYPE_TRUEAUDIO:
{
lpTrueAudio = new TrueAudio::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpTrueAudio->ID3v1Tag();
lpTagV2 = lpTrueAudio->ID3v2Tag();
tags = lpTrueAudio->properties();
TrueAudio::Properties* lpAudioProperties = lpTrueAudio->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iBitsPerSample = lpAudioProperties->bitsPerSample();
m_iVersion = lpAudioProperties->ttaVersion();
}
break;
}
case MEDIA_TYPE_WAVPACK:
{
lpWavPack = new WavPack::File(m_szFileName.toLocal8Bit().data());
lpTagV1 = lpWavPack->ID3v1Tag();
lpTagAPE = lpWavPack->APETag();
tags = lpWavPack->properties();
WavPack::Properties* lpAudioProperties = lpWavPack->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iBitsPerSample = lpAudioProperties->bitsPerSample();
m_ullSampleFrames = lpAudioProperties->sampleFrames();
m_iVersion = lpAudioProperties->version();
}
break;
}
case MEDIA_TYPE_WAV:
{
lpWav = new RIFF::WAV::File(m_szFileName.toLocal8Bit().data());
lpTagV2 = lpWav->tag();
tags = lpWav->properties();
RIFF::WAV::Properties* lpAudioProperties = lpWav->audioProperties();
if(lpAudioProperties)
{
m_iLength = lpAudioProperties->length();
m_iBitrate = lpAudioProperties->bitrate();
m_iSampleRate = lpAudioProperties->sampleRate();
m_iChannels = lpAudioProperties->channels();
m_iSampleWidth = lpAudioProperties->sampleWidth();
m_ullSampleFrames = lpAudioProperties->sampleFrames();
}
break;
}
default:
break;
}
if(lpTagV2 && m_bID3V2)
readTagV2(lpTagV2);
if(lpTagV1 && m_bID3V1)
readTagV1(lpTagV1);
if(lpTagAPE && m_bAPE)
readTagAPE(lpTagAPE);
if(m_bProperties)
readTagProperties(tags);
if(lpApe)
delete lpApe;
if(lpASF)
delete lpASF;
if(lpFlac)
delete lpFlac;
if(lpMP4)
delete lpMP4;
if(lpMPC)
delete lpMPC;
if(lpMPEG)
delete lpMPEG;
if(lpTrueAudio)
delete lpTrueAudio;
if(lpWavPack)
delete lpWavPack;
if(lpWav)
delete lpWav;
m_bIsValid = true;
return(true);
}
bool cMediaInfo::readFromDB()
{
return(true);
}
qint32 cMediaInfo::writeFilename()
{
QSqlQuery query;
query.prepare("SELECT id FROM file WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;");
query.bindValue(":fileName", fileName());
query.bindValue(":fileSize", fileSize());
query.bindValue(":fileDate", fileDate());
if(!query.exec())
{
myDebug << query.lastError().text();
return(-1);
}
if(query.next())
query.prepare("UPDATE file SET fileType=:fileType, length=:length, bitrate=:bitrate, sampleRate=:sampleRate, channels=:channels, bitsPerSample=:bitsPerSample, layer=:layer, version=:version, sampleWidth=:sampleWidth, sampleFrames=:sampleFrames, isEncrypted=:isEncrypted, trackGain=:trackGain, albumGain=:albumGain, trackPeak=:trackPeak, albumPeak=:albumPeak, protectionEnabled=:protectionEnabled, channelMode=:channelMode, isCopyrighted=:isCopyrighted, isOriginal=:isOriginal, album=:album, title=:title, copyright=:copyright, trackNumber=:trackNumber, contentGroupDescription=:contentGroupDescription, subTitle=:subTitle, originalAlbum=:originalAlbum, partOfSet=:partOfSet, subTitleOfSet=:subTitleOfSet, internationalStandardRecordingCode=:internationalStandardRecordingCode, leadArtist=:leadArtist, band=:band, conductor=:conductor, interpret=:interpret, originalArtist=:originalArtist, textWriter=:textWriter, originalTextWriter=:originalTextWriter, composer=:composer, encodedBy=:encodedBy, beatsPerMinute=:beatsPerMinute, language=:language, contentType=:contentType, mediaType=:mediaType, mood=:mood, producedNotice=:producedNotice, publisher=:publisher, fileOwner=:fileOwner, internetRadioStationName=:internetRadioStationName, internetRadioStationOwner=:internetRadioStationOwner, originalFilename=:originalFilename, playlistDelay=:playlistDelay, encodingTime=:encodingTime, originalReleaseTime=:originalReleaseTime, recordingTime=:recordingTime, releaseTime=:releaseTime, taggingTime=:taggingTime, swhwSettings=:swhwSettings, albumSortOrder=:albumSortOrder, performerSortOrder=:performerSortOrder, titleSortOrder=:titleSortOrder, synchronizedLyrics=:synchronizedLyrics, unsynchronizedLyrics=:unsynchronizedLyrics WHERE filename=:filename AND filesize=:filesize AND filedate=:filedate;");
else
query.prepare("INSERT INTO file (fileName, fileSize, fileDate, fileType, length, bitrate, sampleRate, channels, bitsPerSample, layer, version, sampleWidth, sampleFrames, isEncrypted, trackGain, albumGain, trackPeak, albumPeak, protectionEnabled, channelMode, isCopyrighted, isOriginal, album, title, copyright, trackNumber, contentGroupDescription, subTitle, originalAlbum, partOfSet, subTitleOfSet, internationalStandardRecordingCode, leadArtist, band, conductor, interpret, originalArtist, textWriter, originalTextWriter, composer, encodedBy, beatsPerMinute, language, contentType, mediaType, mood, producedNotice, publisher, fileOwner, internetRadioStationName, internetRadioStationOwner, originalFilename, playlistDelay, encodingTime, originalReleaseTime, recordingTime, releaseTime, taggingTime, swhwSettings, albumSortOrder, performerSortOrder, titleSortOrder, synchronizedLyrics, unsynchronizedLyrics) VALUES (:fileName, :fileSize, :fileDate, :fileType, :length, :bitrate, :sampleRate, :channels, :bitsPerSample, :layer, :version, :sampleWidth, :sampleFrames, :isEncrypted, :trackGain, :albumGain, :trackPeak, :albumPeak, :protectionEnabled, :channelMode, :isCopyrighted, :isOriginal, :album, :title, :copyright, :trackNumber, :contentGroupDescription, :subTitle, :originalAlbum, :partOfSet, :subTitleOfSet, :internationalStandardRecordingCode, :leadArtist, :band, :conductor, :interpret, :originalArtist, :textWriter, :originalTextWriter, :composer, :encodedBy, :beatsPerMinute, :language, :contentType, :mediaType, :mood, :producedNotice, :publisher, :fileOwner, :internetRadioStationName, :internetRadioStationOwner, :originalFilename, :playlistDelay, :encodingTime, :originalReleaseTime, :recordingTime, :releaseTime, :taggingTime, :swhwSettings, :albumSortOrder, :performerSortOrder, :titleSortOrder, :synchronizedLyrics, :unsynchronizedLyrics);");
query.bindValue(":fileName", fileName());
query.bindValue(":fileSize", fileSize());
query.bindValue(":fileDate", fileDate());
query.bindValue(":fileType", fileType());
query.bindValue(":length", length());
query.bindValue(":bitrate", bitrate());
query.bindValue(":sampleRate", sampleRate());
query.bindValue(":channels", channels());
query.bindValue(":bitsPerSample", bitsPerSample());
query.bindValue(":layer", layer());
query.bindValue(":version", version());
query.bindValue(":sampleWidth", sampleWidth());
query.bindValue(":sampleFrames", sampleFrames());
query.bindValue(":isEncrypted", isEncrypted());
query.bindValue(":trackGain", trackGain());
query.bindValue(":albumGain", albumGain());
query.bindValue(":trackPeak", trackPeak());
query.bindValue(":albumPeak", albumPeak());
query.bindValue(":protectionEnabled", protectionEnabled());
query.bindValue(":channelMode", channelMode());
query.bindValue(":isCopyrighted", isCopyrighted());
query.bindValue(":isOriginal", isOriginal());
query.bindValue(":album", album());
query.bindValue(":title", title());
query.bindValue(":copyright", copyright());
query.bindValue(":trackNumber", trackNumber());
query.bindValue(":contentGroupDescription", contentGroupDescription());
query.bindValue(":subTitle", subTitle());
query.bindValue(":originalAlbum", originalAlbum());
query.bindValue(":partOfSet", partOfSet());
query.bindValue(":subTitleOfSet", subTitleOfSet());
query.bindValue(":internationalStandardRecordingCode", internationalStandardRecordingCode());
query.bindValue(":leadArtist", leadArtist());
query.bindValue(":band", band());
query.bindValue(":conductor", conductor());
query.bindValue(":interpret", interpret().join(", "));
query.bindValue(":originalArtist", originalArtist());
query.bindValue(":textWriter", textWriter());
query.bindValue(":originalTextWriter", originalTextWriter());
query.bindValue(":composer", composer());
query.bindValue(":encodedBy", encodedBy());
query.bindValue(":beatsPerMinute", beatsPerMinute());
query.bindValue(":language", language().join(", "));
query.bindValue(":contentType", contentType().join(", "));
query.bindValue(":mediaType", mediaType().join(", "));
query.bindValue(":mood", mood());
query.bindValue(":producedNotice", producedNotice());
query.bindValue(":publisher", publisher());
query.bindValue(":fileOwner", fileOwner());
query.bindValue(":internetRadioStationName", internetRadioStationName());
query.bindValue(":internetRadioStationOwner", internetRadioStationOwner());
query.bindValue(":originalFilename", originalFilename());
query.bindValue(":playlistDelay", playlistDelay());
query.bindValue(":encodingTime", encodingTime());
query.bindValue(":originalReleaseTime", originalReleaseTime());
query.bindValue(":recordingTime", recordingTime());
query.bindValue(":releaseTime", releaseTime());
query.bindValue(":taggingTime", taggingTime());
query.bindValue(":swhwSettings", swhwSettings().join(", "));
query.bindValue(":albumSortOrder", albumSortOrder());
query.bindValue(":performerSortOrder", performerSortOrder());
query.bindValue(":titleSortOrder", titleSortOrder());
query.bindValue(":synchronizedLyrics", synchronizedLyrics().join());
query.bindValue(":unsynchronizedLyrics", unsynchronizedLyrics().join("||"));
if(!query.exec())
{
myDebug << query.lastError().text();
return(-1);
}
query.prepare("SELECT id FROM file WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;");
query.bindValue(":fileName", fileName());
query.bindValue(":fileSize", fileSize());
query.bindValue(":fileDate", fileDate());
if(!query.exec())
{
myDebug << query.lastError().text();
return(-1);
}
if(query.next())
return(query.value("id").toInt());
return(-1);
}
bool cMediaInfo::writeToDB()
{
QSqlQuery query;
qint32 idFile = writeFilename();
if(idFile == -1)
return(false);
query.prepare("DELETE FROM image WHERE fileID=:fileID;");
query.bindValue(":fileID", idFile);
if(!query.exec())
{
myDebug << query.lastError().text();
return(false);
}
for(int x = 0;x < m_pixmapList.count();x++)
{
cPixmap pixmap = m_pixmapList.at(x);
query.prepare("INSERT INTO image (fileID, fileName, imageType, image) VALUES (:fileID, :fileName, :imageType, :image);");
query.bindValue(":fileID", idFile);
query.bindValue(":fileName", pixmap.fileName());
query.bindValue(":imageType", (qint16)pixmap.imageType());
query.bindValue(":description", pixmap.description());
QByteArray baImage;
QBuffer buffer(&baImage);
buffer.open(QIODevice::WriteOnly);
m_pixmapList.at(x).save(&buffer, "JPG");
query.bindValue(":image", baImage);
if(!query.exec())
{
myDebug << query.lastError().text();
return(false);
}
}
return(true);
}
void cMediaInfo::readTagV1(ID3v1::Tag* lpTag)
{
QString szTmp;
if(m_szAlbum.isEmpty())
m_szAlbum = QString::fromStdWString(lpTag->album().toWString());
szTmp = QString::fromStdWString(lpTag->artist().toWString());
if(!szTmp.isEmpty() && m_szArtistList.isEmpty())
m_szArtistList = szTmp.split("\n");
if(m_szComment.isEmpty())
m_szComment = QString::fromStdWString(lpTag->comment().toWString());
szTmp = QString::fromStdWString(lpTag->genre().toWString());
if(!szTmp.isEmpty() && m_szGenreList.isEmpty())
m_szGenreList = szTmp.split("\n");
if(m_szTitle.isEmpty())
m_szTitle = QString::fromStdWString(lpTag->title().toWString());
if(m_szTrackNumber.isEmpty())
m_szTrackNumber = QString("%1").arg(lpTag->track());
if(m_iYear == 0)
m_iYear = lpTag->year();
}
void cMediaInfo::readTagV2(ID3v2::Tag* lpTag)
{
m_iID3v2Version = lpTag->header()->majorVersion();
m_iID3v2Revision = lpTag->header()->revisionNumber();
m_iID3v2Size = lpTag->header()->tagSize();
for(ID3v2::FrameList::ConstIterator it = lpTag->frameList().begin();it != lpTag->frameList().end();it++)
{
QString szID = QString("%1").arg((*it)->frameID().data()).left(4);
if(!szID.compare("TIT1"))
m_szContentGroupDescription = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TIT2"))
m_szTitle = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TIT3"))
m_szSubTitle = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TALB"))
m_szAlbum = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TOAL"))
m_szOriginalAlbum = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TRCK"))
m_szTrackNumber = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPOS"))
m_szPartOfSet = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TSST"))
m_szSubTitleOfSet = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TSRC"))
m_szInternationalStandardRecordingCode = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPE1"))
m_szLeadArtist = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPE2"))
m_szBand = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPE3"))
m_szConductor = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPE4"))
m_szInterpret = QString::fromStdWString((*it)->toString().toWString()).split("\r\n");
else if(!szID.compare("TOPE"))
m_szOriginalArtist = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TEXT"))
m_szTextWriter = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TOLY"))
m_szOriginalTextWriter = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TCOM"))
m_szComposer = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TENC"))
m_szEncodedBy = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TBPM"))
m_iBeatsPerMinute = QString::fromStdWString((*it)->toString().toWString()).toInt();
else if(!szID.compare("TLEN") && m_iLength == 0)
m_iLength = QString::fromStdWString((*it)->toString().toWString()).toInt();
else if(!szID.compare("TLAN"))
m_szLanguage = QString::fromStdWString((*it)->toString().toWString()).split("\r\n");
else if(!szID.compare("TCON"))
m_szContentType = QString::fromStdWString((*it)->toString().toWString()).split("\r\n");
else if(!szID.compare("TFLT"))
m_szFileType = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TMED"))
m_szMediaType = QString::fromStdWString((*it)->toString().toWString()).split("\r\n");
else if(!szID.compare("TMOO"))
m_szMood = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TCOP"))
m_szCopyright = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPRO"))
m_szProducedNotice = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TPUB"))
m_szPublisher = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TOWN"))
m_szFileOwner = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TRSN"))
m_szInternetRadioStationName = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TRSO"))
m_szInternetRadioStationOwner = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TOFN"))
m_szOriginalFilename = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TDLY"))
m_iPlaylistDelay = QString::fromStdWString((*it)->toString().toWString()).toInt();
else if(!szID.compare("TDEN"))
m_encodingTime = str2TS(QString::fromStdWString((*it)->toString().toWString()));
else if(!szID.compare("TDOR"))
m_originalReleaseTime = str2TS(QString::fromStdWString((*it)->toString().toWString()));
else if(!szID.compare("TDRC"))
m_recordingTime = str2TS(QString::fromStdWString((*it)->toString().toWString()));
else if(!szID.compare("TDRL"))
m_releaseTime = str2TS(QString::fromStdWString((*it)->toString().toWString()));
else if(!szID.compare("TDTG"))
m_taggingTime = str2TS(QString::fromStdWString((*it)->toString().toWString()));
else if(!szID.compare("TSSE"))
m_szswhwSettings = QString(QString::fromStdWString((*it)->toString().toWString())).split("\r\n");
else if(!szID.compare("TSOA"))
m_szAlbumSortOrder = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TSOP"))
m_szPerformerSortOrder = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("TSOT"))
m_szTitleSortOrder = QString::fromStdWString((*it)->toString().toWString());
else if(!szID.compare("SYLT"))
{
TagLib::ID3v2::SynchronizedLyricsFrame* lpLyrics = static_cast<TagLib::ID3v2::SynchronizedLyricsFrame *> (*it);
m_szSynchronizedLyricsLanguage = QString(lpLyrics->language().data()).left(3);
String::Type type = lpLyrics->textEncoding();
m_szSynchronizedLyricsDescription = QString::fromStdWString(lpLyrics->description().toWString());
TagLib::ID3v2::SynchronizedLyricsFrame::SynchedTextList list = lpLyrics->synchedText();
for(ID3v2::SynchronizedLyricsFrame::SynchedTextList::ConstIterator it1 = list.begin(); it1 != list.end();it1++)
{
ID3v2::SynchronizedLyricsFrame::SynchedText t = *(it1);
m_szSynchronizedLyrics.add(t.time, QString::fromStdWString(t.text.toWString()));
}
}
else if(!szID.compare("USLT"))
{
TagLib::ID3v2::UnsynchronizedLyricsFrame* lpLyrics = static_cast<TagLib::ID3v2::UnsynchronizedLyricsFrame *> (*it);
m_szUnsynchronizedLyricsLanguage = QString(lpLyrics->language().data()).left(3);
String::Type type = lpLyrics->textEncoding();
m_szUnsynchronizedLyricsDescription = QString::fromStdWString(lpLyrics->description().toWString());
QString szText = QString::fromStdWString(lpLyrics->text().toWString());
if(szText.contains("\r\n"))
m_szUnsynchronizedLyrics = szText.split("\r\n");
else if(szText.contains("\r"))
m_szUnsynchronizedLyrics = szText.split("\r");
else if(szText.contains("\n"))
m_szUnsynchronizedLyrics = szText.split("\n");
else
m_szUnsynchronizedLyrics.append(szText);
}
else if(!szID.compare("APIC"))
{
TagLib::ID3v2::AttachedPictureFrame* lpPicture = static_cast<TagLib::ID3v2::AttachedPictureFrame *> (*it);
TagLib::ID3v2::AttachedPictureFrame::Type t = lpPicture->type();
QString szDescription;
szDescription = QString::fromStdWString(lpPicture->description().toWString());
QByteArray pictureData = QByteArray(lpPicture->picture().data(), lpPicture->picture().size());
m_pixmapList.add(pictureData, m_szFileName, (cPixmap::ImageType)t, szDescription);
}
}
}
void cMediaInfo::readTagAPE(APE::Tag* lpTag)
{
for(APE::ItemListMap::ConstIterator it = lpTag->itemListMap().begin();it != lpTag->itemListMap().end();++it)
{
QString szID = QString::fromStdWString((*it).first.toWString());
QString szVal = QString::fromStdWString((*it).second.toString().toWString());
if(!szID.isEmpty() && !szVal.isEmpty())
m_TAGAPEList.add(szID.left(4), szVal);
}
}
void cMediaInfo::readTagProperties(TagLib::PropertyMap& tags)
{
QString szID;
for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i)
{
QStringList szValue;
szID = QString::fromStdWString(i->first.toWString());
if(!szID.isEmpty())
{
for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j)
{
QString sz = QString::fromStdWString((*j).toWString());
if(!sz.isEmpty())
{
if(!szID.compare("LYRICS"))
{
sz.replace("\"", "'");
sz.replace("\r\n", "\n");
szValue.append(sz);
}
else
szValue.append(sz.split("\n"));
}
}
if(!szID.isEmpty() && !szValue.isEmpty())
m_TAGPropertiesList.add(szID, szValue);
}
}
}
QDateTime cMediaInfo::str2TS(const QString& sz)
{
QDateTime dt;
switch(sz.length())
{
case 4:
dt = QDateTime::fromString(sz, QString("yyyy"));
break;
case 7:
dt = QDateTime::fromString(sz, QString("yyyy-MM"));
break;
case 10:
dt = QDateTime::fromString(sz, QString("yyyy-MM-dd"));
break;
case 13:
dt = QDateTime::fromString(sz, QString("yyyy-MM-ddTHH"));
break;
case 16:
dt = QDateTime::fromString(sz, QString("yyyy-MM-ddTHH:mm"));
break;
case 19:
dt = QDateTime::fromString(sz, QString("yyyy-MM-ddTHH:mm:ss"));
break;
default:
return(QDateTime());
}
return(dt);
}
bool cMediaInfo::isValid()
{
return(m_bIsValid);
}
QString cMediaInfo::fileName()
{
return(m_szFileName);
}
qint64 cMediaInfo::fileSize()
{
QFileInfo fileInfo(m_szFileName);
return(fileInfo.size());
}
QDateTime cMediaInfo::fileDate()
{
QFileInfo fileInfo(m_szFileName);
return(fileInfo.created());
}
cMediaInfo::MEDIA_TYPE cMediaInfo::fileType()
{
return(m_fileType);
}
qint16 cMediaInfo::bitrate()
{
return(m_iBitrate);
}
QString cMediaInfo::bitrateText()
{
return("not implemented");
}
qint32 cMediaInfo::sampleRate()
{
return(m_iSampleRate);
}
QString cMediaInfo::sampleRateText()
{
return("not implemented");
}
qint16 cMediaInfo::channels()
{
return(m_iChannels);
}
QString cMediaInfo::channelsText()
{
return("not implemented");
}
qint16 cMediaInfo::bitsPerSample()
{
return(m_iBitsPerSample);
}
QString cMediaInfo::bitsPerSampleText()
{
return("not implemented");
}
qint16 cMediaInfo::layer()
{
return(m_iLayer);
}
QString cMediaInfo::layerText()
{
return("not implemented");
}
qint16 cMediaInfo::version()
{
return(m_iVersion);
}
QString cMediaInfo::versionText()
{
return("not implemented");
}
qint16 cMediaInfo::sampleWidth()
{
return(m_iSampleWidth);
}
QString cMediaInfo::sampleWidthText()
{
return("not implemented");
}
qint64 cMediaInfo::sampleFrames()
{
return(m_ullSampleFrames);
}
QString cMediaInfo::sampleFramesText()
{
return("not implemented");
}
bool cMediaInfo::isEncrypted()
{
return(m_bIsEncrypted);
}
qint16 cMediaInfo::trackGain()
{
return(m_iTrackGain);
}
qint16 cMediaInfo::albumGain()
{
return(m_iAlbumGain);
}
qint16 cMediaInfo::trackPeak()
{
return(m_iTrackPeak);
}
qint16 cMediaInfo::albumPeak()
{
return(m_iAlbumPeak);
}
bool cMediaInfo::protectionEnabled()
{
return(m_bProtectionEnabled);
}
cMediaInfo::CHANNEL_MODE cMediaInfo::channelMode()
{
return(m_channelMode);
}
QString cMediaInfo::channelModeText()
{
switch(m_channelMode)
{
case CHANNEL_MODE_STEREO:
return("stereo");
case CHANNEL_MODE_JOINTSTEREO:
return("joint stereo");
case CHANNEL_MODE_MONO:
return("mono");
case CHANNEL_MODE_DUALMONO:
return("dual mono");
default:
return("unknown");
}
}
bool cMediaInfo::isCopyrighted()
{
return(m_bIsCopyrighted);
}
bool cMediaInfo::isOriginal()
{
return(m_bIsOriginal);
}
QString cMediaInfo::contentGroupDescription()
{
return(m_szContentGroupDescription);
}
QString cMediaInfo::title()
{
return(m_szTitle);
}
QString cMediaInfo::subTitle()
{
return(m_szSubTitle);
}
QString cMediaInfo::album()
{
return(m_szAlbum);
}
QString cMediaInfo::originalAlbum()
{
return(m_szOriginalAlbum);
}
QString cMediaInfo::trackNumber()
{
return(m_szTrackNumber);
}
QString cMediaInfo::partOfSet()
{
return(m_szPartOfSet);
}
QString cMediaInfo::subTitleOfSet()
{
return(m_szSubTitleOfSet);
}
QString cMediaInfo::internationalStandardRecordingCode()
{
return(m_szInternationalStandardRecordingCode);
}
QString cMediaInfo::leadArtist()
{
return(m_szLeadArtist);
}
QString cMediaInfo::band()
{
return(m_szBand);
}
QString cMediaInfo::conductor()
{
return(m_szConductor);
}
QStringList cMediaInfo::interpret()
{
return(m_szInterpret);
}
QString cMediaInfo::originalArtist()
{
return(m_szOriginalArtist);
}
QString cMediaInfo::textWriter()
{
return(m_szTextWriter);
}
QString cMediaInfo::originalTextWriter()
{
return(m_szOriginalTextWriter);
}
QString cMediaInfo::composer()
{
return(m_szComposer);
}
QString cMediaInfo::encodedBy()
{
return(m_szEncodedBy);
}
qint16 cMediaInfo::beatsPerMinute()
{
return(m_iBeatsPerMinute);
}
qint32 cMediaInfo::length()
{
return(m_iLength);
}
QStringList cMediaInfo::language()
{
return(m_szLanguage);
}
QStringList cMediaInfo::contentType()
{
return(m_szContentType);
}
QStringList cMediaInfo::mediaType()
{
return(m_szMediaType);
}
QString cMediaInfo::mood()
{
return(m_szMood);
}
QString cMediaInfo::copyright()
{
return(m_szCopyright);
}
QString cMediaInfo::producedNotice()
{
return(m_szProducedNotice);
}
QString cMediaInfo::publisher()
{
return(m_szPublisher);
}
QString cMediaInfo::fileOwner()
{
return(m_szFileOwner);
}
QString cMediaInfo::internetRadioStationName()
{
return(m_szInternetRadioStationName);
}
QString cMediaInfo::internetRadioStationOwner()
{
return(m_szInternetRadioStationOwner);
}
QString cMediaInfo::originalFilename()
{
return(m_szOriginalFilename);
}
qint32 cMediaInfo::playlistDelay()
{
return(m_iPlaylistDelay);
}
QDateTime cMediaInfo::encodingTime()
{
return(m_encodingTime);
}
QDateTime cMediaInfo::originalReleaseTime()
{
return(m_originalReleaseTime);
}
QDateTime cMediaInfo::recordingTime()
{
return(m_recordingTime);
}
QDateTime cMediaInfo::releaseTime()
{
return(m_releaseTime);
}
QDateTime cMediaInfo::taggingTime()
{
return(m_taggingTime);
}
QStringList cMediaInfo::swhwSettings()
{
return(m_szswhwSettings);
}
QString cMediaInfo::albumSortOrder()
{
return(m_szAlbumSortOrder);
}
QString cMediaInfo::performerSortOrder()
{
return(m_szPerformerSortOrder);
}
QString cMediaInfo::titleSortOrder()
{
return(m_szTitleSortOrder);
}
cStringTimeList cMediaInfo::synchronizedLyrics()
{
return(m_szSynchronizedLyrics);
}
QStringList cMediaInfo::unsynchronizedLyrics()
{
return(m_szUnsynchronizedLyrics);
}
cPixmapList cMediaInfo::pixmaps()
{
return(m_pixmapList);
}
/*
* http://de.wikipedia.org/wiki/ID3-Tag
* http://id3.org/id3v2.4.0-frames
* http://id3.org/id3v2.4.0-structure
*/