std::string CURL::GetWithoutUserDetails(bool redact) const { std::string strURL; if (IsProtocol("stack")) { CFileItemList items; XFILE::CStackDirectory dir; dir.GetDirectory(*this,items); std::vector<std::string> newItems; for (int i=0;i<items.Size();++i) { CURL url(items[i]->GetPath()); items[i]->SetPath(url.GetWithoutUserDetails(redact)); newItems.push_back(items[i]->GetPath()); } dir.ConstructStackPath(newItems, strURL); return strURL; } unsigned int sizeneed = m_strProtocol.length() + m_strDomain.length() + m_strHostName.length() + m_strFileName.length() + m_strOptions.length() + m_strProtocolOptions.length() + 10; if (redact) sizeneed += sizeof("USERNAME:PASSWORD@"); strURL.reserve(sizeneed); if (m_strProtocol.empty()) return m_strFileName; strURL = m_strProtocol; strURL += "://"; if (redact && !m_strUserName.empty()) { strURL += "USERNAME"; if (!m_strPassword.empty()) { strURL += ":PASSWORD"; } strURL += "@"; } if (!m_strHostName.empty()) { std::string strHostName; if (URIUtils::HasParentInHostname(*this)) strHostName = CURL(m_strHostName).GetWithoutUserDetails(); else strHostName = m_strHostName; if (URIUtils::HasEncodedHostname(*this)) strHostName = Encode(strHostName); if ( HasPort() ) { protectIPv6(strHostName); strURL += strHostName + StringUtils::Format(":%i", m_iPort); } else strURL += strHostName; strURL += "/"; } strURL += m_strFileName; if( m_strOptions.length() > 0 ) strURL += m_strOptions; if( m_strProtocolOptions.length() > 0 ) strURL += "|"+m_strProtocolOptions; return strURL; }
/* returns true if details have been added */ bool CDVDFileInfo::DemuxerToStreamDetails(CDVDInputStream *pInputStream, CDVDDemux *pDemux, CStreamDetails &details, const std::string &path) { bool retVal = false; details.Reset(); const CURL pathToUrl(path); for (int iStream=0; iStream<pDemux->GetNrOfStreams(); iStream++) { CDemuxStream *stream = pDemux->GetStream(iStream); if (stream->type == STREAM_VIDEO && !(stream->flags & AV_DISPOSITION_ATTACHED_PIC)) { CStreamDetailVideo *p = new CStreamDetailVideo(); p->m_iWidth = ((CDemuxStreamVideo *)stream)->iWidth; p->m_iHeight = ((CDemuxStreamVideo *)stream)->iHeight; p->m_fAspect = ((CDemuxStreamVideo *)stream)->fAspect; if (p->m_fAspect == 0.0f) p->m_fAspect = (float)p->m_iWidth / p->m_iHeight; pDemux->GetStreamCodecName(iStream, p->m_strCodec); p->m_iDuration = pDemux->GetStreamLength(); p->m_strStereoMode = ((CDemuxStreamVideo *)stream)->stereo_mode; // stack handling if (URIUtils::IsStack(path)) { CFileItemList files; XFILE::CStackDirectory stack; stack.GetDirectory(pathToUrl, files); // skip first path as we already know the duration for (int i = 1; i < files.Size(); i++) { int duration = 0; if (CDVDFileInfo::GetFileDuration(files[i]->GetPath(), duration)) p->m_iDuration = p->m_iDuration + duration; } } // finally, calculate seconds if (p->m_iDuration > 0) p->m_iDuration = p->m_iDuration / 1000; details.AddStream(p); retVal = true; } else if (stream->type == STREAM_AUDIO) { CStreamDetailAudio *p = new CStreamDetailAudio(); p->m_iChannels = ((CDemuxStreamAudio *)stream)->iChannels; p->m_strLanguage = stream->language; pDemux->GetStreamCodecName(iStream, p->m_strCodec); details.AddStream(p); retVal = true; } else if (stream->type == STREAM_SUBTITLE) { CStreamDetailSubtitle *p = new CStreamDetailSubtitle(); p->m_strLanguage = stream->language; details.AddStream(p); retVal = true; } } /* for iStream */ details.DetermineBestStreams(); #ifdef HAVE_LIBBLURAY // correct bluray runtime. we need the duration from the input stream, not the demuxer. if (pInputStream->IsStreamType(DVDSTREAM_TYPE_BLURAY)) { if(((CDVDInputStreamBluray*)pInputStream)->GetTotalTime() > 0) { CStreamDetailVideo* detailVideo = (CStreamDetailVideo*)details.GetNthStream(CStreamDetail::VIDEO, 0); if (detailVideo) detailVideo->m_iDuration = ((CDVDInputStreamBluray*)pInputStream)->GetTotalTime() / 1000; } } #endif return retVal; }
CStdString CURL::GetWithoutUserDetails() const { CStdString strURL; if (m_strProtocol.Equals("stack")) { CFileItemList items; CStdString strURL2; strURL2 = Get(); XFILE::CStackDirectory dir; dir.GetDirectory(strURL2,items); vector<CStdString> newItems; for (int i=0;i<items.Size();++i) { CURL url(items[i]->GetPath()); items[i]->SetPath(url.GetWithoutUserDetails()); newItems.push_back(items[i]->GetPath()); } dir.ConstructStackPath(newItems,strURL); return strURL; } unsigned int sizeneed = m_strProtocol.length() + m_strDomain.length() + m_strHostName.length() + m_strFileName.length() + m_strOptions.length() + m_strProtocolOptions.length() + 10; strURL.reserve(sizeneed); if (m_strProtocol == "") return m_strFileName; strURL = m_strProtocol; strURL += "://"; if (m_strHostName != "") { if (URIUtils::ProtocolHasParentInHostname(m_strProtocol)) strURL += CURL(m_strHostName).GetWithoutUserDetails(); else strURL += m_strHostName; if ( HasPort() ) { CStdString strPort; strPort.Format("%i", m_iPort); strURL += ":"; strURL += strPort; } strURL += "/"; } strURL += m_strFileName; if( m_strOptions.length() > 0 ) strURL += m_strOptions; if( m_strProtocolOptions.length() > 0 ) strURL += "|"+m_strProtocolOptions; return strURL; }