00001
00007 #include "iptvchannel.h"
00008
00009
00010 #include "mythdb.h"
00011 #include "mythlogging.h"
00012 #include "iptvchannelfetcher.h"
00013 #include "iptvfeederwrapper.h"
00014
00015 #define LOC QString("IPTVChan(%1): ").arg(GetCardID())
00016
00017 IPTVChannel::IPTVChannel(TVRec *parent,
00018 const QString &videodev)
00019 : DTVChannel(parent),
00020 m_videodev(videodev),
00021 m_feeder(new IPTVFeederWrapper()),
00022 m_lock(QMutex::Recursive)
00023 {
00024 m_videodev.detach();
00025 LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
00026 }
00027
00028 IPTVChannel::~IPTVChannel()
00029 {
00030 LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor -- begin");
00031 if (m_feeder)
00032 {
00033 delete m_feeder;
00034 m_feeder = NULL;
00035 }
00036 LOG(VB_CHANNEL, LOG_INFO, LOC + "dtor -- end");
00037 }
00038
00039 bool IPTVChannel::Open(void)
00040 {
00041 LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- begin");
00042 QMutexLocker locker(&m_lock);
00043 LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- locked");
00044
00045 if (!InitializeInputs())
00046 {
00047 LOG(VB_GENERAL, LOG_ERR, LOC + "InitializeInputs() failed");
00048 return false;
00049 }
00050
00051 if (m_freeboxchannels.empty())
00052 {
00053 QString content = IPTVChannelFetcher::DownloadPlaylist(
00054 m_videodev, true);
00055 m_freeboxchannels = IPTVChannelFetcher::ParsePlaylist(content);
00056 LOG(VB_GENERAL, LOG_NOTICE, LOC + QString("Loaded %1 channels from %2")
00057 .arg(m_freeboxchannels.size()) .arg(m_videodev));
00058 }
00059
00060 LOG(VB_CHANNEL, LOG_INFO, LOC + "Open() -- end");
00061 return !m_freeboxchannels.empty();
00062 }
00063
00064 void IPTVChannel::Close(void)
00065 {
00066 LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- begin");
00067 QMutexLocker locker(&m_lock);
00068 LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- locked");
00069
00070 LOG(VB_CHANNEL, LOG_INFO, LOC + "Close() -- end");
00071 }
00072
00073 bool IPTVChannel::IsOpen(void) const
00074 {
00075 LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- begin");
00076 QMutexLocker locker(&m_lock);
00077 LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- locked");
00078 LOG(VB_CHANNEL, LOG_INFO, LOC + "IsOpen() -- end");
00079 return !m_freeboxchannels.empty();
00080 }
00081
00082 bool IPTVChannel::SetChannelByString(const QString &channum)
00083 {
00084 LOG(VB_CHANNEL, LOG_INFO, LOC + QString("SetChannelByString(%1) -- begin")
00085 .arg(channum));
00086 QMutexLocker locker(&m_lock);
00087 LOG(VB_CHANNEL, LOG_INFO, LOC + "SetChannelByString() -- locked");
00088
00089 InputMap::const_iterator it = m_inputs.find(m_currentInputID);
00090 if (it == m_inputs.end())
00091 return false;
00092
00093 uint mplexid_restriction;
00094 if (!IsInputAvailable(m_currentInputID, mplexid_restriction))
00095 return false;
00096
00097
00098 if (!GetChanInfo(channum).isValid())
00099 {
00100 LOG(VB_GENERAL, LOG_ERR, LOC +
00101 QString("SetChannelByString(%1)").arg(channum) +
00102 " Invalid channel");
00103 return false;
00104 }
00105
00106
00107 QString tmp = channum; tmp.detach();
00108 m_curchannelname = tmp;
00109
00110
00111 SetDTVInfo( 0, 0,
00112 0,
00113 0, 1);
00114
00115 HandleScript(channum );
00116
00117 LOG(VB_CHANNEL, LOG_INFO, LOC + QString("SetChannelByString(%1) = %2 -- end")
00118 .arg(channum).arg(m_curchannelname));
00119 return true;
00120 }
00121
00122 IPTVChannelInfo IPTVChannel::GetChanInfo(
00123 const QString &channum, uint sourceid) const
00124 {
00125 LOG(VB_CHANNEL, LOG_INFO, LOC + "GetChanInfo() -- begin");
00126 QMutexLocker locker(&m_lock);
00127 LOG(VB_CHANNEL, LOG_INFO, LOC + "GetChanInfo() -- locked");
00128
00129 IPTVChannelInfo dummy;
00130 QString msg = LOC + QString("GetChanInfo(%1) failed").arg(channum);
00131
00132 if (channum.isEmpty())
00133 {
00134 LOG(VB_GENERAL, LOG_ERR, msg);
00135 return dummy;
00136 }
00137
00138 if (!sourceid)
00139 {
00140 InputMap::const_iterator it = m_inputs.find(m_currentInputID);
00141 if (it == m_inputs.end())
00142 {
00143 LOG(VB_GENERAL, LOG_ERR, msg);
00144 return dummy;
00145 }
00146 sourceid = (*it)->sourceid;
00147 }
00148
00149 MSqlQuery query(MSqlQuery::InitCon());
00150 query.prepare(
00151 "SELECT name "
00152 "FROM channel "
00153 "WHERE channum = :CHANNUM AND "
00154 " sourceid = :SOURCEID");
00155
00156 query.bindValue(":CHANNUM", channum);
00157 query.bindValue(":SOURCEID", sourceid);
00158
00159 if (!query.exec() || !query.isActive())
00160 {
00161 MythDB::DBError("fetching chaninfo", query);
00162 LOG(VB_GENERAL, LOG_ERR, msg);
00163 return dummy;
00164 }
00165
00166 while (query.next())
00167 {
00168 fbox_chan_map_t::const_iterator it;
00169 it = m_freeboxchannels.find(channum);
00170 if (it != m_freeboxchannels.end())
00171 {
00172 LOG(VB_CHANNEL, LOG_DEBUG, LOC +
00173 QString("Found: %1").arg((*it).toString()));
00174 return *it;
00175 }
00176
00177
00178 const QString name = query.value(0).toString();
00179 for (it = m_freeboxchannels.begin();
00180 it != m_freeboxchannels.end(); ++it)
00181 {
00182 if ((*it).m_name == name)
00183 {
00184 LOG(VB_CHANNEL, LOG_DEBUG, LOC +
00185 QString("Found: %1").arg((*it).toString()));
00186 return *it;
00187 }
00188 }
00189 LOG(VB_CHANNEL, LOG_DEBUG, LOC + QString("Not Found"));
00190 }
00191
00192 LOG(VB_GENERAL, LOG_ERR, msg);
00193 return dummy;
00194 }
00195
00196