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.

212 lines
4.6 KiB
C++

#include "ctvshowepisode.h"
#include <QFile>
#include <QDomDocument>
#include <QDomElement>
#include <QDomNode>
#include <QDir>
cTVShowEpisode::cTVShowEpisode(const QString& szPath, const QString& szFile, const QByteArray& szNFO)
{
m_bWatched = false;
load(szPath, szFile, szNFO);
}
bool cTVShowEpisode::isValid()
{
return(!m_szPath.isEmpty() && !m_szNFO.isEmpty());
}
void cTVShowEpisode::load(const QString& szPath, const QString& szFile, const QByteArray& szNFO)
{
QDir dir(szPath);
if(!dir.exists())
return;
if(!loadNFO(szNFO))
return;
if(m_szNFO.isEmpty())
return;
QString szPrefix = szFile.left(szFile.lastIndexOf(".nfo"));
QStringList thumb = dir.entryList(QStringList() << QString("%1-thumb.*").arg(szPrefix), QDir::Files);
if(thumb.count())
m_szThumb = thumb.at(0);
m_szPath = szPath;
}
bool cTVShowEpisode::loadNFO(const QByteArray& szNFO)
{
QDomDocument doc;
QString errorStr;
int errorLine;
int errorColumn;
if(!doc.setContent(szNFO, false, &errorStr, &errorLine, &errorColumn))
return(false);
QDomElement root = doc.documentElement();
if(root.tagName().compare("episodedetails", Qt::CaseInsensitive))
return(false);
QDomNode child = root.firstChild();
QString szTmp;
while(!child.isNull())
{
CHECKELEMENTS(child, "title", m_szTitle);
else CHECKELEMENTS(child, "showtitle", m_szShowTitle);
else CHECKELEMENTD(child, "rating", m_dRating);
else CHECKELEMENTI(child, "season", m_iSeason);
else CHECKELEMENTI(child, "episode", m_iEpisode);
else CHECKELEMENTS(child, "plot", m_szPlot);
else CHECKELEMENTS(child, "outline", m_szOutline);
else CHECKELEMENTS(child, "mpaa", m_szMPAA);
else CHECKELEMENTI(child, "playcount", m_iPlaycount);
else CHECKELEMENTP(child, "aired", m_Aired);
else CHECKELEMENTL(child, "studio", m_szStudioList);
else CHECKELEMENTL(child, "credits", m_szCreditsList);
else CHECKELEMENTL(child, "director", m_szDirectorList);
else CHECKELEMENTL(child, "thumb", m_szThumbList);
else CHECKELEMENTF(child, "fileinfo", parseFileInfo);
child = child.nextSibling();
}
m_szNFO = szNFO;
return(true);
}
void cTVShowEpisode::parseFileInfo(const QDomElement& element)
{
QDomNode child = element.firstChild();
while(!child.isNull())
{
CHECKELEMENTF(child, "streamdetails", parseStreamDetails);
child = child.nextSibling();
}
}
void cTVShowEpisode::parseStreamDetails(const QDomElement& element)
{
QDomNode child = element.firstChild();
while(!child.isNull())
{
CHECKELEMENTF(child, "video", parseStreamDetailsVideo);
else CHECKELEMENTF(child, "audio", parseStreamDetailsAudio);
else CHECKELEMENTF(child, "subtitle", parseStreamDetailsSubtitle);
child = child.nextSibling();
}
}
void cTVShowEpisode::parseStreamDetailsVideo(const QDomElement& element)
{
QDomNode child = element.firstChild();
VIDEO video;
while(!child.isNull())
{
CHECKELEMENTD(child, "aspect", video.dAspect);
else CHECKELEMENTS(child, "codec", video.szCodec);
else CHECKELEMENTI(child, "durationinseconds", video.iDuration);
else CHECKELEMENTI(child, "height", video.iHeight);
else CHECKELEMENTS(child, "scantype", video.szScantype);
else CHECKELEMENTI(child, "width", video.iWidth);
child = child.nextSibling();
}
m_VideoList.append(video);
}
void cTVShowEpisode::parseStreamDetailsAudio(const QDomElement& element)
{
QDomNode child = element.firstChild();
AUDIO audio;
while(!child.isNull())
{
CHECKELEMENTI(child, "channels", audio.iChannels);
else CHECKELEMENTS(child, "codec", audio.szCodec);
else CHECKELEMENTS(child, "language", audio.szLanguage);
child = child.nextSibling();
}
m_AudioList.append(audio);
}
void cTVShowEpisode::parseStreamDetailsSubtitle(const QDomElement& element)
{
QDomNode child = element.firstChild();
SUBTITLE subtitle;
while(!child.isNull())
{
CHECKELEMENTS(child, "language", subtitle.szLanguage);
child = child.nextSibling();
}
m_SubtitleList.append(subtitle);
}
QString cTVShowEpisode::showTitle()
{
return(m_szShowTitle);
}
QString cTVShowEpisode::title()
{
return(m_szTitle);
}
qint16 cTVShowEpisode::season()
{
return(m_iSeason);
}
qint16 cTVShowEpisode::episode()
{
return(m_iEpisode);
}
QString cTVShowEpisode::plot()
{
return(m_szPlot);
}
QList<VIDEO> cTVShowEpisode::videoList()
{
return(m_VideoList);
}
QList<AUDIO> cTVShowEpisode::audioList()
{
return(m_AudioList);
}
void cTVShowEpisode::setWatched(bool bWatched)
{
m_bWatched = bWatched;
}
void cTVShowEpisode::setAdded(const QDateTime &added)
{
m_Added = added;
}
bool cTVShowEpisode::watched()
{
return(m_bWatched);
}
QDateTime cTVShowEpisode::added()
{
return(m_Added);
}