bool CAddonsDirectory::GetScriptsAndPlugins(const CStdString &content, CFileItemList &items) { items.Clear(); VECADDONS addons; if (!GetScriptsAndPlugins(content, addons)) return false; for (unsigned i=0; i<addons.size(); i++) { CFileItemPtr item(FileItemFromAddon(addons[i], addons[i]->Type()==ADDON_PLUGIN?"plugin://":"script://", addons[i]->Type() == ADDON_PLUGIN)); PluginPtr plugin = boost::dynamic_pointer_cast<CPluginSource>(addons[i]); if (plugin->ProvidesSeveral()) { CURL url = item->GetAsUrl(); CStdString opt; opt.Format("?content_type=%s",content.c_str()); url.SetOptions(opt); item->SetPath(url.Get()); } items.Add(item); } items.Add(GetMoreItem(content)); items.SetContent("addons"); items.SetLabel(g_localizeStrings.Get(24001)); // Add-ons return items.Size() > 0; }
CStdString CTextureCache::GetWrappedImageURL(const CStdString &image, const CStdString &type, const CStdString &options) { if (StringUtils::StartsWith(image, "image://")) return image; // already wrapped CURL url; url.SetProtocol("image"); url.SetUserName(type); url.SetHostName(image); if (!options.IsEmpty()) { url.SetFileName("transform"); url.SetOptions("?" + options); } return url.Get(); }
bool CShoutcastDirectory::ParseGenres(TiXmlElement *root, CFileItemList &items, CURL &url) { TiXmlElement *element = root->FirstChildElement("genre"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No genres found", __FUNCTION__); return false; } items.m_idepth = 1; /* genre list */ CStdString genre, path; while(element != NULL) { genre = element->Attribute("name"); path = genre; /* genre must be urlencoded */ CUtil::URLEncode(path); url.SetOptions("?genre=" + path); url.GetURL(path); CFileItem* pItem = new CFileItem; pItem->m_bIsFolder = true; pItem->SetLabel(genre); pItem->GetMusicInfoTag()->SetGenre(genre); pItem->m_strPath = path; items.Add(pItem); element = element->NextSiblingElement("genre"); } return true; }
void CCurlFile::ParseAndCorrectUrl(CURL &url2) { CStdString strProtocol = url2.GetTranslatedProtocol(); url2.SetProtocol(strProtocol); if( strProtocol.Equals("ftp") || strProtocol.Equals("ftps") ) { /* this is uggly, depending on from where */ /* we get the link it may or may not be */ /* url encoded. if handed from ftpdirectory */ /* it won't be so let's handle that case */ CStdString partial, filename(url2.GetFileName()); CStdStringArray array; /* our current client doesn't support utf8 */ g_charsetConverter.utf8ToStringCharset(filename); /* TODO: create a tokenizer that doesn't skip empty's */ CUtil::Tokenize(filename, array, "/"); filename.Empty(); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { if(it != array.begin()) filename += "/"; partial = *it; CURL::Encode(partial); filename += partial; } /* make sure we keep slashes */ if(url2.GetFileName().Right(1) == "/") filename += "/"; url2.SetFileName(filename); CStdString options = url2.GetOptions().Mid(1); options.TrimRight('/'); // hack for trailing slashes being added from source m_ftpauth = ""; m_ftpport = ""; m_ftppasvip = false; /* parse options given */ CUtil::Tokenize(options, array, "&"); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { CStdString name, value; int pos = it->Find('='); if(pos >= 0) { name = it->Left(pos); value = it->Mid(pos+1, it->size()); } else { name = (*it); value = ""; } if(name.Equals("auth")) { m_ftpauth = value; if(m_ftpauth.IsEmpty()) m_ftpauth = "any"; } else if(name.Equals("active")) { m_ftpport = value; if(value.IsEmpty()) m_ftpport = "-"; } else if(name.Equals("pasvip")) { if(value == "0") m_ftppasvip = false; else m_ftppasvip = true; } } /* ftp has no options */ url2.SetOptions(""); } else if( strProtocol.Equals("http") || strProtocol.Equals("https")) { if (g_guiSettings.GetBool("network.usehttpproxy") && !g_guiSettings.GetString("network.httpproxyserver").empty() && !g_guiSettings.GetString("network.httpproxyport").empty() && m_proxy.IsEmpty()) { m_proxy = g_guiSettings.GetString("network.httpproxyserver"); m_proxy += ":" + g_guiSettings.GetString("network.httpproxyport"); if (g_guiSettings.GetString("network.httpproxyusername").length() > 0 && m_proxyuserpass.IsEmpty()) { m_proxyuserpass = g_guiSettings.GetString("network.httpproxyusername"); m_proxyuserpass += ":" + g_guiSettings.GetString("network.httpproxypassword"); } m_proxytype = (ProxyType)g_guiSettings.GetInt("network.httpproxytype"); CLog::Log(LOGDEBUG, "Using proxy %s, type %d", m_proxy.c_str(), proxyType2CUrlProxyType[m_proxytype]); } // get username and password m_username = url2.GetUserName(); m_password = url2.GetPassWord(); // handle any protocol options CStdString options = url2.GetProtocolOptions(); options.TrimRight('/'); // hack for trailing slashes being added from source if (options.length() > 0) { // clear protocol options url2.SetProtocolOptions(""); // set xbmc headers CStdStringArray array; CUtil::Tokenize(options, array, "&"); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { // parse name, value CStdString name, value; int pos = it->Find('='); if(pos >= 0) { name = it->Left(pos); value = it->Mid(pos+1, it->size()); } else { name = (*it); value = ""; } // url decode value CURL::Decode(value); if(name.Equals("auth")) { m_httpauth = value; if(m_httpauth.IsEmpty()) m_httpauth = "any"; } else if (name.Equals("Referer")) SetReferer(value); else if (name.Equals("User-Agent")) SetUserAgent(value); else if (name.Equals("Cookie")) SetCookie(value); else if (name.Equals("Encoding")) SetContentEncoding(value); else if (name.Equals("noshout") && value.Equals("true")) m_skipshout = true; else SetRequestHeader(name, value); } } } if (m_username.length() > 0 && m_password.length() > 0) m_url = url2.GetWithoutUserDetails(); else m_url = url2.Get(); }
bool CShoutcastDirectory::ParseStations(TiXmlElement *root, CFileItemList &items, CURL &url) { TiXmlElement *element = NULL; CStdString path; items.m_idepth = 2; /* station list */ element = root->FirstChildElement("tunein"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No tunein base found", __FUNCTION__); return false; } path = element->Attribute("base"); path.TrimLeft("/"); url.SetFileName(path); element = root->FirstChildElement("station"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No stations found", __FUNCTION__); return false; } int stations = 0; while(element != NULL && stations < 1000) { CStdString name = element->Attribute("name"); CStdString id = element->Attribute("id"); CStdString bitrate = element->Attribute("br"); CStdString genre = element->Attribute("genre"); CStdString listeners = element->Attribute("lc"); CStdString content = element->Attribute("mt"); CStdString label = name; url.SetOptions("?id=" + id); url.GetURL(path); //printf("%s: %s\n", name.c_str(), path.c_str()); CFileItem* pItem = new CFileItem; pItem->m_bIsFolder = false; /* we highjack the music tag for this stuff, they will be used by */ /* viewstates to sort and display proper information */ pItem->GetMusicInfoTag()->SetArtist(listeners); pItem->GetMusicInfoTag()->SetAlbum(bitrate); pItem->GetMusicInfoTag()->SetGenre(genre); /* this is what will be sorted upon */ pItem->GetVideoInfoTag()->m_fRating = (float)atoi(listeners.c_str()); pItem->m_dwSize = atoi(bitrate.c_str()); pItem->SetLabel(label); /* content type is known before hand, should save later lookup */ /* wonder if we could combine the contentype of the playlist and of the real stream */ pItem->SetContentType("audio/x-scpls"); pItem->m_strPath = path; items.Add(pItem); stations++; element = element->NextSiblingElement("station"); } return true; }
void CCurlFile::ParseAndCorrectUrl(CURL &url2) { CStdString strProtocol = url2.GetTranslatedProtocol(); url2.SetProtocol(strProtocol); if( strProtocol.Equals("ftp") || strProtocol.Equals("ftps") ) { // we was using url optons for urls, keep the old code work and warning if (!url2.GetOptions().IsEmpty()) { CLog::Log(LOGWARNING, "%s: ftp url option is deprecated, please switch to use protocol option (change '?' to '|'), url: [%s]", __FUNCTION__, url2.Get().c_str()); url2.SetProtocolOptions(url2.GetOptions().Mid(1)); /* ftp has no options */ url2.SetOptions(""); } /* this is uggly, depending on from where */ /* we get the link it may or may not be */ /* url encoded. if handed from ftpdirectory */ /* it won't be so let's handle that case */ CStdString partial, filename(url2.GetFileName()); CStdStringArray array; // if server sent us the filename in non-utf8, we need send back with same encoding. if (url2.GetProtocolOption("utf8") == "0") g_charsetConverter.utf8ToStringCharset(filename); /* TODO: create a tokenizer that doesn't skip empty's */ CUtil::Tokenize(filename, array, "/"); filename.Empty(); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { if(it != array.begin()) filename += "/"; partial = *it; CURL::Encode(partial); filename += partial; } /* make sure we keep slashes */ if(url2.GetFileName().Right(1) == "/") filename += "/"; url2.SetFileName(filename); m_ftpauth = ""; if (url2.HasProtocolOption("auth")) { m_ftpauth = url2.GetProtocolOption("auth"); if(m_ftpauth.IsEmpty()) m_ftpauth = "any"; } m_ftpport = ""; if (url2.HasProtocolOption("active")) { m_ftpport = url2.GetProtocolOption("active"); if(m_ftpport.IsEmpty()) m_ftpport = "-"; } m_ftppasvip = url2.HasProtocolOption("pasvip") && url2.GetProtocolOption("pasvip") != "0"; } else if( strProtocol.Equals("http") || strProtocol.Equals("https")) { if (CSettings::Get().GetBool("network.usehttpproxy") && !CSettings::Get().GetString("network.httpproxyserver").empty() && !CSettings::Get().GetString("network.httpproxyport").empty() && m_proxy.IsEmpty()) { m_proxy = CSettings::Get().GetString("network.httpproxyserver"); m_proxy += ":" + CSettings::Get().GetString("network.httpproxyport"); if (CSettings::Get().GetString("network.httpproxyusername").length() > 0 && m_proxyuserpass.IsEmpty()) { m_proxyuserpass = CSettings::Get().GetString("network.httpproxyusername"); m_proxyuserpass += ":" + CSettings::Get().GetString("network.httpproxypassword"); } m_proxytype = (ProxyType)CSettings::Get().GetInt("network.httpproxytype"); CLog::Log(LOGDEBUG, "Using proxy %s, type %d", m_proxy.c_str(), proxyType2CUrlProxyType[m_proxytype]); } // get username and password m_username = url2.GetUserName(); m_password = url2.GetPassWord(); // handle any protocol options std::map<CStdString, CStdString> options; url2.GetProtocolOptions(options); if (options.size() > 0) { // clear protocol options url2.SetProtocolOptions(""); // set xbmc headers for(std::map<CStdString, CStdString>::const_iterator it = options.begin(); it != options.end(); ++it) { const CStdString &name = it->first; CStdString value = it->second; // url decode value CURL::Decode(value); if(name.Equals("auth")) { m_httpauth = value; if(m_httpauth.IsEmpty()) m_httpauth = "any"; } else if (name.Equals("Referer")) SetReferer(value); else if (name.Equals("User-Agent")) SetUserAgent(value); else if (name.Equals("Cookie")) SetCookie(value); else if (name.Equals("Encoding")) SetContentEncoding(value); else if (name.Equals("noshout") && value.Equals("true")) m_skipshout = true; else if (name.Equals("seekable") && value.Equals("0")) m_seekable = false; else SetRequestHeader(name, value); } } } if (m_username.length() > 0 && m_password.length() > 0) m_url = url2.GetWithoutUserDetails(); else m_url = url2.Get(); }