static int GetTotalSeconds(const CDateTimeSpan& ts) { int hours = ts.GetHours() + ts.GetDays() * 24; int minutes = ts.GetMinutes() + hours * 60; return ts.GetSeconds() + minutes * 60; }
void CGUIEPGGridContainerModel::Refresh(const std::unique_ptr<CFileItemList> &items, const CDateTime &gridStart, const CDateTime &gridEnd, int iRulerUnit, int iBlocksPerPage, float fBlockSize) { Reset(); //////////////////////////////////////////////////////////////////////// // Create programme & channel items m_programmeItems.reserve(items->Size()); CFileItemPtr fileItem; int iLastChannelID = -1; ItemsPtr itemsPointer; itemsPointer.start = 0; CPVRChannelPtr channel; int j = 0; for (int i = 0; i < items->Size(); ++i) { fileItem = items->Get(i); if (!fileItem->HasEPGInfoTag() || !fileItem->GetEPGInfoTag()->HasPVRChannel()) continue; m_programmeItems.emplace_back(fileItem); channel = fileItem->GetEPGInfoTag()->ChannelTag(); if (!channel) continue; int iCurrentChannelID = channel->ChannelID(); if (iCurrentChannelID != iLastChannelID) { if (j > 0) { itemsPointer.stop = j - 1; m_epgItemsPtr.emplace_back(itemsPointer); itemsPointer.start = j; } iLastChannelID = iCurrentChannelID; m_channelItems.emplace_back(CFileItemPtr(new CFileItem(channel))); } ++j; } if (!m_programmeItems.empty()) { itemsPointer.stop = m_programmeItems.size() - 1; m_epgItemsPtr.emplace_back(itemsPointer); } /* check for invalid start and end time */ if (gridStart >= gridEnd) { // default to start "now minus 30 minutes" and end "start plus one page". m_gridStart = CDateTime::GetCurrentDateTime().GetAsUTCDateTime() - CDateTimeSpan(0, 0, 30, 0); m_gridEnd = m_gridStart + CDateTimeSpan(0, 0, iBlocksPerPage * MINSPERBLOCK, 0); } else { m_gridStart = CDateTime(gridStart.GetYear(), gridStart.GetMonth(), gridStart.GetDay(), gridStart.GetHour(), gridStart.GetMinute() >= 30 ? 30 : 0, 0); m_gridEnd = CDateTime(gridEnd.GetYear(), gridEnd.GetMonth(), gridEnd.GetDay(), gridEnd.GetHour(), gridEnd.GetMinute() >= 30 ? 30 : 0, 0); } //////////////////////////////////////////////////////////////////////// // Create ruler items CDateTime ruler; ruler.SetFromUTCDateTime(m_gridStart); CDateTime rulerEnd; rulerEnd.SetFromUTCDateTime(m_gridEnd); CFileItemPtr rulerItem(new CFileItem(ruler.GetAsLocalizedDate(true))); rulerItem->SetProperty("DateLabel", true); m_rulerItems.emplace_back(rulerItem); const CDateTimeSpan unit(0, 0, iRulerUnit * MINSPERBLOCK, 0); for (; ruler < rulerEnd; ruler += unit) { rulerItem.reset(new CFileItem(ruler.GetAsLocalizedTime("", false))); rulerItem->SetLabel2(ruler.GetAsLocalizedDate(true)); m_rulerItems.emplace_back(rulerItem); } FreeItemsMemory(); //////////////////////////////////////////////////////////////////////// // Create epg grid const CDateTimeSpan blockDuration(0, 0, MINSPERBLOCK, 0); const CDateTimeSpan gridDuration(m_gridEnd - m_gridStart); m_blocks = (gridDuration.GetDays() * 24 * 60 + gridDuration.GetHours() * 60 + gridDuration.GetMinutes()) / MINSPERBLOCK; if (m_blocks >= MAXBLOCKS) m_blocks = MAXBLOCKS; m_gridIndex.reserve(m_channelItems.size()); const std::vector<GridItem> blocks(m_blocks); for (size_t channel = 0; channel < m_channelItems.size(); ++channel) { m_gridIndex.emplace_back(blocks); CDateTime gridCursor(m_gridStart); //reset cursor for new channel unsigned long progIdx = m_epgItemsPtr[channel].start; unsigned long lastIdx = m_epgItemsPtr[channel].stop; int iEpgId = m_programmeItems[progIdx]->GetEPGInfoTag()->EpgID(); int itemSize = 1; // size of the programme in blocks int savedBlock = 0; CFileItemPtr item; CEpgInfoTagPtr tag; for (int block = 0; block < m_blocks; ++block) { while (progIdx <= lastIdx) { item = m_programmeItems[progIdx]; tag = item->GetEPGInfoTag(); if (tag->EpgID() != iEpgId || gridCursor < tag->StartAsUTC() || m_gridEnd <= tag->StartAsUTC()) break; if (gridCursor < tag->EndAsUTC()) { m_gridIndex[channel][block].item = item; m_gridIndex[channel][block].progIndex = progIdx; break; } progIdx++; } gridCursor += blockDuration; if (block == 0) continue; const CFileItemPtr prevItem(m_gridIndex[channel][block - 1].item); const CFileItemPtr currItem(m_gridIndex[channel][block].item); if (block == m_blocks - 1 || prevItem != currItem) { // special handling for last block. int blockDelta = -1; int sizeDelta = 0; if (block == m_blocks - 1 && prevItem == currItem) { itemSize++; blockDelta = 0; sizeDelta = 1; } if (prevItem) { m_gridIndex[channel][savedBlock].item->SetProperty("GenreType", prevItem->GetEPGInfoTag()->GenreType()); } else { CEpgInfoTagPtr gapTag(CEpgInfoTag::CreateDefaultTag()); gapTag->SetPVRChannel(m_channelItems[channel]->GetPVRChannelInfoTag()); CFileItemPtr gapItem(new CFileItem(gapTag)); for (int i = block + blockDelta; i >= block - itemSize + sizeDelta; --i) { m_gridIndex[channel][i].item = gapItem; } } float fItemWidth = itemSize * fBlockSize; m_gridIndex[channel][savedBlock].originWidth = fItemWidth; m_gridIndex[channel][savedBlock].width = fItemWidth; itemSize = 1; savedBlock = block; // special handling for last block. if (block == m_blocks - 1 && prevItem != currItem) { if (currItem) { m_gridIndex[channel][savedBlock].item->SetProperty("GenreType", currItem->GetEPGInfoTag()->GenreType()); } else { CEpgInfoTagPtr gapTag(CEpgInfoTag::CreateDefaultTag()); gapTag->SetPVRChannel(m_channelItems[channel]->GetPVRChannelInfoTag()); CFileItemPtr gapItem(new CFileItem(gapTag)); m_gridIndex[channel][block].item = gapItem; } m_gridIndex[channel][savedBlock].originWidth = fBlockSize; // size always 1 block here m_gridIndex[channel][savedBlock].width = fBlockSize; } } else { itemSize++; } } } }
bool CMythDirectory::GetGuideForChannel(const CStdString& base, CFileItemList &items, int channelNumber) { cmyth_database_t database = m_session->GetDatabase(); if (!database) { CLog::Log(LOGERROR, "%s - Could not get database", __FUNCTION__); return false; } time_t now; time(&now); time_t end = now + (24 * 60 * 60); // How many seconds of EPG from now we should grab, 24 hours in seconds cmyth_program_t *program = NULL; // TODO: See if there is a way to just get the entries for the chosen channel rather than ALL int count = m_dll->mysql_get_guide(database, &program, now, end); CLog::Log(LOGDEBUG, "%s - %i entries in guide data", __FUNCTION__, count); if (count <= 0) return false; for (int i = 0; i < count; i++) { if (program[i].channum == channelNumber) { CFileItemPtr item(new CFileItem("", false)); // No path for guide entries /* * Set the FileItem meta data. */ CStdString title = program[i].title; // e.g. Mythbusters CStdString subtitle = program[i].subtitle; // e.g. The Pirate Special CDateTime localstart; if (program[i].starttime) localstart = CTimeUtils::GetLocalTime(program[i].starttime); item->m_strTitle.Format("%s - %s", localstart.GetAsLocalizedTime("HH:mm", false), title); // e.g. 20:30 - Mythbusters if (!subtitle.IsEmpty()) item->m_strTitle += " - \"" + subtitle + "\""; // e.g. 20:30 - Mythbusters - "The Pirate Special" item->m_dateTime = localstart; /* * Set the VideoInfoTag meta data so it matches the FileItem meta data where possible. */ CVideoInfoTag* tag = item->GetVideoInfoTag(); tag->m_strTitle = title; if (!subtitle.IsEmpty()) tag->m_strTitle += " - \"" + subtitle + "\""; // e.g. Mythbusters - "The Pirate Special" tag->m_strShowTitle = title; tag->m_strOriginalTitle = title; tag->m_strPlotOutline = subtitle; tag->m_strPlot = program[i].description; // TODO: Strip out the subtitle from the description if it is present at the start? // TODO: Do we need to add the subtitle to the start of the plot if not already as it used to? Seems strange, should be handled by skin? tag->m_genre = StringUtils::Split(program[i].category, g_advancedSettings.m_videoItemSeparator); // e.g. Sports tag->m_strAlbum = program[i].callsign; // e.g. TV3 CDateTime start(program[i].starttime); CDateTime end(program[i].endtime); CDateTimeSpan runtime = end - start; tag->m_duration = runtime.GetSeconds() + runtime.GetMinutes() * 60 + runtime.GetHours() * 3600; tag->m_iSeason = 0; // So XBMC treats the content as an episode and displays tag information. tag->m_iEpisode = 0; items.Add(item); } } /* * Items are sorted as added to the list (in ascending date order). Specifying sorting by date can * result in the guide being shown in the wrong order for skins that sort by date in descending * order by default with no option to change to ascending, e.g. Confluence. */ items.AddSortMethod(SORT_METHOD_NONE, 552 /* Date */, LABEL_MASKS("%K", "%J")); // Still leave the date label m_dll->ref_release(program); return true; }
CStdString CSmartPlaylistRule::GetWhereClause(CDatabase &db, const CStdString& strType) { SEARCH_OPERATOR op = m_operator; if ((strType == "tvshows" || strType == "episodes") && m_field == FIELD_YEAR) { // special case for premiered which is a date rather than a year // TODO: SMARTPLAYLISTS do we really need this, or should we just make this field the premiered date and request a date? if (op == OPERATOR_EQUALS) op = OPERATOR_CONTAINS; else if (op == OPERATOR_DOES_NOT_EQUAL) op = OPERATOR_DOES_NOT_CONTAIN; } CStdString operatorString, negate; CStdString parameter; if (GetFieldType(m_field) == TEXTIN_FIELD) { CStdStringArray split; StringUtils::SplitString(m_parameter, ",", split); for (CStdStringArray::iterator it=split.begin(); it!=split.end(); ++it) { if (!parameter.IsEmpty()) parameter += ","; parameter += db.PrepareSQL("'%s'", (*it).Trim().c_str()); } parameter = " IN (" + parameter + ")"; if (op == OPERATOR_DOES_NOT_EQUAL) negate = " NOT"; } else { // the comparison piece switch (op) { case OPERATOR_CONTAINS: operatorString = " LIKE '%%%s%%'"; break; case OPERATOR_DOES_NOT_CONTAIN: negate = " NOT"; operatorString = " LIKE '%%%s%%'"; break; case OPERATOR_EQUALS: operatorString = " LIKE '%s'"; break; case OPERATOR_DOES_NOT_EQUAL: negate = " NOT"; operatorString = " LIKE '%s'"; break; case OPERATOR_STARTS_WITH: operatorString = " LIKE '%s%%'"; break; case OPERATOR_ENDS_WITH: operatorString = " LIKE '%%%s'"; break; case OPERATOR_AFTER: case OPERATOR_GREATER_THAN: case OPERATOR_IN_THE_LAST: operatorString = " > '%s'"; break; case OPERATOR_BEFORE: case OPERATOR_LESS_THAN: case OPERATOR_NOT_IN_THE_LAST: operatorString = " < '%s'"; break; case OPERATOR_TRUE: operatorString = " = 1"; break; case OPERATOR_FALSE: negate = " NOT "; operatorString = " = 0"; break; default: break; } parameter = db.PrepareSQL(operatorString.c_str(), m_parameter.c_str()); } if (m_field == FIELD_LASTPLAYED) { if (m_operator == OPERATOR_IN_THE_LAST || m_operator == OPERATOR_NOT_IN_THE_LAST) { // translate time period CDateTime date=CDateTime::GetCurrentDateTime(); CDateTimeSpan span; span.SetFromPeriod(m_parameter); date-=span; parameter = db.PrepareSQL(operatorString.c_str(), date.GetAsDBDate().c_str()); } } else if (m_field == FIELD_TIME) { // translate time to seconds CStdString seconds; seconds.Format("%i", StringUtils::TimeStringToSeconds(m_parameter)); parameter = db.PrepareSQL(operatorString.c_str(), seconds.c_str()); } // now the query parameter CStdString query; if (strType == "songs") { if (m_field == FIELD_GENRE) query = negate + " ((strGenre" + parameter + ") or idSong IN (select idSong from genre,exgenresong where exgenresong.idGenre = genre.idGenre and genre.strGenre" + parameter + "))"; else if (m_field == FIELD_ARTIST) query = negate + " ((strArtist" + parameter + ") or idSong IN (select idSong from artist,exartistsong where exartistsong.idArtist = artist.idArtist and artist.strArtist" + parameter + "))"; else if (m_field == FIELD_ALBUMARTIST) query = negate + " (idalbum in (select idalbum from artist,album where album.idArtist=artist.idArtist and artist.strArtist" + parameter + ") or idalbum in (select idalbum from artist,exartistalbum where exartistalbum.idArtist = artist.idArtist and artist.strArtist" + parameter + "))"; else if (m_field == FIELD_LASTPLAYED && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = "lastPlayed is NULL or lastPlayed" + parameter; } else if (strType == "albums") { if (m_field == FIELD_GENRE) query = negate + " (idAlbum in (select song.idAlbum from song join genre on song.idGenre=genre.idGenre where genre.strGenre" + parameter + ") or " "idAlbum in (select song.idAlbum from song join exgenresong on song.idSong=exgenresong.idSong join genre on exgenresong.idGenre=genre.idGenre where genre.strGenre" + parameter + "))"; else if (m_field == FIELD_ARTIST) query = negate + " (idAlbum in (select song.idAlbum from song join artist on song.idArtist=artist.idArtist where artist.strArtist" + parameter + ") or " "idAlbum in (select song.idAlbum from song join exartistsong on song.idSong=exartistsong.idSong join artist on exartistsong.idArtist=artist.idArtist where artist.strArtist" + parameter + "))"; else if (m_field == FIELD_ALBUMARTIST) query = negate + " (idalbum in (select idalbum from artist,album where album.idArtist=artist.idArtist and artist.strArtist" + parameter + ") or idalbum in (select idalbum from artist,exartistalbum where exartistalbum.idArtist = artist.idArtist and artist.strArtist" + parameter + "))"; } else if (strType == "movies") { if (m_field == FIELD_GENRE) query = "idMovie" + negate + " in (select idMovie from genrelinkmovie join genre on genre.idGenre=genrelinkmovie.idGenre where genre.strGenre" + parameter + ")"; else if (m_field == FIELD_DIRECTOR) query = "idMovie" + negate + " in (select idMovie from directorlinkmovie join actors on actors.idActor=directorlinkmovie.idDirector where actors.strActor" + parameter + ")"; else if (m_field == FIELD_ACTOR) query = "idMovie" + negate + " in (select idMovie from actorlinkmovie join actors on actors.idActor=actorlinkmovie.idActor where actors.strActor" + parameter + ")"; else if (m_field == FIELD_WRITER) query = "idMovie" + negate + " in (select idMovie from writerlinkmovie join actors on actors.idActor=writerlinkmovie.idWriter where actors.strActor" + parameter + ")"; else if (m_field == FIELD_STUDIO) query = "idMovie" + negate + " in (select idMovie from studiolinkmovie join studio on studio.idStudio=studiolinkmovie.idStudio where studio.strStudio" + parameter + ")"; else if (m_field == FIELD_COUNTRY) query = "idMovie" + negate + " in (select idMovie from countrylinkmovie join country on country.idCountry=countrylinkmovie.idCountry where country.strCountry" + parameter + ")"; else if (m_field == FIELD_HASTRAILER) query = negate + GetDatabaseField(m_field, strType) + "!= ''"; else if (m_field == FIELD_LASTPLAYED && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = "lastPlayed is NULL or lastPlayed" + parameter; else if (m_field == FIELD_INPROGRESS) query = "idFile " + negate + " in (select idFile from bookmark where type = 1)"; } else if (strType == "musicvideos") { if (m_field == FIELD_GENRE) query = "idMVideo" + negate + " in (select idMVideo from genrelinkmusicvideo join genre on genre.idGenre=genrelinkmusicvideo.idGenre where genre.strGenre" + parameter + ")"; else if (m_field == FIELD_ARTIST) query = "idMVideo" + negate + " in (select idMVideo from artistlinkmusicvideo join actors on actors.idActor=artistlinkmusicvideo.idArtist where actors.strActor" + parameter + ")"; else if (m_field == FIELD_STUDIO) query = "idMVideo" + negate + " in (select idMVideo from studiolinkmusicvideo join studio on studio.idStudio=studiolinkmusicvideo.idStudio where studio.strStudio" + parameter + ")"; else if (m_field == FIELD_DIRECTOR) query = "idMVideo" + negate + " in (select idMVideo from directorlinkmusicvideo join actors on actors.idActor=directorlinkmusicvideo.idDirector where actors.strActor" + parameter + ")"; else if (m_field == FIELD_LASTPLAYED && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = "lastPlayed is NULL or lastPlayed" + parameter; } else if (strType == "tvshows") { if (m_field == FIELD_GENRE) query = "tvshow.idShow" + negate + " in (select idShow from genrelinktvshow join genre on genre.idGenre=genrelinktvshow.idGenre where genre.strGenre" + parameter + ")"; else if (m_field == FIELD_DIRECTOR) query = "tvshow.idShow" + negate + " in (select idShow from directorlinktvshow join actors on actors.idActor=directorlinktvshow.idDirector where actors.strActor" + parameter + ")"; else if (m_field == FIELD_ACTOR) query = "tvshow.idShow" + negate + " in (select idShow from actorlinktvshow join actors on actors.idActor=actorlinktvshow.idActor where actors.strActor" + parameter + ")"; } else if (strType == "episodes") { if (m_field == FIELD_GENRE) query = "idShow" + negate + " in (select idShow from genrelinktvshow join genre on genre.idGenre=genrelinktvshow.idGenre where genre.strGenre" + parameter + ")"; else if (m_field == FIELD_DIRECTOR) query = "idEpisode" + negate + " in (select idEpisode from directorlinkepisode join actors on actors.idActor=directorlinkepisode.idDirector where actors.strActor" + parameter + ")"; else if (m_field == FIELD_ACTOR) query = "idEpisode" + negate + " in (select idEpisode from actorlinkepisode join actors on actors.idActor=actorlinkepisode.idActor where actors.strActor" + parameter + ")"; else if (m_field == FIELD_WRITER) query = "idEpisode" + negate + " in (select idEpisode from writerlinkepisode join actors on actors.idActor=writerlinkepisode.idWriter where actors.strActor" + parameter + ")"; else if (m_field == FIELD_LASTPLAYED && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = "lastPlayed is NULL or lastPlayed" + parameter; else if (m_field == FIELD_INPROGRESS) query = "idFile " + negate + " in (select idFile from bookmark where type = 1)"; } if (m_field == FIELD_VIDEORESOLUTION) query = "idFile" + negate + GetVideoResolutionQuery(); else if (m_field == FIELD_AUDIOCHANNELS) query = "idFile" + negate + " in (select distinct idFile from streamdetails where iAudioChannels " + parameter + ")"; else if (m_field == FIELD_VIDEOCODEC) query = "idFile" + negate + " in (select distinct idFile from streamdetails where strVideoCodec " + parameter + ")"; else if (m_field == FIELD_AUDIOCODEC) query = "idFile" + negate + " in (select distinct idFile from streamdetails where strAudioCodec " + parameter + ")"; else if (m_field == FIELD_AUDIOLANGUAGE) query = "idFile" + negate + " in (select distinct idFile from streamdetails where strAudioLanguage " + parameter + ")"; else if (m_field == FIELD_SUBTITLELANGUAGE) query = "idFile" + negate + " in (select distinct idFile from streamdetails where strSubtitleLanguage " + parameter + ")"; else if (m_field == FIELD_VIDEOASPECT) query = "idFile" + negate + " in (select distinct idFile from streamdetails where fVideoAspect " + parameter + ")"; else if (m_field == FIELD_PLAYLIST) { // playlist field - grab our playlist and add to our where clause CStdString playlistFile = CSmartPlaylistDirectory::GetPlaylistByName(m_parameter, strType); if (!playlistFile.IsEmpty()) { CSmartPlaylist playlist; playlist.Load(playlistFile); CStdString playlistQuery; // only playlists of same type will be part of the query if (playlist.GetType().Equals(strType) || (playlist.GetType().Equals("mixed") && (strType == "songs" || strType == "musicvideos")) || playlist.GetType().IsEmpty()) { playlist.SetType(strType); playlistQuery = playlist.GetWhereClause(db, false); } if (m_operator == OPERATOR_DOES_NOT_EQUAL && playlist.GetType().Equals(strType)) query.Format("NOT (%s)", playlistQuery.c_str()); else if (m_operator == OPERATOR_EQUALS && playlist.GetType().Equals(strType)) query = playlistQuery; } } if (m_field == FIELD_PLAYCOUNT && strType != "songs" && strType != "albums") { // playcount is stored as NULL or number in video db if ((m_operator == OPERATOR_EQUALS && m_parameter == "0") || (m_operator == OPERATOR_DOES_NOT_EQUAL && m_parameter != "0") || (m_operator == OPERATOR_LESS_THAN)) { CStdString field = GetDatabaseField(FIELD_PLAYCOUNT, strType); query = field + " is NULL or " + field + parameter; } } if (query.IsEmpty() && m_field != FIELD_NONE) query = GetDatabaseField(m_field,strType) + negate + parameter; // if we fail to get a dbfield, we empty query so it doesn't fail if (query.Equals(negate + parameter)) query = ""; return query; }
bool CCMythDirectory::GetGuideForChannel(const CStdString& base, CFileItemList &items, int channelNumber) { cmyth_database_t database = m_session->GetDatabase(); if (!database) { CLog::Log(LOGERROR, "%s - Could not get database", __FUNCTION__); return false; } time_t now; time(&now); // this sets how many seconds of EPG from now we should grab time_t end = now + (1 * 24 * 60 * 60); cmyth_program_t *program = NULL; int count = m_dll->mysql_get_guide(database, &program, now, end); CLog::Log(LOGDEBUG, "%s - %i entries of guide data", __FUNCTION__, count); if (count <= 0) return false; for (int i = 0; i < count; i++) { if (program[i].channum == channelNumber) { CStdString path; path.Format("%s%s", base.c_str(), program[i].title); CDateTime starttime(program[i].starttime); CDateTime endtime(program[i].endtime); CStdString title; title.Format("%s - %s", starttime.GetAsLocalizedTime("HH:mm", false), program[i].title); CFileItemPtr item(new CFileItem(title, false)); item->SetLabel(title); item->m_dateTime = starttime; CVideoInfoTag* tag = item->GetVideoInfoTag(); tag->m_strAlbum = GetValue(program[i].callsign); tag->m_strShowTitle = GetValue(program[i].title); tag->m_strPlotOutline = GetValue(program[i].subtitle); tag->m_strPlot = GetValue(program[i].description); tag->m_strGenre = GetValue(program[i].category); if(tag->m_strPlot.Left(tag->m_strPlotOutline.length()) != tag->m_strPlotOutline && !tag->m_strPlotOutline.IsEmpty()) tag->m_strPlot = tag->m_strPlotOutline + '\n' + tag->m_strPlot; tag->m_strOriginalTitle = tag->m_strShowTitle; tag->m_strTitle = tag->m_strAlbum; if(tag->m_strShowTitle.length() > 0) tag->m_strTitle += " : " + tag->m_strShowTitle; CDateTimeSpan runtime = endtime - starttime; StringUtils::SecondsToTimeString( runtime.GetSeconds() + runtime.GetMinutes() * 60 + runtime.GetHours() * 3600, tag->m_strRuntime); tag->m_iSeason = 0; /* set this so xbmc knows it's a tv show */ tag->m_iEpisode = 0; tag->m_strStatus = program[i].rec_status; items.Add(item); } } // Sort by date only. items.AddSortMethod(SORT_METHOD_DATE, 552 /* Date */, LABEL_MASKS("%L", "%J", "%L", "")); m_dll->ref_release(program); return true; }
bool CPVRManager::CanSystemPowerdown(bool bAskUser /*= true*/) const { bool bReturn(true); if (IsStarted()) { CPVRTimerInfoTagPtr cause; if (!AllLocalBackendsIdle(cause)) { if (bAskUser) { std::string text; if (cause) { if (cause->IsRecording()) { text = StringUtils::Format(g_localizeStrings.Get(19691).c_str(), // "PVR is currently recording...." cause->Title().c_str(), cause->ChannelName().c_str()); } else { // Next event is due to a local recording. const CDateTime now(CDateTime::GetUTCDateTime()); const CDateTime start(cause->StartAsUTC()); const CDateTimeSpan prestart(0, 0, cause->MarginStart(), 0); CDateTimeSpan diff(start - now); diff -= prestart; int mins = diff.GetSecondsTotal() / 60; std::string dueStr; if (mins > 1) { // "%d minutes" dueStr = StringUtils::Format(g_localizeStrings.Get(19694).c_str(), mins); } else { // "about a minute" dueStr = g_localizeStrings.Get(19695); } text = StringUtils::Format(g_localizeStrings.Get(19692).c_str(), // "PVR will start recording...." cause->Title().c_str(), cause->ChannelName().c_str(), dueStr.c_str()); } } else { // Next event is due to automatic daily wakeup of PVR. const CDateTime now(CDateTime::GetUTCDateTime()); CDateTime dailywakeuptime; dailywakeuptime.SetFromDBTime(CSettings::GetInstance().GetString(CSettings::SETTING_PVRPOWERMANAGEMENT_DAILYWAKEUPTIME)); dailywakeuptime = dailywakeuptime.GetAsUTCDateTime(); const CDateTimeSpan diff(dailywakeuptime - now); int mins = diff.GetSecondsTotal() / 60; std::string dueStr; if (mins > 1) { // "%d minutes" dueStr = StringUtils::Format(g_localizeStrings.Get(19694).c_str(), mins); } else { // "about a minute" dueStr = g_localizeStrings.Get(19695); } text = StringUtils::Format(g_localizeStrings.Get(19693).c_str(), // "Daily wakeup is due in...." dueStr.c_str()); } // Inform user about PVR being busy. Ask if user wants to powerdown anyway. bReturn = HELPERS::DialogResponse::YES == HELPERS::ShowYesNoDialogText(CVariant{19685}, // "Confirm shutdown" CVariant{text}, CVariant{222}, // "Shutdown anyway", CVariant{19696}, // "Cancel" 10000); // timeout value before closing } else bReturn = false; // do not powerdown (busy, but no user interaction requested). } } return bReturn; }
CStdString CSmartPlaylistRule::GetWhereClause(CDatabase &db, const CStdString& strType) const { SEARCH_OPERATOR op = m_operator; if ((strType == "tvshows" || strType == "episodes") && m_field == FieldYear) { // special case for premiered which is a date rather than a year // TODO: SMARTPLAYLISTS do we really need this, or should we just make this field the premiered date and request a date? if (op == OPERATOR_EQUALS) op = OPERATOR_CONTAINS; else if (op == OPERATOR_DOES_NOT_EQUAL) op = OPERATOR_DOES_NOT_CONTAIN; } CStdString operatorString, negate; if (GetFieldType(m_field) == TEXTIN_FIELD) { if (op == OPERATOR_DOES_NOT_EQUAL) negate = " NOT"; } else { // the comparison piece switch (op) { case OPERATOR_CONTAINS: operatorString = " LIKE '%%%s%%'"; break; case OPERATOR_DOES_NOT_CONTAIN: negate = " NOT"; operatorString = " LIKE '%%%s%%'"; break; case OPERATOR_EQUALS: operatorString = " LIKE '%s'"; break; case OPERATOR_DOES_NOT_EQUAL: negate = " NOT"; operatorString = " LIKE '%s'"; break; case OPERATOR_STARTS_WITH: operatorString = " LIKE '%s%%'"; break; case OPERATOR_ENDS_WITH: operatorString = " LIKE '%%%s'"; break; case OPERATOR_AFTER: case OPERATOR_GREATER_THAN: case OPERATOR_IN_THE_LAST: operatorString = " > '%s'"; break; case OPERATOR_BEFORE: case OPERATOR_LESS_THAN: case OPERATOR_NOT_IN_THE_LAST: operatorString = " < '%s'"; break; case OPERATOR_TRUE: operatorString = " = 1"; break; case OPERATOR_FALSE: negate = " NOT "; operatorString = " = 0"; break; default: break; } } // FieldInProgress does not have any values in m_parameter, it works on the operator if (m_field == FieldInProgress && (strType == "movies" || strType == "episodes")) return "idFile " + negate + " in (select idFile from bookmark where type = 1)"; // now the query parameter CStdString wholeQuery; for (vector<CStdString>::const_iterator it = m_parameter.begin(); it != m_parameter.end(); /* it++ is done further down */) { CStdString parameter; if (GetFieldType(m_field) == TEXTIN_FIELD) { CStdStringArray split; StringUtils::SplitString(*it, ",", split); for (CStdStringArray::iterator itIn = split.begin(); itIn != split.end(); ++itIn) { if (!parameter.IsEmpty()) parameter += ","; parameter += db.PrepareSQL("'%s'", (*itIn).Trim().c_str()); } parameter = " IN (" + parameter + ")"; } else parameter = db.PrepareSQL(operatorString.c_str(), it->c_str()); if (GetFieldType(m_field) == DATE_FIELD) { if (m_operator == OPERATOR_IN_THE_LAST || m_operator == OPERATOR_NOT_IN_THE_LAST) { // translate time period CDateTime date=CDateTime::GetCurrentDateTime(); CDateTimeSpan span; span.SetFromPeriod(*it); date-=span; parameter = db.PrepareSQL(operatorString.c_str(), date.GetAsDBDate().c_str()); } } else if (m_field == FieldTime) { // translate time to seconds CStdString seconds; seconds.Format("%i", StringUtils::TimeStringToSeconds(*it)); parameter = db.PrepareSQL(operatorString.c_str(), seconds.c_str()); } CStdString query; CStdString table; if (strType == "songs") { table = "songview"; if (m_field == FieldGenre) query = negate + " (" + GetField(FieldId, strType) + " IN (SELECT idSong FROM song_genre, genre WHERE song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")"; else if (m_field == FieldArtist) query = negate + " (" + GetField(FieldId, strType) + " IN (SELECT idSong FROM song_artist, artist WHERE song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")"; else if (m_field == FieldAlbumArtist) query = negate + " (" + table + ".idAlbum IN (SELECT idAlbum FROM album_artist, artist WHERE album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")"; else if (m_field == FieldLastPlayed && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = "lastPlayed is NULL or lastPlayed" + parameter; } else if (strType == "albums") { table = "albumview"; if (m_field == FieldGenre) query = negate + " (" + GetField(FieldId, strType) + " IN (SELECT song.idAlbum FROM song, song_genre, genre WHERE song.idSong = song_genre.idGenre AND song_genre.idGenre = genre.idGenre AND genre.strGenre" + parameter + ")"; else if (m_field == FieldArtist) query = negate + " (" + GetField(FieldId, strType) + " IN (SELECT song.idAlbum FROM song, song_artist, artists WHERE song.idSong = song_artist.idSong AND song_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")"; else if (m_field == FieldAlbumArtist) query = negate + " (" + GetField(FieldId, strType) + " IN (SELECT album_artist.idAlbum FROM album_artist, artist WHERE album_artist.idArtist = artist.idArtist AND artist.strArtist" + parameter + ")"; } else if (strType == "movies") { table = "movieview"; if (m_field == FieldGenre) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM genrelinkmovie JOIN genre ON genre.idGenre=genrelinkmovie.idGenre WHERE genre.strGenre" + parameter + ")"; else if (m_field == FieldDirector) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM directorlinkmovie JOIN actors ON actors.idActor=directorlinkmovie.idDirector WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldActor) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM actorlinkmovie JOIN actors ON actors.idActor=actorlinkmovie.idActor WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldWriter) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM writerlinkmovie JOIN actors ON actors.idActor=writerlinkmovie.idWriter WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldStudio) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM studiolinkmovie JOIN studio ON studio.idStudio=studiolinkmovie.idStudio WHERE studio.strStudio" + parameter + ")"; else if (m_field == FieldCountry) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM countrylinkmovie JOIN country ON country.idCountry=countrylinkmovie.idCountry WHERE country.strCountry" + parameter + ")"; else if (m_field == FieldTrailer) query = negate + GetField(m_field, strType) + "!= ''"; else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter; else if (m_field == FieldInProgress) query = table + ".idFile " + negate + " IN (SELECT idFile FROM bookmark WHERE type = 1)"; else if (m_field == FieldSet) query = GetField(FieldId, strType) + negate + " IN (SELECT idMovie FROM setlinkmovie JOIN sets ON sets.idSet=setlinkmovie.idSet WHERE sets.strSet" + parameter + ")"; else if (m_field == FieldTag) query = GetField(FieldId, strType) + negate + " IN (SELECT idMedia FROM taglinks JOIN tag ON tag.idTag = taglinks.idTag WHERE tag.strTag" + parameter + " AND taglinks.media_type = 'movie')"; } else if (strType == "musicvideos") { table = "musicvideoview"; if (m_field == FieldGenre) query = GetField(FieldId, strType) + negate + " IN (SELECT idMVideo FROM genrelinkmusicvideo JOIN genre ON genre.idGenre=genrelinkmusicvideo.idGenre WHERE genre.strGenre" + parameter + ")"; else if (m_field == FieldArtist) query = GetField(FieldId, strType) + negate + " IN (SELECT idMVideo FROM artistlinkmusicvideo JOIN actors ON actors.idActor=artistlinkmusicvideo.idArtist WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldStudio) query = GetField(FieldId, strType) + negate + " IN (SELECT idMVideo FROM studiolinkmusicvideo JOIN studio ON studio.idStudio=studiolinkmusicvideo.idStudio WHERE studio.strStudio" + parameter + ")"; else if (m_field == FieldDirector) query = GetField(FieldId, strType) + negate + " IN (SELECT idMVideo FROM directorlinkmusicvideo JOIN actors ON actors.idActor=directorlinkmusicvideo.idDirector WHERE actors.strActor" + parameter + ")"; else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter; } else if (strType == "tvshows") { table = "tvshowview"; if (m_field == FieldGenre) query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genre.strGenre" + parameter + ")"; else if (m_field == FieldDirector) query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM directorlinktvshow JOIN actors ON actors.idActor=directorlinktvshow.idDirector WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldActor) query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM actorlinktvshow JOIN actors ON actors.idActor=actorlinktvshow.idActor WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldStudio) query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM tvshowview WHERE " + GetField(m_field, strType) + parameter + ")"; else if (m_field == FieldMPAA) query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM tvshowview WHERE " + GetField(m_field, strType) + parameter + ")"; else if (m_field == FieldDateAdded && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = GetField(FieldDateAdded, strType) + " IS NULL OR " + GetField(FieldDateAdded, strType) + parameter; } else if (strType == "episodes") { table = "episodeview"; if (m_field == FieldGenre) query = table + ".idShow" + negate + " IN (SELECT idShow FROM genrelinktvshow JOIN genre ON genre.idGenre=genrelinktvshow.idGenre WHERE genre.strGenre" + parameter + ")"; else if (m_field == FieldDirector) query = GetField(FieldId, strType) + negate + " IN (SELECT idEpisode FROM directorlinkepisode JOIN actors ON actors.idActor=directorlinkepisode.idDirector WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldActor) query = GetField(FieldId, strType) + negate + " IN (SELECT idEpisode FROM actorlinkepisode JOIN actors ON actors.idActor=actorlinkepisode.idActor WHERE actors.strActor" + parameter + ")"; else if (m_field == FieldWriter) query = GetField(FieldId, strType) + negate + " IN (SELECT idEpisode FROM writerlinkepisode JOIN actors ON actors.idActor=writerlinkepisode.idWriter WHERE actors.strActor" + parameter + ")"; else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter; else if (m_field == FieldInProgress) query = table + ".idFile " + negate + " IN (SELECT idFile FROM bookmark WHERE type = 1)"; else if (m_field == FieldStudio) query = GetField(FieldId, strType) + negate + " IN (SELECT idEpisode FROM episodeview WHERE strStudio" + parameter + ")"; else if (m_field == FieldMPAA) query = GetField(FieldId, strType) + negate + " IN (SELECT idEpisode FROM episodeview WHERE mpaa" + parameter + ")"; } if (m_field == FieldVideoResolution) query = table + ".idFile" + negate + GetVideoResolutionQuery(*it); else if (m_field == FieldAudioChannels) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE iAudioChannels " + parameter + ")"; else if (m_field == FieldVideoCodec) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE strVideoCodec " + parameter + ")"; else if (m_field == FieldAudioCodec) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE strAudioCodec " + parameter + ")"; else if (m_field == FieldAudioLanguage) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE strAudioLanguage " + parameter + ")"; else if (m_field == FieldSubtitleLanguage) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE strSubtitleLanguage " + parameter + ")"; else if (m_field == FieldVideoAspectRatio) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE fVideoAspect " + parameter + ")"; if (m_field == FieldPlaycount && strType != "songs" && strType != "albums") { // playcount IS stored as NULL OR number IN video db if ((m_operator == OPERATOR_EQUALS && it->Equals("0")) || (m_operator == OPERATOR_DOES_NOT_EQUAL && !it->Equals("0")) || (m_operator == OPERATOR_LESS_THAN)) { CStdString field = GetField(FieldPlaycount, strType); query = field + " IS NULL OR " + field + parameter; } } if (query.IsEmpty() && m_field != FieldNone) query = GetField(m_field,strType) + negate + parameter; it++; if (query.Equals(negate + parameter)) query = "1"; query = "(" + query + ")"; if (it != m_parameter.end()) query += " OR "; wholeQuery += query; } return wholeQuery; }
CDateTime CDateTime::operator - (const CDateTimeSpan& dts) const { CDateTime dt; dt.m_nDateTime = m_nDateTime - dts.GetDateTimeSpan(); return dt; }