00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022 #include <math.h>
00023
00024 #include "guide.h"
00025
00026 #include "compat.h"
00027 #include "mythversion.h"
00028 #include "mythcorecontext.h"
00029 #include "scheduler.h"
00030 #include "autoexpire.h"
00031 #include "channelutil.h"
00032
00033 extern AutoExpire *expirer;
00034 extern Scheduler *sched;
00035
00037
00039
00040 DTC::ProgramGuide *Guide::GetProgramGuide( const QDateTime &dtStartTime ,
00041 const QDateTime &dtEndTime ,
00042 int nStartChanId,
00043 int nNumChannels,
00044 bool bDetails )
00045 {
00046
00047 if (!dtStartTime.isValid())
00048 throw( "StartTime is invalid" );
00049
00050 if (!dtEndTime.isValid())
00051 throw( "EndTime is invalid" );
00052
00053 if (dtEndTime < dtStartTime)
00054 throw( "EndTime is before StartTime");
00055
00056 if (nNumChannels == 0)
00057 nNumChannels = SHRT_MAX;
00058
00059
00060
00061
00062
00063 int nEndChanId = nStartChanId;
00064
00065 MSqlQuery query(MSqlQuery::InitCon());
00066
00067 query.prepare( "SELECT chanid FROM channel WHERE (chanid >= :STARTCHANID )"
00068 " ORDER BY chanid LIMIT :NUMCHAN" );
00069
00070 query.bindValue(":STARTCHANID", nStartChanId );
00071 query.bindValue(":NUMCHAN" , nNumChannels );
00072
00073 if (!query.exec())
00074 MythDB::DBError("Select ChanId", query);
00075
00076 query.first(); nStartChanId = query.value(0).toInt();
00077 query.last(); nEndChanId = query.value(0).toInt();
00078
00079
00080
00081
00082
00083 ProgramList progList;
00084 ProgramList schedList;
00085 MSqlBindings bindings;
00086
00087 QString sSQL = "WHERE program.chanid >= :StartChanId "
00088 "AND program.chanid <= :EndChanId "
00089 "AND program.endtime >= :StartDate "
00090 "AND program.starttime <= :EndDate "
00091 "GROUP BY program.starttime, channel.channum, "
00092 "channel.callsign, program.title "
00093 "ORDER BY program.chanid ";
00094
00095 bindings[":StartChanId"] = nStartChanId;
00096 bindings[":EndChanId" ] = nEndChanId;
00097 bindings[":StartDate" ] = dtStartTime;
00098 bindings[":EndDate" ] = dtEndTime;
00099
00100
00101
00102
00103
00104 bool hasConflicts;
00105 LoadFromScheduler(schedList, hasConflicts);
00106
00107
00108
00109 LoadFromProgram( progList, sSQL, bindings, schedList );
00110
00111
00112
00113
00114
00115 DTC::ProgramGuide *pGuide = new DTC::ProgramGuide();
00116
00117 int nChanCount = 0;
00118 uint nCurChanId = 0;
00119 DTC::ChannelInfo *pChannel = NULL;
00120
00121 for( uint n = 0; n < progList.size(); n++)
00122 {
00123 ProgramInfo *pInfo = progList[ n ];
00124
00125 if ( nCurChanId != pInfo->GetChanID() )
00126 {
00127 nChanCount++;
00128
00129 nCurChanId = pInfo->GetChanID();
00130
00131 pChannel = pGuide->AddNewChannel();
00132
00133 FillChannelInfo( pChannel, pInfo, bDetails );
00134 }
00135
00136
00137 DTC::Program *pProgram = pChannel->AddNewProgram();
00138
00139 FillProgramInfo( pProgram, pInfo, false, bDetails );
00140 }
00141
00142
00143
00144 pGuide->setStartTime ( dtStartTime );
00145 pGuide->setEndTime ( dtEndTime );
00146 pGuide->setStartChanId ( nStartChanId );
00147 pGuide->setEndChanId ( nEndChanId );
00148 pGuide->setNumOfChannels( nChanCount );
00149 pGuide->setDetails ( bDetails );
00150
00151 pGuide->setCount ( progList.size());
00152 pGuide->setAsOf ( QDateTime::currentDateTime() );
00153
00154 pGuide->setVersion ( MYTH_BINARY_VERSION );
00155 pGuide->setProtoVer ( MYTH_PROTO_VERSION );
00156
00157 return pGuide;
00158 }
00159
00161
00163
00164 DTC::Program* Guide::GetProgramDetails( int nChanId,
00165 const QDateTime &dtStartTime )
00166
00167 {
00168 if (!dtStartTime.isValid())
00169 throw( "StartTime is invalid" );
00170
00171
00172
00173
00174
00175
00176
00177 MSqlBindings bindings;
00178 QString sSQL = "WHERE program.chanid = :ChanId "
00179 "AND program.starttime = :StartTime ";
00180
00181 bindings[":ChanId" ] = nChanId;
00182 bindings[":StartTime"] = dtStartTime;
00183
00184
00185
00186 ProgramList schedList;
00187 bool hasConflicts;
00188 LoadFromScheduler(schedList, hasConflicts);
00189
00190
00191
00192 ProgramList progList;
00193
00194 LoadFromProgram( progList, sSQL, bindings, schedList );
00195
00196 if ( progList.size() == 0)
00197 throw( "Error Reading Program Info" );
00198
00199
00200
00201 DTC::Program *pProgram = new DTC::Program();
00202 ProgramInfo *pInfo = progList[ 0 ];
00203
00204 FillProgramInfo( pProgram, pInfo, true );
00205
00206 return pProgram;
00207 }
00208
00210
00212
00213 QFileInfo Guide::GetChannelIcon( int nChanId,
00214 int nWidth ,
00215 int nHeight )
00216 {
00217
00218
00219 QString sFileName = ChannelUtil::GetIcon( nChanId );
00220
00221 if (sFileName.isEmpty())
00222 return QFileInfo();
00223
00224 if ((nWidth <= 0) && (nHeight <= 0))
00225 {
00226
00227 return QFileInfo( sFileName );
00228 }
00229
00230
00231 QString sNewFileName = QString( "%1.%2x%3.png" )
00232 .arg( sFileName )
00233 .arg( nWidth )
00234 .arg( nHeight );
00235
00236
00237
00238
00239
00240 if (QFile::exists( sNewFileName ))
00241 return QFileInfo( sNewFileName );
00242
00243
00244
00245
00246
00247 float fAspect = 0.0;
00248
00249 QImage *pImage = new QImage( sFileName );
00250
00251 if (!pImage)
00252 return QFileInfo();
00253
00254 if (fAspect <= 0)
00255 fAspect = (float)(pImage->width()) / pImage->height();
00256
00257 if (fAspect == 0)
00258 {
00259 delete pImage;
00260 return QFileInfo();
00261 }
00262
00263 if ( nWidth == 0 )
00264 nWidth = (int)rint(nHeight * fAspect);
00265
00266 if ( nHeight == 0 )
00267 nHeight = (int)rint(nWidth / fAspect);
00268
00269 QImage img = pImage->scaled( nWidth, nHeight, Qt::IgnoreAspectRatio,
00270 Qt::SmoothTransformation);
00271
00272 img.save( sNewFileName, "PNG" );
00273
00274 delete pImage;
00275
00276 return QFileInfo( sNewFileName );
00277 }
00278