Index: src/plugin/PluginConfig.cpp |
=================================================================== |
deleted file mode 100644 |
--- a/src/plugin/PluginConfig.cpp |
+++ /dev/null |
@@ -1,644 +0,0 @@ |
-#include "PluginStdAfx.h" |
- |
-#include "PluginConfig.h" |
-#include "PluginClient.h" |
-#include "PluginSettings.h" |
-#include "PluginMutex.h" |
- |
- |
-class CPluginConfigLock : public CPluginMutex |
-{ |
-public: |
- CPluginConfigLock() : CPluginMutex("ConfigFile", PLUGIN_ERROR_MUTEX_CONFIG_FILE) {} |
- ~CPluginConfigLock() {} |
-}; |
- |
- |
-CPluginConfig* CPluginConfig::s_instance = NULL; |
- |
-CComAutoCriticalSection CPluginConfig::s_criticalSection; |
- |
- |
-CPluginConfig::CPluginConfig(bool forceCreate) |
-{ |
- DEBUG_GENERAL("*** Initializing config") |
- |
- bool isExisting = true; |
- { |
- CPluginConfigLock lock; |
- if (lock.IsLocked()) |
- { |
- std::ifstream is; |
- is.open(CPluginSettings::GetDataPath(CONFIG_INI_FILE), std::ios_base::in); |
- if (!is.is_open()) |
- { |
- isExisting = false; |
- } |
- else |
- { |
- is.close(); |
- } |
- } |
- } |
- |
- if (!isExisting) |
- { |
- Create(forceCreate); |
- } |
- Read(); |
-} |
- |
- |
-CPluginConfig::~CPluginConfig() |
-{ |
- s_criticalSection.Lock(); |
- { |
- s_instance = NULL; |
- } |
- s_criticalSection.Unlock(); |
-} |
- |
- |
-CPluginConfig* CPluginConfig::GetInstance(bool forceCreate) |
-{ |
- CPluginConfig* instance = NULL; |
- |
- s_criticalSection.Lock(); |
- { |
- if (!s_instance) |
- { |
- s_instance = new CPluginConfig(forceCreate); |
- } |
- |
- instance = s_instance; |
- } |
- s_criticalSection.Unlock(); |
- |
- return instance; |
-} |
- |
- |
-void CPluginConfig::Read() |
-{ |
- DEBUG_GENERAL("*** Loading config:" + CPluginSettings::GetDataPath(CONFIG_INI_FILE)) |
- |
- CPluginConfigLock lock; |
- if (lock.IsLocked()) |
- { |
- CPluginIniFileW iniFile(CPluginSettings::GetDataPath(CONFIG_INI_FILE), false); |
- |
- if (!iniFile.Read()) |
- { |
- DEBUG_ERROR_LOG(iniFile.GetLastError(), PLUGIN_ERROR_CONFIG, PLUGIN_ERROR_CONFIG_READ_FILE, "Dictionary::SetLanguage - Read") |
- return; |
- } |
- |
- s_criticalSection.Lock(); |
- { |
- m_downloadFileProperties.clear(); |
- m_downloadFileCategories.clear(); |
- m_downloadDomainTitles.clear(); |
- |
- const CPluginIniFileW::TSectionNames& names = iniFile.GetSectionNames(); |
- |
- for (CPluginIniFileW::TSectionNames::const_iterator it = names.begin(); it != names.end(); ++it) |
- { |
- if (it->Left(8) == L"category") |
- { |
- CPluginIniFileW::TSectionData data = iniFile.GetSectionData(*it); |
- |
- SDownloadFileCategory category; |
- |
- category.description = data["description"]; |
- category.extension = data["extension"]; |
- category.ffmpegArgs = data["ffmpeg"]; |
- category.type = data["type"]; |
- category.category = *it; |
- |
- m_downloadFileCategories[category.category] = category; |
- } |
- else if (it->Left(6) == L"format") |
- { |
- CPluginIniFileW::TSectionData data = iniFile.GetSectionData(*it); |
- |
- CString contents = data["type"]; |
- |
- int pos = 0; |
- |
- CString content = contents.Tokenize(L";", pos); |
- while (pos >= 0) |
- { |
- SDownloadFileProperties properties; |
- |
- properties.category = data["category"]; |
- properties.conversions = data["conversions"]; |
- properties.content = content; |
- |
- TDownloadFileCategories::const_iterator it = m_downloadFileCategories.find(properties.category); |
- if (it != m_downloadFileCategories.end()) |
- { |
- properties.properties = it->second; |
- } |
- |
- m_downloadFileProperties[content] = properties; |
- |
- content = contents.Tokenize(L";", pos); |
- } |
- } |
- else if (*it == L"titles") |
- { |
- CPluginIniFileW::TSectionData data = iniFile.GetSectionData(*it); |
- |
- for (CPluginIniFileW::TSectionData::iterator it = data.begin(); it != data.end(); ++it) |
- { |
- SDownloadDomainTitle title; |
- |
- int iPos = 0; |
- CString token = it->second.Tokenize(L";", iPos); |
- while (iPos >= 0) |
- { |
- int iTagPos = 0; |
- CString tag = token.Tokenize(L"=", iTagPos); |
- if (iTagPos >= 0) |
- { |
- CString value = token.Mid(iTagPos); |
- |
- if (tag == "tag") |
- { |
- title.tag = value; |
- } |
- else if (tag == "attr") |
- { |
- title.bstrAttr = value; |
- } |
- else if (tag == "search") |
- { |
- title.search = value; |
- } |
- else if (tag == "format") |
- { |
- int iTitlePos = value.Find(L"[TITLE]"); |
- if (iTitlePos > 0) |
- { |
- title.formatPre = value.Left(iTitlePos); |
- } |
- if (iTitlePos >= 0) |
- { |
- title.formatPost = value.Mid(iTitlePos + 7); |
- } |
- } |
- else if (tag == "token") |
- { |
- title.token = value; |
- title.token.Replace(L"\\t", L"\t"); |
- title.token.Replace(L"\\n", L"\n"); |
- title.token.Replace(L"\\r", L"\r"); |
- } |
- else if (tag.Left(5) == "attr.") |
- { |
- SDownloadDomainTitleAttribute titleAttr; |
- |
- titleAttr.attribute = tag.Mid(5); |
- titleAttr.bstrAttribute = tag.Mid(5); |
- titleAttr.value = value; |
- |
- title.attributes.push_back(titleAttr); |
- } |
- } |
- |
- token = it->second.Tokenize(L";", iPos); |
- } |
- |
- m_downloadDomainTitles[it->first] = title; |
- } |
- } |
- } |
- } |
- s_criticalSection.Unlock(); |
- } |
-} |
- |
- |
-void CPluginConfig::Create(bool forceCreate) |
-{ |
- DEBUG_GENERAL("*** Creating config:" + CPluginSettings::GetDataPath(CONFIG_INI_FILE)); |
- |
- CPluginConfigLock lock; |
- if (lock.IsLocked()) |
- { |
- CPluginIniFileW iniFile(CPluginSettings::GetDataPath(CONFIG_INI_FILE), false); |
- |
- CPluginSettings* settings = CPluginSettings::GetInstance(); |
- |
- if (forceCreate) |
- { |
- } |
- else if (iniFile.Exists() || !settings->IsMainProcess()) |
- { |
- return; |
- } |
- |
- s_criticalSection.Lock(); |
- { |
- // Formats |
- // ---------------------------------------------------------------- |
- // .asf |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/x-ms-asf"; |
- format["category"] = "categoryAsf"; |
- format["conversions"] = "Video;Audio"; |
- |
- iniFile.UpdateSection("formatAsf", format); |
- } |
- // .avi |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/avi;video/msvideo;video/x-msvideo"; |
- format["category"] = "categoryAvi"; |
- format["conversions"] = "Video;Audio"; |
- |
- iniFile.UpdateSection("formatAvi", format); |
- } |
- // .flv |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/flv;flv-application/octet-stream;video/x-flv"; |
- format["category"] = "categoryFlv"; |
- format["conversions"] = "Video;Audio"; |
- |
- iniFile.UpdateSection("formatFlv", format); |
- } |
- // .mov |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/quicktime"; |
- format["category"] = "categoryMov"; |
- format["conversions"] = "Video;Audio"; |
- |
- iniFile.UpdateSection("formatMov", format); |
- } |
- // .mp3 |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "audio/mpeg"; |
- format["category"] = "categoryMp3"; |
- format["conversions"] = "Audio"; |
- |
- iniFile.UpdateSection("formatMp3", format); |
- } |
- // .mp4 audio |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "audio/mp4"; |
- format["category"] = "categoryMp4Audio"; |
- format["conversions"] = "Audio"; |
- |
- iniFile.UpdateSection("formatMp4Audio", format); |
- } |
- // .mp4 video |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/mp4"; |
- format["category"] = "categoryMp4Video"; |
- format["conversions"] = "Video;Audio"; |
- |
- iniFile.UpdateSection("formatMp4Video", format); |
- } |
- // .wav |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "audio/x-wav;audio/wav;audio/wave"; |
- format["category"] = "categoryWav"; |
- format["conversions"] = "Audio"; |
- |
- iniFile.UpdateSection("formatWav", format); |
- } |
- // .wmv |
- { |
- CPluginIniFileW::TSectionData format; |
- |
- format["type"] = "video/x-ms-wmv"; |
- format["category"] = "categoryWmv"; |
- format["conversions"] = ""; |
- |
- iniFile.UpdateSection("formatWmv", format); |
- } |
- |
- // Categories |
- // ---------------------------------------------------------------- |
- // asf |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "asf"; |
- category["description"] = "Advanced Systems Format"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryAsf", category); |
- } |
- // avi |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "avi"; |
- category["description"] = "Audio Video Interleave"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryAvi", category); |
- } |
- // flv |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "flv"; |
- category["description"] = "Flash Video"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryFlv", category); |
- } |
- // mp3 |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Audio"; |
- category["extension"] = "mp3"; |
- category["description"] = "MP3"; |
- category["ffmpeg"] = "-acodec libmp3lame -ab 160kb -ac 2 -ar 44100"; |
- |
- iniFile.UpdateSection("categoryMp3", category); |
- } |
- // mov |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "mov"; |
- category["description"] = "QuickTime"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryMov", category); |
- } |
- // mp4 Audio |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Audio"; |
- category["extension"] = "mp4"; |
- category["description"] = "MPEG-4 Audio"; |
- category["ffmpeg"] = "exclude"; |
- |
- iniFile.UpdateSection("categoryMp4Audio", category); |
- } |
- // mp4 Video |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "mp4"; |
- category["description"] = "MPEG-4 Video"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryMp4Video", category); |
- } |
- // wav |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Audio"; |
- category["extension"] = "wav"; |
- category["description"] = "Waveform Audio"; |
- category["ffmpeg"] = ""; |
- |
- iniFile.UpdateSection("categoryWav", category); |
- } |
- // wmv |
- { |
- CPluginIniFileW::TSectionData category; |
- |
- category["type"] = "Video"; |
- category["extension"] = "wmv"; |
- category["description"] = "Windows Media Video"; |
- category["ffmpeg"] = "exclude"; |
- |
- iniFile.UpdateSection("categoryWmv", category); |
- } |
- |
- // Titles |
- // ---------------------------------------------------------------- |
- { |
- CPluginIniFileW::TSectionData titles; |
- |
- titles["break.com"] = "tag=title;format=[TITLE]Video"; |
- titles["dailymotion.com"] = "tag=h1"; |
- titles["guitarworld.com"] = "tag=h1"; |
- titles["metacafe.com"] = "tag=h1"; |
- titles["mtv.com"] = "tag=title;format=[TITLE]MTV"; |
- titles["pp2g.tv"] = "tag=title;format=PP2G.TV[TITLE]"; |
- titles["top-channel.tv"] = "tag=span;attr.class=titullmadh"; |
- titles["youporn.com"] = "tag=h1;attr.id="; |
- titles["youtube.com"] = "tag=title;format=YouTube[TITLE]"; |
- titles["video.google.com"] = "tag=title"; |
- titles["video.nationalgeographic.com"] = "tag=title;format=[TITLE]National Geographic"; |
- titles["vids.myspace.com"] = "tag=title"; |
- titles["wimp.com"] = "tag=title"; |
- |
- iniFile.UpdateSection("titles", titles); |
- } |
- } |
- s_criticalSection.Unlock(); |
- |
- if (iniFile.Write()) |
- { |
- CPluginSettings* settings = CPluginSettings::GetInstance(); |
- |
- settings->SetValue(SETTING_CONFIG_VERSION, 5); |
- settings->Write(); |
- } |
- else |
- { |
- DEBUG_ERROR_LOG(iniFile.GetLastError(), PLUGIN_ERROR_CONFIG, PLUGIN_ERROR_CONFIG_CREATE_FILE, "Config::Create - Write") |
- } |
- } |
-} |
- |
-bool CPluginConfig::Download(const CString& url, const CString& filename) |
-{ |
- CString tempFile = CPluginSettings::GetTempFile(TEMP_FILE_PREFIX); |
- |
- DEBUG_GENERAL("*** Downloading config:" + filename + " (to " + tempFile + ")"); |
- |
- bool bResult = !tempFile.IsEmpty(); |
- if (bResult) |
- { |
- // if new filter urls are found download them and update the persistent data |
- HRESULT hr = ::URLDownloadToFile(NULL, url, tempFile, 0, NULL); |
- if (SUCCEEDED(hr)) |
- { |
- CPluginConfigLock lock; |
- if (lock.IsLocked()) |
- { |
- // Move the temporary file to the new text file. |
- if (!::MoveFileEx(tempFile, CPluginSettings::GetDataPath(CONFIG_INI_FILE), MOVEFILE_REPLACE_EXISTING)) |
- { |
- DWORD dwError = ::GetLastError(); |
- |
- // Not same device? copy/delete instead |
- if (dwError == ERROR_NOT_SAME_DEVICE) |
- { |
- if (!::CopyFile(tempFile, CPluginSettings::GetDataPath(CONFIG_INI_FILE), FALSE)) |
- { |
- DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_CONFIG, PLUGIN_ERROR_CONFIG_COPY_FILE, "Config::Download - CopyFile(" + filename + ")") |
- |
- bResult = false; |
- } |
- |
- ::DeleteFile(tempFile); |
- } |
- else |
- { |
- DEBUG_ERROR_LOG(dwError, PLUGIN_ERROR_CONFIG, PLUGIN_ERROR_CONFIG_MOVE_FILE, "Config::Download - MoveFileEx(" + filename + ")") |
- |
- bResult = false; |
- } |
- } |
- } |
- else |
- { |
- bResult = false; |
- } |
- } |
- else |
- { |
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_CONFIG, PLUGIN_ERROR_CONFIG_DOWNLOAD_FILE, "Config::Download - URLDownloadToFile(" + CString(CONFIG_INI_FILE) + ")"); |
- |
- bResult = false; |
- } |
- } |
- |
- return bResult; |
-} |
- |
- |
-bool CPluginConfig::GetDownloadProperties(const CString& contentType, SDownloadFileProperties& properties) const |
-{ |
- bool isValid = false; |
- |
- s_criticalSection.Lock(); |
- { |
- TDownloadFileProperties::const_iterator it = m_downloadFileProperties.find(contentType); |
- if (it != m_downloadFileProperties.end()) |
- { |
- properties = it->second; |
- isValid = true; |
- } |
- } |
- s_criticalSection.Unlock(); |
- |
- return isValid; |
-} |
- |
- |
-int CPluginConfig::GenerateFilterString(TCHAR* pBuffer, SDownloadFileProperties& properties, std::vector<std::pair<CString,CString>>& filterData, bool allowConversion) const |
-{ |
- int filterIndex = 1; |
- int bufferIndex = 0; |
- |
- std::map<CString,SDownloadFileCategory> filters; |
- |
- s_criticalSection.Lock(); |
- { |
- int pos = 0; |
- CString categories = properties.conversions + ";" + properties.properties.extension; |
- CString category = categories.Tokenize(_T(";"), pos); |
- while (pos >= 0) |
- { |
- for (TDownloadFileCategories::const_iterator it = m_downloadFileCategories.begin(); it != m_downloadFileCategories.end(); ++it) |
- { |
- if (it->second.type == category) |
- { |
- filters[category + " - " + it->second.description] = it->second; |
- } |
- } |
- |
- category = categories.Tokenize(_T(";"), pos); |
- } |
- |
- int index = 1; |
- |
- for (std::map<CString,SDownloadFileCategory>::iterator it = filters.begin(); it != filters.end(); ++it) |
- { |
- if (allowConversion && it->second.ffmpegArgs != "exclude" || it->second.category == properties.category) |
- { |
- CString extension = it->second.extension; |
- CString description = it->first; |
- |
- wsprintf(pBuffer + bufferIndex, L"%s (*.%s)\0", description.GetBuffer(), extension.GetBuffer()); |
- bufferIndex += description.GetLength() + extension.GetLength() + 6; |
- wsprintf(pBuffer + bufferIndex, L".%s\0", extension.GetBuffer()); |
- bufferIndex += extension.GetLength() + 2; |
- |
- if (it->second.category == properties.category) |
- { |
- filterIndex = index; |
- filterData.push_back(std::make_pair(extension, "")); |
- } |
- else |
- { |
- filterData.push_back(std::make_pair(extension, it->second.ffmpegArgs)); |
- } |
- |
- index++; |
- } |
- } |
- } |
- s_criticalSection.Unlock(); |
- |
- pBuffer[bufferIndex] = _T('\0'); |
- |
- return filterIndex; |
-} |
- |
-void CPluginConfig::GetDownloadDomainTitles(TDownloadDomainTitles& domainTitles) const |
-{ |
- domainTitles.clear(); |
- |
- s_criticalSection.Lock(); |
- { |
- domainTitles = m_downloadDomainTitles; |
- } |
- s_criticalSection.Unlock(); |
-} |
- |
-std::vector<CString> CPluginConfig::GetConversionExtenssions() |
-{ |
- std::vector<CString> returnVector; |
- for (TDownloadFileCategories::const_iterator it = m_downloadFileCategories.begin(); it != m_downloadFileCategories.end(); ++it) |
- { |
- bool isUnique = true; |
- for (std::vector<CString>::const_iterator ext = returnVector.begin(); ext != returnVector.end(); ++ext) |
- { |
- CString extenssion(ext->GetString()); |
- if (extenssion == it->second.extension) |
- { |
- isUnique = false; |
- } |
- } |
- if (isUnique) |
- { |
- returnVector.push_back(it->second.extension); |
- } |
- } |
- return returnVector; |
-} |