Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpc-hc/PPageSubMisc.cpp')
-rw-r--r--src/mpc-hc/PPageSubMisc.cpp278
1 files changed, 236 insertions, 42 deletions
diff --git a/src/mpc-hc/PPageSubMisc.cpp b/src/mpc-hc/PPageSubMisc.cpp
index f046cf7b9..35d3f9a29 100644
--- a/src/mpc-hc/PPageSubMisc.cpp
+++ b/src/mpc-hc/PPageSubMisc.cpp
@@ -1,5 +1,5 @@
/*
- * (C) 2006-2013 see Authors.txt
+ * (C) 2006-2017 see Authors.txt
*
* This file is part of MPC-HC.
*
@@ -20,8 +20,10 @@
#include "stdafx.h"
#include "mplayerc.h"
+#include "MainFrm.h"
+#include "AuthDlg.h"
#include "PPageSubMisc.h"
-#include "ISDb.h"
+#include "SubtitlesProviders.h"
// CPPageSubMisc dialog
@@ -29,11 +31,17 @@ IMPLEMENT_DYNAMIC(CPPageSubMisc, CPPageBase)
CPPageSubMisc::CPPageSubMisc()
: CPPageBase(CPPageSubMisc::IDD, CPPageSubMisc::IDD)
+ , m_pSubtitlesProviders(nullptr)
, m_fPreferDefaultForcedSubtitles(TRUE)
, m_fPrioritizeExternalSubtitles(TRUE)
, m_fDisableInternalSubtitles(FALSE)
- , m_szAutoloadPaths("")
- , m_ISDb(_T(""))
+ , m_bAutoDownloadSubtitles(FALSE)
+ , m_strAutoDownloadSubtitlesExclude()
+ , m_bAutoUploadSubtitles(FALSE)
+ , m_bPreferHearingImpairedSubtitles(FALSE)
+ , m_strSubtitlesProviders()
+ , m_strSubtitlesLanguageOrder()
+ , m_strAutoloadPaths()
{
}
@@ -47,9 +55,13 @@ void CPPageSubMisc::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_CHECK1, m_fPreferDefaultForcedSubtitles);
DDX_Check(pDX, IDC_CHECK2, m_fPrioritizeExternalSubtitles);
DDX_Check(pDX, IDC_CHECK3, m_fDisableInternalSubtitles);
- DDX_Text(pDX, IDC_EDIT1, m_szAutoloadPaths);
- DDX_Control(pDX, IDC_COMBO1, m_ISDbCombo);
- DDX_CBString(pDX, IDC_COMBO1, m_ISDb);
+ DDX_Check(pDX, IDC_CHECK4, m_bAutoDownloadSubtitles);
+ DDX_Check(pDX, IDC_CHECK5, m_bPreferHearingImpairedSubtitles);
+ DDX_Check(pDX, IDC_CHECK6, m_bAutoUploadSubtitles);
+ DDX_Text(pDX, IDC_EDIT1, m_strAutoloadPaths);
+ DDX_Text(pDX, IDC_EDIT2, m_strAutoDownloadSubtitlesExclude);
+ DDX_Text(pDX, IDC_EDIT3, m_strSubtitlesLanguageOrder);
+ DDX_Control(pDX, IDC_LIST1, m_list);
}
BOOL CPPageSubMisc::OnInitDialog()
@@ -61,14 +73,75 @@ BOOL CPPageSubMisc::OnInitDialog()
m_fPreferDefaultForcedSubtitles = s.bPreferDefaultForcedSubtitles;
m_fPrioritizeExternalSubtitles = s.fPrioritizeExternalSubtitles;
m_fDisableInternalSubtitles = s.fDisableInternalSubtitles;
- m_szAutoloadPaths = s.strSubtitlePaths;
+ m_strAutoloadPaths = s.strSubtitlePaths;
+ m_bAutoDownloadSubtitles = s.bAutoDownloadSubtitles;
+ m_strAutoDownloadSubtitlesExclude = s.strAutoDownloadSubtitlesExclude;
+ m_bAutoUploadSubtitles = s.bAutoUploadSubtitles;
+ m_bPreferHearingImpairedSubtitles = s.bPreferHearingImpairedSubtitles;
+ m_strSubtitlesLanguageOrder = s.strSubtitlesLanguageOrder;
+ m_strSubtitlesProviders = s.strSubtitlesProviders;
- m_ISDb = s.strISDb;
- m_ISDbCombo.AddString(m_ISDb);
- if (m_ISDb.CompareNoCase(_T("www.opensubtitles.org/isdb"))) {
- m_ISDbCombo.AddString(_T("www.opensubtitles.org/isdb"));
+ GetDlgItem(IDC_CHECK5)->EnableWindow(m_bAutoDownloadSubtitles);
+ GetDlgItem(IDC_STATIC1)->EnableWindow(m_bAutoDownloadSubtitles);
+ GetDlgItem(IDC_EDIT2)->EnableWindow(m_bAutoDownloadSubtitles);
+
+ m_list.SetExtendedStyle(m_list.GetExtendedStyle()
+ | LVS_EX_DOUBLEBUFFER | LVS_EX_FULLROWSELECT
+ | LVS_EX_CHECKBOXES | LVS_EX_LABELTIP);
+
+ // Do not check dynamic_cast, because if it fails we cannot recover from the error anyway.
+ const CMainFrame* pMainFrame = AfxGetMainFrame();
+ ASSERT(pMainFrame);
+ m_pSubtitlesProviders = pMainFrame->m_pSubtitlesProviders.get();
+ ASSERT(m_pSubtitlesProviders);
+
+ m_list.SetImageList(&m_pSubtitlesProviders->GetImageList(), LVSIL_SMALL);
+
+ CArray<int> columnWidth;
+ if (columnWidth.GetCount() != COL_TOTAL_COLUMNS) {
+ // default sizes
+ columnWidth.RemoveAll();
+ columnWidth.Add(120);
+ columnWidth.Add(75);
+ columnWidth.Add(300);
+ }
+
+ m_list.InsertColumn(COL_PROVIDER, ResStr(IDS_SUBDL_DLG_PROVIDER_COL), LVCFMT_LEFT, columnWidth[COL_PROVIDER]);
+ m_list.InsertColumn(COL_USERNAME, ResStr(IDS_SUBUL_DLG_USERNAME_COL), LVCFMT_LEFT, columnWidth[COL_USERNAME]);
+ m_list.InsertColumn(COL_LANGUAGES, ResStr(IDS_SUBPP_DLG_LANGUAGES_COL), LVCFMT_LEFT, columnWidth[COL_LANGUAGES]);
+
+ m_list.SetRedraw(FALSE);
+ m_list.DeleteAllItems();
+
+ int i = 0;
+ for (const auto& iter : m_pSubtitlesProviders->Providers()) {
+ int iItem = m_list.InsertItem(i++, CString(iter->Name().c_str()), iter->GetIconIndex());
+ m_list.SetItemText(iItem, COL_USERNAME, UTF8To16(iter->UserName().c_str()));
+ m_list.SetItemText(iItem, COL_LANGUAGES, ResStr(IDS_SUBPP_DLG_FETCHING_LANGUAGES));
+ m_list.SetCheck(iItem, iter->Enabled(SPF_SEARCH));
+ m_list.SetItemData(iItem, (DWORD_PTR)(iter.get()));
}
+ m_list.SetRedraw(TRUE);
+ m_list.Invalidate();
+ m_list.UpdateWindow();
+
+ m_threadFetchSupportedLanguages = std::thread([this]() {
+ for (const auto& iter : m_pSubtitlesProviders->Providers()) {
+ iter->Languages();
+ }
+ PostMessage(WM_SUPPORTED_LANGUAGES_READY); // Notify the window that languages have been fetched
+ });
+
+ //TODO: Remove when Auto Upload is finalised
+ CheckDlgButton(IDC_CHECK6, FALSE);
+ GetDlgItem(IDC_CHECK6)->EnableWindow(FALSE);
+
+ EnableToolTips(TRUE);
+ CreateToolTip();
+ m_wndToolTip.AddTool(GetDlgItem(IDC_EDIT2), ResStr(IDS_SUB_AUTODL_IGNORE_TOOLTIP));
+ m_wndToolTip.AddTool(GetDlgItem(IDC_EDIT3), ResStr(IDS_LANG_PREF_EXAMPLE));
+
UpdateData(FALSE);
return TRUE;
@@ -83,61 +156,182 @@ BOOL CPPageSubMisc::OnApply()
s.bPreferDefaultForcedSubtitles = !!m_fPreferDefaultForcedSubtitles;
s.fPrioritizeExternalSubtitles = !!m_fPrioritizeExternalSubtitles;
s.fDisableInternalSubtitles = !!m_fDisableInternalSubtitles;
- s.strSubtitlePaths = m_szAutoloadPaths;
+ s.strSubtitlePaths = m_strAutoloadPaths;
+ s.bAutoDownloadSubtitles = !!m_bAutoDownloadSubtitles;
+ s.strAutoDownloadSubtitlesExclude = m_strAutoDownloadSubtitlesExclude;
+ s.bAutoUploadSubtitles = !!m_bAutoUploadSubtitles;
+ s.bPreferHearingImpairedSubtitles = !!m_bPreferHearingImpairedSubtitles;
+ s.strSubtitlesLanguageOrder = m_strSubtitlesLanguageOrder;
- s.strISDb = m_ISDb;
- s.strISDb.TrimRight('/');
+ for (int i = 0; i < m_list.GetItemCount(); ++i) {
+ SubtitlesProvider* provider = reinterpret_cast<SubtitlesProvider*>(m_list.GetItemData(i));
+ provider->Enabled(SPF_SEARCH, m_list.GetCheck(i));
+ }
+
+ s.strSubtitlesProviders = m_pSubtitlesProviders->WriteSettings().c_str();
return __super::OnApply();
}
BEGIN_MESSAGE_MAP(CPPageSubMisc, CPPageBase)
+ ON_MESSAGE_VOID(WM_SUPPORTED_LANGUAGES_READY, OnSupportedLanguagesReady)
+ ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedResetSubsPath)
- ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedTestSubsDB)
- ON_UPDATE_COMMAND_UI(IDC_BUTTON2, OnUpdateButtonTestSubsDB)
- ON_CBN_EDITCHANGE(IDC_COMBO1, OnURLModified)
+ ON_BN_CLICKED(IDC_CHECK4, OnAutoDownloadSubtitlesClicked)
+ ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRightClick)
+ ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemChanged)
END_MESSAGE_MAP()
-void CPPageSubMisc::OnBnClickedResetSubsPath()
+void CPPageSubMisc::OnSupportedLanguagesReady()
{
- m_szAutoloadPaths = DEFAULT_SUBTITLE_PATHS;
+ int i = 0;
+ for (const auto& iter : m_pSubtitlesProviders->Providers()) {
+ CString languages(SubtitlesProvidersUtils::JoinContainer(iter->Languages(), ",").c_str());
+ m_list.SetItemText(i++, COL_LANGUAGES, languages.IsEmpty() ? ResStr(IDS_SUBPP_DLG_LANGUAGES_ERROR) : languages);
+ }
+}
- UpdateData(FALSE);
- SetModified();
+void CPPageSubMisc::OnDestroy()
+{
+ if (m_threadFetchSupportedLanguages.joinable()) {
+ m_threadFetchSupportedLanguages.join();
+ }
}
-void CPPageSubMisc::OnBnClickedTestSubsDB()
+void CPPageSubMisc::OnRightClick(NMHDR* pNMHDR, LRESULT* pResult)
{
- CString ISDb, ver, str;
- UINT msg;
+ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
- m_ISDbCombo.GetWindowText(ISDb);
- ISDb.TrimRight('/');
+ if (lpnmlv->iItem >= 0 && lpnmlv->iSubItem >= 0) {
+ SubtitlesProvider& provider = *(SubtitlesProvider*)(m_list.GetItemData(lpnmlv->iItem));
- ver.Format(_T("ISDb v%d"), ISDb_PROTOCOL_VERSION);
+ enum {
+ SET_CREDENTIALS = 0x1000,
+ RESET_CREDENTIALS,
+ MOVE_UP,
+ MOVE_DOWN,
+ OPEN_URL,
+ COPY_URL
+ };
- CWebTextFile wtf;
- UINT nIconType = MB_ICONEXCLAMATION;
+ CMenu m;
+ m.CreatePopupMenu();
+ m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) ? MF_ENABLED : MF_DISABLED), SET_CREDENTIALS, ResStr(IDS_SUBMENU_SETUP));
+ m.AppendMenu(MF_STRING | (provider.Flags(SPF_LOGIN) && provider.UserName().length() ? MF_ENABLED : MF_DISABLED), RESET_CREDENTIALS, ResStr(IDS_SUBMENU_RESET));
+ m.AppendMenu(MF_SEPARATOR);
+ m.AppendMenu(MF_STRING | (lpnmlv->iItem > 0 ? MF_ENABLED : MF_DISABLED), MOVE_UP, ResStr(IDS_SUBMENU_MOVEUP));
+ m.AppendMenu(MF_STRING | (lpnmlv->iItem < m_list.GetItemCount() - 1 ? MF_ENABLED : MF_DISABLED), MOVE_DOWN, ResStr(IDS_SUBMENU_MOVEDOWN));
+ m.AppendMenu(MF_SEPARATOR);
+ m.AppendMenu(MF_STRING | MF_ENABLED, OPEN_URL, ResStr(IDS_SUBMENU_OPENURL));
+ m.AppendMenu(MF_STRING | MF_ENABLED, COPY_URL, ResStr(IDS_SUBMENU_COPYURL));
- if (wtf.Open(_T("http://") + ISDb + _T("/test.php")) && wtf.ReadString(str) && str == ver) {
- msg = IDS_PPSDB_URLCORRECT;
- nIconType = MB_ICONINFORMATION;
- } else if (str.Find(_T("ISDb v")) == 0) {
- msg = IDS_PPSDB_PROTOCOLERR;
- } else {
- msg = IDS_PPSDB_BADURL;
- }
+ CPoint pt = lpnmlv->ptAction;
+ ::MapWindowPoints(lpnmlv->hdr.hwndFrom, HWND_DESKTOP, &pt, 1);
+
+ switch (m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, pt.x, pt.y, this)) {
+ case OPEN_URL:
+ provider.OpenUrl();
+ break;
+ case COPY_URL: {
+ if (!provider.Url().empty()) {
+ size_t len = provider.Url().length() + 1;
+ HGLOBAL hGlob = ::GlobalAlloc(GMEM_MOVEABLE, len * sizeof(CHAR));
+ if (hGlob) {
+ // Lock the handle and copy the text to the buffer
+ LPVOID pData = ::GlobalLock(hGlob);
+ if (pData) {
+ ::strcpy_s((CHAR*)pData, len, (LPCSTR)provider.Url().c_str());
+ ::GlobalUnlock(hGlob);
+
+ if (GetParent()->OpenClipboard()) {
+ // Place the handle on the clipboard, if the call succeeds
+ // the system will take care of the allocated memory
+ if (::EmptyClipboard() && ::SetClipboardData(CF_TEXT, hGlob)) {
+ hGlob = nullptr;
+ }
+
+ ::CloseClipboard();
+ }
+ }
- AfxMessageBox(msg, nIconType | MB_OK, 0);
+ if (hGlob) {
+ ::GlobalFree(hGlob);
+ }
+ }
+ }
+ break;
+ }
+ case SET_CREDENTIALS: {
+ CString szUser(UTF8To16(provider.UserName().c_str()));
+ CString szPass(UTF8To16(provider.Password().c_str()));
+ CString szDomain(provider.Name().c_str());
+ if (ERROR_SUCCESS == PromptForCredentials(GetSafeHwnd(),
+ ResStr(IDS_SUB_CREDENTIALS_TITLE), ResStr(IDS_SUB_CREDENTIALS_MSG) + CString(provider.Url().c_str()),
+ szDomain, szUser, szPass, /*&bSave*/nullptr)) {
+ provider.LogOut();
+ provider.UserName(static_cast<const char*>(UTF16To8(szUser)));
+ provider.Password(static_cast<const char*>(UTF16To8(szPass)));
+ m_list.SetItemText(lpnmlv->iItem, 1, szUser);
+ SetModified();
+ }
+ break;
+ }
+ case RESET_CREDENTIALS:
+ provider.LogOut();
+ provider.UserName("");
+ provider.Password("");
+ m_list.SetItemText(lpnmlv->iItem, 1, _T(""));
+ SetModified();
+ break;
+ case MOVE_UP:
+ m_pSubtitlesProviders->MoveUp(lpnmlv->iItem);
+ ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd());
+ SetModified();
+ break;
+ case MOVE_DOWN:
+ m_pSubtitlesProviders->MoveDown(lpnmlv->iItem);
+ ListView_SortItemsEx(m_list.GetSafeHwnd(), SortCompare, m_list.GetSafeHwnd());
+ SetModified();
+ break;
+ default:
+ break;
+ }
+ }
}
-void CPPageSubMisc::OnUpdateButtonTestSubsDB(CCmdUI* pCmdUI)
+void CPPageSubMisc::OnAutoDownloadSubtitlesClicked()
{
- pCmdUI->Enable(m_ISDbCombo.GetWindowTextLength() > 0);
+ m_bAutoDownloadSubtitles = IsDlgButtonChecked(IDC_CHECK4);
+ GetDlgItem(IDC_CHECK5)->EnableWindow(m_bAutoDownloadSubtitles);
+ GetDlgItem(IDC_STATIC1)->EnableWindow(m_bAutoDownloadSubtitles);
+ GetDlgItem(IDC_EDIT2)->EnableWindow(m_bAutoDownloadSubtitles);
+ UpdateWindow();
+
+ SetModified();
}
-void CPPageSubMisc::OnURLModified()
+void CPPageSubMisc::OnBnClickedResetSubsPath()
{
+ m_strAutoloadPaths = DEFAULT_SUBTITLE_PATHS;
+
+ UpdateData(FALSE);
SetModified();
}
+
+void CPPageSubMisc::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMLISTVIEW pNMLV = (LPNMLISTVIEW)pNMHDR;
+
+ if (pNMLV->uOldState + pNMLV->uNewState == 0x3000) {
+ SetModified();
+ }
+}
+
+int CALLBACK CPPageSubMisc::SortCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+ CListCtrl& list = *(CListCtrl*)CListCtrl::FromHandle((HWND)lParamSort);
+ size_t left = ((SubtitlesProvider*)list.GetItemData((int)lParam1))->Index();
+ size_t right = ((SubtitlesProvider*)list.GetItemData((int)lParam2))->Index();
+ return int(left - right);
+}