00001 #include <QHash>
00002
00003 #include "bdnav/meta_data.h"
00004 #include "bluraymetadata.h"
00005 #include "mythdirs.h"
00006
00007 BlurayMetadata::BlurayMetadata(const QString path) :
00008 m_bdnav(NULL), m_metadata(NULL),
00009 m_title(QString()), m_alttitle(QString()),
00010 m_language(QString()), m_discnumber(0),
00011 m_disctotal(0), m_path(path),
00012 m_images(QStringList()), m_topMenuSupported(false),
00013 m_firstPlaySupported(false), m_numHDMVTitles(0),
00014 m_numBDJTitles(0), m_numUnsupportedTitles(0),
00015 m_aacsDetected(false), m_libaacsDetected(false),
00016 m_aacsHandled(false), m_bdplusDetected(false),
00017 m_libbdplusDetected(false), m_bdplusHandled(false)
00018 {
00019 }
00020
00021 BlurayMetadata::~BlurayMetadata()
00022 {
00023 if (m_bdnav)
00024 bd_close(m_bdnav);
00025 }
00026
00027 bool BlurayMetadata::OpenDisc(void)
00028 {
00029 if (IsOpen())
00030 return true;
00031
00032 QString keyfile = QString("%1/KEYDB.cfg").arg(GetConfDir());
00033 QByteArray keyarray = keyfile.toAscii();
00034 const char *keyfilepath = keyarray.data();
00035
00036 m_bdnav = bd_open(m_path.toLatin1().data(), keyfilepath);
00037
00038 if (!m_bdnav)
00039 return false;
00040
00041 return true;
00042 }
00043
00044 bool BlurayMetadata::ParseDisc(void)
00045 {
00046 if (!OpenDisc() && !m_bdnav)
00047 return false;
00048
00049 m_metadata = bd_get_meta(m_bdnav);
00050
00051 if (m_metadata)
00052 {
00053 m_title = QString(m_metadata->di_name);
00054 m_alttitle = QString(m_metadata->di_alternative);
00055 m_language = QString(m_metadata->language_code);
00056 m_discnumber = m_metadata->di_set_number;
00057 m_disctotal = m_metadata->di_num_sets;
00058
00059 for (unsigned i = 0; i < m_metadata->toc_count; i++)
00060 {
00061 uint num = m_metadata->toc_entries[i].title_number;
00062 QString title = QString(m_metadata->toc_entries[i].title_name);
00063 QPair<uint,QString> ret(num,title);
00064 m_titles.append(ret);
00065 }
00066
00067 for (unsigned i = 0; i < m_metadata->thumb_count; i++)
00068 {
00069 QString filepath = QString("%1/BDMV/META/DL/%2")
00070 .arg(m_path)
00071 .arg(m_metadata->thumbnails[i].path);
00072 m_images.append(filepath);
00073 }
00074 }
00075
00076 const BLURAY_DISC_INFO *discinfo = bd_get_disc_info(m_bdnav);
00077 if (discinfo)
00078 {
00079 m_topMenuSupported = discinfo->top_menu_supported;
00080 m_firstPlaySupported = discinfo->first_play_supported;
00081 m_numHDMVTitles = discinfo->num_hdmv_titles;
00082 m_numBDJTitles = discinfo->num_bdj_titles;
00083 m_numUnsupportedTitles = discinfo->num_unsupported_titles;
00084 m_aacsDetected = discinfo->aacs_detected;
00085 m_libaacsDetected = discinfo->libaacs_detected;
00086 m_aacsHandled = discinfo->aacs_handled;
00087 m_bdplusDetected = discinfo->bdplus_detected;
00088 m_libbdplusDetected = discinfo->libbdplus_detected;
00089 m_bdplusHandled = discinfo->bdplus_handled;
00090 }
00091
00092 return true;
00093 }
00094
00095 void BlurayMetadata::toMap(MetadataMap &metadataMap)
00096 {
00097 metadataMap["title"] = m_title;
00098 metadataMap["alttitle"] = m_alttitle;
00099 metadataMap["language"] = m_language;
00100
00101 metadataMap["discnumber"] = QString::number(m_discnumber);
00102 metadataMap["disctotal"] = QString::number(m_disctotal);
00103 metadataMap["discseries"] = QObject::tr("%1 of %2")
00104 .arg(m_discnumber)
00105 .arg(m_disctotal);
00106
00107 metadataMap["numtitles"] = m_titles.count();
00108 metadataMap["numthumbs"] = m_images.count();
00109 }