bool CPVRClients::TryLoadClients(int iMaxTime /* = 0 */) { CDateTime start = CDateTime::GetCurrentDateTime(); CSingleLock lock(m_critSection); while (!m_bAllClientsLoaded) { /* try to load clients */ LoadClients(); /* always break if the pvrmanager's thread is stopped */ if (!CPVRManager::Get()->IsRunning()) break; /* check whether iMaxTime has passed */ if (!m_bAllClientsLoaded && iMaxTime > 0) { CDateTimeSpan elapsed = CDateTime::GetCurrentDateTime() - start; if (elapsed.GetSeconds() >= iMaxTime) break; } /* break if there are no activated clients */ if (m_clientMap.empty()) break; lock.Leave(); Sleep(250); lock.Enter(); } CLog::Log(LOG_DEBUG, "PVR - %s - %s", __FUNCTION__, m_bAllClientsLoaded && !m_clientMap.empty() ? "all clients loaded" : "couldn't load all clients. will keep trying in a separate thread."); return m_bAllClientsLoaded; }
int CDVDInputStreamHTSP::GetTime() { CDateTimeSpan time; time = CDateTime::GetUTCDateTime() - CDateTime((time_t)m_event.start); return time.GetDays() * 1000 * 60 * 60 * 24 + time.GetHours() * 1000 * 60 * 60 + time.GetMinutes() * 1000 * 60 + time.GetSeconds() * 1000; }
int CDVDInputStreamHTSP::GetTotalTime() { if(m_event.id == 0) return 0; long duration = (time_t)m_event.stop - (time_t)m_event.start; CDateTimeSpan time = CDateTimeSpan(0, 0, duration / 60, duration % 60); return time.GetDays() * 1000 * 60 * 60 * 24 + time.GetHours() * 1000 * 60 * 60 + time.GetMinutes() * 1000 * 60 + time.GetSeconds() * 1000; }
int CPVRTimerInfoTag::Compare(const CPVRTimerInfoTag &timer) const { int iTimerDelta = 0; if (StartAsUTC() != timer.StartAsUTC()) { CDateTimeSpan timerDelta = StartAsUTC() - timer.StartAsUTC(); iTimerDelta = (timerDelta.GetSeconds() + timerDelta.GetMinutes() * 60 + timerDelta.GetHours() * 3600 + timerDelta.GetDays() * 86400); } /* if the start times are equal, compare the priority of the timers */ return iTimerDelta == 0 ? timer.m_iPriority - m_iPriority : iTimerDelta; }
int CMythFile::GetStartTime() { if(m_program && m_recorder) { cmyth_timestamp_t start = m_dll->proginfo_start(m_program); CDateTimeSpan time; time = CDateTime::GetCurrentDateTime() - CDateTime(m_dll->timestamp_to_unixtime(start)); m_dll->ref_release(start); return time.GetDays() * 1000 * 60 * 60 * 24 + time.GetHours() * 1000 * 60 * 60 + time.GetMinutes() * 1000 * 60 + time.GetSeconds() * 1000; } return 0; }
int CPVRGUIInfo::GetStartTime(void) const { CSingleLock lock(m_critSection); if (m_playingEpgTag) { /* Calculate here the position we have of the running live TV event. * "position in ms" = ("current local time" - "event start local time") * 1000 */ CDateTimeSpan time = CDateTime::GetCurrentDateTime() - m_playingEpgTag->StartAsLocalTime(); return time.GetDays() * 1000 * 60 * 60 * 24 + time.GetHours() * 1000 * 60 * 60 + time.GetMinutes() * 1000 * 60 + time.GetSeconds() * 1000; } else { return 0; } }
int CPVRGUIInfo::GetStartTime(void) const { CSingleLock lock(m_critSection); if (m_playingEpgTag || m_iTimeshiftStartTime) { /* Calculate here the position we have of the running live TV event. * "position in ms" = ("current UTC" - "event start UTC") * 1000 */ CDateTime current = m_iTimeshiftPlayTime; CDateTime start = m_playingEpgTag ? m_playingEpgTag->StartAsUTC() : m_iTimeshiftStartTime; CDateTimeSpan time = current > start ? current - start : CDateTimeSpan(0, 0, 0, 0); return (time.GetDays() * 60 * 60 * 24 + time.GetHours() * 60 * 60 + time.GetMinutes() * 60 + time.GetSeconds()) * 1000; } else { return 0; } }
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 = StringUtils::Format("%s - %s", localstart.GetAsLocalizedTime("HH:mm", false).c_str(), title.c_str()); // e.g. 20:30 - Mythbusters if (!subtitle.empty()) 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.empty()) 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(SortByNone, 552 /* Date */, LABEL_MASKS("%K", "%J")); // Still leave the date label m_dll->ref_release(program); return true; }
bool CCMythSession::UpdateItem(CFileItem &item, cmyth_proginfo_t info) { if(!info) return false; CVideoInfoTag* tag = item.GetVideoInfoTag(); tag->m_strAlbum = GetValue(m_dll->proginfo_chansign(info)); tag->m_strShowTitle = GetValue(m_dll->proginfo_title(info)); tag->m_strPlotOutline = GetValue(m_dll->proginfo_subtitle(info)); tag->m_strPlot = GetValue(m_dll->proginfo_description(info)); tag->m_strGenre = GetValue(m_dll->proginfo_category(info)); 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 span = GetValue(m_dll->proginfo_rec_start(info)) - GetValue(m_dll->proginfo_rec_end(info)); StringUtils::SecondsToTimeString(span.GetSeconds() + span.GetMinutes() * 60 + span.GetHours() * 3600, tag->m_strRuntime, TIME_FORMAT_GUESS); tag->m_iSeason = 0; /* set this so xbmc knows it's a tv show */ tag->m_iEpisode = 0; item.m_strTitle = GetValue(m_dll->proginfo_chanstr(info)); item.m_dateTime = GetValue(m_dll->proginfo_rec_start(info)); item.m_dwSize = m_dll->proginfo_length(info); if(m_dll->proginfo_rec_status(info) == RS_RECORDING) { tag->m_strStatus = "livetv"; CStdString temp; temp = GetValue(m_dll->proginfo_chanicon(info)); if(temp.length() > 0) { CURI url(item.m_strPath); url.SetFileName("files/channels/" + temp); temp = url.Get(); item.SetThumbnailImage(temp); } temp = GetValue(m_dll->proginfo_chanstr(info)); if(temp.length() > 0) { CURI url(item.m_strPath); url.SetFileName("channels/" + temp + ".ts"); temp = url.Get(); if(item.m_strPath != temp) item.m_strPath = temp; } item.SetCachedVideoThumb(); } return true; }
static int GetTotalSeconds(const CDateTimeSpan& ts) { int hours = ts.GetHours() + ts.GetDays() * 24; int minutes = ts.GetMinutes() + hours * 60; return ts.GetSeconds() + minutes * 60; }
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; }