Kimarite

/smtube-20.1.0/src/browserwindow.cpp | https://invidio.us/

Mar 2nd, 2020
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.10 KB | None | 0 0
  1. /* SMTUBE2, a small YouTube browser for SMPlayer
  2. Copyright (C) 2015-2020 Ricardo Villalba <rvm@users.sourceforge.net>
  3.  
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13.  
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. */
  18.  
  19. #include "browserwindow.h"
  20.  
  21. #include <QTextEdit>
  22. #include <QLineEdit>
  23. #include <QToolBar>
  24. #include <QMenuBar>
  25. #include <QStatusBar>
  26. #include <QNetworkProxyFactory>
  27. #include <QProcess>
  28. #include <QSettings>
  29. #include <QMessageBox>
  30. #include <QTimer>
  31. #include <QDesktopServices>
  32. #include <QWebFrame>
  33.  
  34. #include "mywebview.h"
  35. #include "mywebpage.h"
  36. #include "mycookiejar.h"
  37.  
  38. #include "supportedurls.h"
  39. #include "retrieveyoutubeurl.h"
  40.  
  41. #include "configdialog.h"
  42. #include "about.h"
  43. #include "version.h"
  44. #include "links.h"
  45. #include "desktopinfo.h"
  46.  
  47. #ifdef YT_USE_YTSIG
  48. #include "ytsig.h"
  49. #include "codedownloader.h"
  50. #endif
  51.  
  52. #if QT_VERSION >= 0x050000
  53. #include <QStandardPaths>
  54. #include "myscroller.h"
  55. #else
  56. #include <QDesktopServices>
  57. #endif
  58.  
  59. BrowserWindow::BrowserWindow(const QString & config_path, QWidget * parent, Qt::WindowFlags flags)
  60. : QMainWindow(parent, flags)
  61. , preferred_resolution(RetrieveYoutubeUrl::R360p)
  62. , use_cookies(true)
  63. , current_player(Undefined)
  64. #ifdef D_BUTTON
  65. , add_download_button(false)
  66. #endif
  67. #ifdef YT_USE_YTSIG
  68. , codedownloader(0)
  69. #endif
  70. {
  71. setWindowTitle("SMTube");
  72. setWindowIcon(QPixmap(":/icons/smtube.png"));
  73. home_page = "https://invidio.us/";
  74.  
  75. settings = new QSettings(config_path + "/smtube2.ini", QSettings::IniFormat, this);
  76.  
  77. ryu = new RetrieveYoutubeUrl(this);
  78. connect(ryu, SIGNAL(gotPreferredUrl(const QString &, int)), this, SLOT(openYTUrl(const QString &, int)));
  79. connect(ryu, SIGNAL(signatureNotFound(const QString &)), this, SLOT(showErrorSignatureNotFound(const QString &)));
  80. connect(ryu, SIGNAL(noSslSupport()), this, SLOT(showErrorNoSslSupport()));
  81. connect(ryu, SIGNAL(gotEmptyList()), this, SLOT(showErrorEmptyList()));
  82.  
  83. ryua = new RetrieveYoutubeUrl(this);
  84. ryua->setUseDASH(true);
  85. connect(ryua, SIGNAL(gotUrls(const QMap<int, QString>&)), this, SLOT(openYTAudioUrl(const QMap<int, QString>&)));
  86. connect(ryua, SIGNAL(signatureNotFound(const QString &)), this, SLOT(showErrorSignatureNotFound(const QString &)));
  87. connect(ryua, SIGNAL(noSslSupport()), this, SLOT(showErrorNoSslSupport()));
  88. connect(ryua, SIGNAL(gotEmptyList()), this, SLOT(showErrorEmptyList()));
  89.  
  90. #ifdef YT_USE_SIG
  91. QSettings * sigset = new QSettings(config_path + "/sig.ini", QSettings::IniFormat, this);
  92. ryu->setSettings(sigset);
  93. ryua->setSettings(sigset);
  94. #endif
  95.  
  96. QNetworkProxyFactory::setUseSystemConfiguration(true);
  97.  
  98. MyWebPage * page = new MyWebPage(this);
  99.  
  100. view = new MyWebView(this);
  101. connect(view, SIGNAL(requestedOpenWith(const QString&, const QUrl&)), this, SLOT(openWith(const QString&, const QUrl&)));
  102. connect(view, SIGNAL(requestedOpenWithBrowser(const QUrl&)), this, SLOT(openWithBrowser(const QUrl&)));
  103. connect(view, SIGNAL(requestedOpenAudioWith(const QString&, const QUrl&)), this, SLOT(openAudioWith(const QString&, const QUrl&)));
  104.  
  105. view->setPage(page);
  106. view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
  107.  
  108. #if QT_VERSION >= 0x050000
  109. //MyScroller::setScroller(view);
  110. #endif
  111.  
  112. connect(view, SIGNAL(loadFinished(bool)), SLOT(adjustLocation()));
  113. connect(view, SIGNAL(titleChanged(QString)), SLOT(adjustTitle()));
  114. connect(view, SIGNAL(loadProgress(int)), SLOT(setProgress(int)));
  115. connect(view, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool)));
  116. connect(view->page(), SIGNAL(linkClicked(const QUrl&)), this, SLOT(processLink(const QUrl&)));
  117. //connect(view, SIGNAL(statusBarMessage(const QString &)), statusBar(), SLOT(showMessage(const QString &)));
  118. connect(view->page(), SIGNAL(linkHovered(const QString &, const QString &, const QString &)),
  119. statusBar(), SLOT(showMessage(const QString &)));
  120.  
  121. location = new QLineEdit(this);
  122. location->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  123. connect(location, SIGNAL(returnPressed()), SLOT(changeLocation()));
  124.  
  125. QAction * loadHomePageAct = new QAction(QPixmap(":/icons/go-home.png"), tr("Home"), this);
  126. connect(loadHomePageAct, SIGNAL(triggered()), SLOT(loadHomePage()));
  127.  
  128. toolbar = addToolBar(tr("Navigation"));
  129. toolbar->addAction(loadHomePageAct);
  130. toolbar->addAction(view->pageAction(QWebPage::Back));
  131. toolbar->addAction(view->pageAction(QWebPage::Forward));
  132. toolbar->addAction(view->pageAction(QWebPage::Reload));
  133. toolbar->addAction(view->pageAction(QWebPage::Stop));
  134. toolbar->addWidget(location);
  135.  
  136. QAction * incFontAct = new QAction(tr("Zoom +"), this);
  137. incFontAct->setShortcut(QKeySequence::ZoomIn);
  138. connect(incFontAct, SIGNAL(triggered()), this, SLOT(incZoom()));
  139.  
  140. QAction * decFontAct = new QAction(tr("Zoom -"), this);
  141. decFontAct->setShortcut(QKeySequence::ZoomOut);
  142. connect(decFontAct, SIGNAL(triggered()), this, SLOT(decZoom()));
  143.  
  144. QAction * quitAct = new QAction(tr("&Quit"), this);
  145. connect(quitAct, SIGNAL(triggered()), this, SLOT(close()));
  146.  
  147. QMenu * browseMenu = menuBar()->addMenu(tr("&Navigation"));
  148. browseMenu->addAction(loadHomePageAct);
  149. browseMenu->addAction(view->pageAction(QWebPage::Back));
  150. browseMenu->addAction(view->pageAction(QWebPage::Forward));
  151. browseMenu->addAction(view->pageAction(QWebPage::Reload));
  152. browseMenu->addAction(view->pageAction(QWebPage::Stop));
  153. browseMenu->addSeparator();
  154. browseMenu->addAction(incFontAct);
  155. browseMenu->addAction(decFontAct);
  156. browseMenu->addSeparator();
  157. browseMenu->addAction(quitAct);
  158.  
  159. QMenu * viewMenu = menuBar()->addMenu(tr("&View"));
  160. toggleToolbarAct = new QAction(tr("Toolbar"), this);
  161. toggleToolbarAct->setCheckable(true);
  162. connect(toggleToolbarAct, SIGNAL(toggled(bool)), this, SLOT(viewToolbar(bool)));
  163.  
  164. toggleStatusbarAct = new QAction(tr("Statusbar"), this);
  165. toggleStatusbarAct->setCheckable(true);
  166. connect(toggleStatusbarAct, SIGNAL(toggled(bool)), this, SLOT(viewStatusbar(bool)));
  167.  
  168. QAction * showConfigDialogAct = new QAction(tr("&Settings"), this);
  169. connect(showConfigDialogAct, SIGNAL(triggered()), this, SLOT(showConfigDialog()));
  170.  
  171. viewMenu->addAction(toggleToolbarAct);
  172. viewMenu->addAction(toggleStatusbarAct);
  173. viewMenu->addSeparator();
  174. viewMenu->addAction(showConfigDialogAct);
  175.  
  176. QMenu * helpMenu = menuBar()->addMenu(tr("&Help"));
  177.  
  178. #ifdef YT_USE_YTSIG
  179. QAction * updateCodeAct = new QAction(tr("&Update the YouTube code"), this);
  180. connect(updateCodeAct, SIGNAL(triggered()), this, SLOT(updateYTCode()));
  181. helpMenu->addAction(updateCodeAct);
  182. #endif
  183.  
  184. #ifdef SHOW_RELEASE_DIALOG
  185. QAction * aboutReleaseAct = new QAction(tr("About this &release"), this);
  186. connect(aboutReleaseAct, SIGNAL(triggered()), this, SLOT(showAboutRelease()));
  187. helpMenu->addAction(aboutReleaseAct);
  188. #endif
  189.  
  190. QAction * aboutAct = new QAction(tr("&About SMTube"), this);
  191. connect(aboutAct, SIGNAL(triggered()), this, SLOT(showAbout()));
  192. helpMenu->addAction(aboutAct);
  193.  
  194. setCentralWidget(view);
  195.  
  196. //menuBar()->hide();
  197. toolbar->hide();
  198. statusBar()->hide();
  199.  
  200. #ifdef STYLE_SWITCHING
  201. default_style = qApp->style()->objectName();
  202. #endif
  203.  
  204. loadConfig();
  205.  
  206. if (use_cookies) {
  207. MyCookieJar * jar = new MyCookieJar(config_path + "/cookies.ini");
  208. view->page()->networkAccessManager()->setCookieJar(jar);
  209. }
  210. }
  211.  
  212. BrowserWindow::~BrowserWindow() {
  213. saveConfig();
  214. }
  215.  
  216. void BrowserWindow::viewToolbar(bool b) {
  217. qDebug() << "BrowserWindow::viewToolbar:" << b;
  218. toolbar->setVisible(b);
  219. // toggleToolbarAct->setChecked(b);
  220. }
  221.  
  222. void BrowserWindow::viewStatusbar(bool b) {
  223. qDebug() << "BrowserWindow::viewStatusbar:" << b;
  224. statusBar()->setVisible(b);
  225. // toggleStatusbarAct->setChecked(b);
  226. }
  227.  
  228. void BrowserWindow::incZoom() {
  229. qreal z = view->page()->mainFrame()->zoomFactor();
  230. view->page()->mainFrame()->setZoomFactor(z + 0.1);
  231. }
  232.  
  233. void BrowserWindow::decZoom() {
  234. qreal z = view->page()->mainFrame()->zoomFactor();
  235. view->page()->mainFrame()->setZoomFactor(z - 0.1);
  236. }
  237.  
  238. void BrowserWindow::loadUrl(const QUrl & url) {
  239. view->load(url);
  240. }
  241.  
  242. void BrowserWindow::search(const QString & term) {
  243. QString search_term = term.toLower();
  244. if (search_term.startsWith("http://") || search_term.startsWith("https://")) {
  245. search_term = search_term.replace("http://", "");
  246. search_term = search_term.replace("https://", "");
  247. }
  248.  
  249. QString q = home_page + "search.php?q=" + search_term;
  250. loadUrl(QUrl(q));
  251. }
  252.  
  253. void BrowserWindow::adjustLocation() {
  254. QString u = view->url().toString();
  255. qDebug() << "BrowserWindow::adjustLocation:" << u;
  256. location->setText(u);
  257. }
  258.  
  259. void BrowserWindow::changeLocation() {
  260. QString text = location->text();
  261. qDebug() << "BrowserWindow::changeLocation:" << text;
  262.  
  263. #if 1
  264. view->load(QUrl::fromUserInput(text));
  265. #else
  266. QRegExp rx("((https?:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,63}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?");
  267. bool valid = (rx.indexIn(text) > -1);
  268. qDebug() << "BrowserWindow::changeLocation: url valid:" << valid;
  269.  
  270. if (!valid) {
  271. search(text);
  272. } else {
  273. view->load(QUrl::fromUserInput(text));
  274. }
  275. #endif
  276. view->setFocus();
  277. }
  278.  
  279. void BrowserWindow::adjustTitle() {
  280. setWindowTitle(view->title());
  281. }
  282.  
  283. void BrowserWindow::setProgress(int p) {
  284. statusBar()->showMessage(tr("Loading... %1%").arg(p));
  285. }
  286.  
  287. void BrowserWindow::finishLoading(bool) {
  288. statusBar()->clearMessage();
  289.  
  290. #ifdef D_BUTTON
  291. QString code;
  292. QString url = view->url().toString();
  293.  
  294. qDebug() << "BrowserWindow::finishLoading: url:" << url;
  295. qDebug() << "BrowserWindow::finishLoading: add_download_button:" << add_download_button;
  296. qDebug() << "BrowserWindow::finishLoading: external_download_url:" << external_download_url;
  297.  
  298. QString title_txt = tr("Download video using an external service").replace("'", "\\'");
  299. QString download_txt = tr("Download").replace("'", "\\'");
  300.  
  301. if (add_download_button && url.contains("/info.php?") &&
  302. (external_download_url.contains("%YT_URL%") || external_download_url.contains("%YT_ID%")))
  303. {
  304. code = "var video_url = document.getElementById('video_thumbnail').href;"
  305. "if (video_url) {"
  306. "var video_id = document.getElementById('video_thumbnail').dataset.id;"
  307. "var div = document.getElementById('published');"
  308. "var link = '" + external_download_url +"';"
  309. "link = link.replace('%YT_URL%', video_url);"
  310. "if (video_id) link = link.replace('%YT_ID%', video_id);"
  311. "div.cells[0].colSpan = 5;"
  312. "div.innerHTML = div.innerHTML + "
  313. "'<td><a target=\"_blank\" class=\"btn btn-primary btn-xs\" "
  314. "title=\"" + title_txt +"\" "
  315. "href=\"' + link + '\">"
  316. "<span class=\"glyphicon glyphicon-download\"></span> " + download_txt +"</a></td>';"
  317. "}";
  318.  
  319. view->page()->mainFrame()->evaluateJavaScript(code);
  320. }
  321. #endif
  322. }
  323.  
  324. void BrowserWindow::processLink(const QUrl & url ) {
  325. qDebug() << "BrowserWindow::processLink:" << url.toString();
  326.  
  327. QString link = url.toString();
  328.  
  329. bool can_play_this = false;
  330. int site_type = SupportedUrls::site(url.toString());
  331.  
  332. #ifdef USE_PLAYERS
  333. // Try to play with the first player on the list
  334. int player_id = 0;
  335. QList<Player> pl = players.availablePlayers();
  336. if (pl.count() > 0) {
  337. if (site_type != SupportedUrls::Unsupported) {
  338. can_play_this = true;
  339. }
  340. }
  341. #else
  342. if (site_type != SupportedUrls::Unsupported) {
  343. can_play_this = true;
  344. }
  345. #endif
  346.  
  347. if (!can_play_this) {
  348. if (view->lastClickedUrl() == url && view->lastClickedTarget() == "_blank") {
  349. qDebug() << "BrowserWindow::processLink: link will be opened in an external browser";
  350. QDesktopServices::openUrl(url);
  351. } else {
  352. view->load(url);
  353. }
  354. } else {
  355. #ifdef USE_PLAYERS
  356. openWith(pl[player_id].name(), QUrl(link));
  357. #else
  358. openWith(0, QUrl(link));
  359. #endif
  360. }
  361. }
  362.  
  363. void BrowserWindow::fetchVideoUrl(RetrieveYoutubeUrl * ry, const QUrl & url, int player_id) {
  364. current_player = player_id;
  365. int resolution = preferred_resolution;
  366.  
  367. #ifdef USE_PLAYERS
  368. if (player_id > -1) {
  369. if (players.item(player_id).preferredResolution() != -1) {
  370. resolution = players.item(player_id).preferredResolution();
  371. }
  372. }
  373. #endif
  374.  
  375. #ifdef YT_USE_YTSIG
  376. YTSig::setScriptFile(script_file);
  377. #endif
  378.  
  379. ry->setPreferredResolution((RetrieveYoutubeUrl::Resolution) resolution);
  380. ry->fetchPage(url.toString());
  381. }
  382.  
  383. void BrowserWindow::openWith(int player_id, const QUrl & url) {
  384. qDebug() << "BrowserWindow::openWith: player_id:" << player_id << "url:" << url.toString();
  385.  
  386. #ifdef USE_PLAYERS
  387. QString binary = players.item(player_id).executable();
  388. QString player_name = players.item(player_id).name();
  389. QString arguments = players.item(player_id).arguments();
  390. bool support_streaming_sites = players.item(player_id).supportStreamingSites();
  391. /* bool support_online_tv = players.item(player_id).supportOnlineTV(); */
  392. #else
  393. QString binary = HCPLAYER_EXECUTABLE;
  394. QString player_name = HCPLAYER_NAME;
  395. QString arguments = HCPLAYER_ARGUMENTS;
  396. bool support_streaming_sites = HCPLAYER_STREAMINGSITES;
  397. #endif
  398.  
  399. int site_type = SupportedUrls::site(url.toString());
  400. bool direct_play = true;
  401. if (site_type == SupportedUrls::Youtube && !support_streaming_sites) direct_play = false;
  402.  
  403. if (direct_play) {
  404. qDebug() << "BrowserWindow::openWith: ready to play with" << player_name;
  405. if (binary.contains(" ")) binary = "\""+ binary +"\"";
  406. QString command = binary +" "+ QString(arguments).replace("%u", "\""+ url.toString() +"\"");
  407. qDebug() << "BrowserWindow::openWith: command:" << command;
  408. QProcess::startDetached(command);
  409. } else {
  410. qDebug() << "BrowserWindow::openWith:" << player_name << "can't play this URL";
  411. #ifdef USE_PLAYERS
  412. fetchVideoUrl(ryu, url, player_id);
  413. #else
  414. fetchVideoUrl(ryu, url);
  415. #endif
  416. }
  417. }
  418.  
  419. void BrowserWindow::openWith(const QString & player, const QUrl & url) {
  420. qDebug() << "BrowserWindow::openWith: player:" << player << "url:" << url.toString();
  421.  
  422. #ifdef USE_PLAYERS
  423. int p = players.findName(player);
  424. if (p != -1) {
  425. openWith(p, url);
  426. } else {
  427. qWarning() << "BrowserWindow::openWith: player not found";
  428. }
  429. #else
  430. openWith(0, url);
  431. #endif
  432. }
  433.  
  434. void BrowserWindow::openWithBrowser(const QUrl & url) {
  435. qDebug() << "BrowserWindow::openWithBrowser: url:" << url.toString();
  436. fetchVideoUrl(ryu, url, WebBrowser);
  437. }
  438.  
  439. void BrowserWindow::openYTUrl(QString title, QString extension, const QString & url) {
  440. qDebug() << "BrowserWindow::openYTUrl:" << url;
  441.  
  442. if (current_player == WebBrowser) {
  443. QString u = url;
  444. #if 1
  445. u = "https://invidio.us/?u=" + url.toUtf8().toBase64().toPercentEncoding() +
  446. "&t=" + title.toUtf8().toBase64().toPercentEncoding();
  447. #endif
  448. QDesktopServices::openUrl(u);
  449. return;
  450. }
  451.  
  452. #ifdef USE_PLAYERS
  453. if (current_player == -1) {
  454. qDebug() << "BrowserWindow::openYTUrl: invalid player";
  455. return;
  456. }
  457. #endif
  458.  
  459. title = title.replace('"', "'");
  460.  
  461. QString filename = title;
  462. filename = filename.replace(" - YouTube", "").replace(":", "").replace("|","");
  463. filename += extension;
  464.  
  465. qDebug() << "BrowserWindow::openYTUrl: filename:" << filename;
  466.  
  467. #ifdef USE_PLAYERS
  468. QString binary = players.item(current_player).executable();
  469. QString arguments = players.item(current_player).arguments();
  470. #else
  471. QString binary = HCPLAYER_EXECUTABLE;
  472. QString arguments = HCPLAYER_ARGUMENTS;
  473. #endif
  474.  
  475. if (binary.contains(" ")) binary = "\""+ binary +"\"";
  476.  
  477. QString expanded_arguments = QString(arguments).replace("%u", "\""+ url +"\"");
  478. if (!url.contains("%f") && !url.contains("%t")) {
  479. expanded_arguments = expanded_arguments.replace("%f", "\"" + filename +"\"")
  480. .replace("%t", "\"" + title +"\"");
  481. }
  482.  
  483. QString command = binary + " " + expanded_arguments;
  484. qDebug() << "BrowserWindow::openYTUrl: command:" << command;
  485.  
  486. QProcess::startDetached(command);
  487. }
  488.  
  489. void BrowserWindow::openYTUrl(const QString & url, int itag) {
  490. openYTUrl(ryu->urlTitle(), ryu->extensionForItag(itag), url);
  491. }
  492.  
  493. void BrowserWindow::openAudioWith(const QString & player, const QUrl & url) {
  494. qDebug() << "BrowserWindow::openAudioWith: player:" << player << "url:" << url.toString();
  495.  
  496. #ifdef USE_PLAYERS
  497. int p = players.findName(player);
  498. #else
  499. int p = 0;
  500. #endif
  501.  
  502. if (p != -1) {
  503. #ifdef USE_PLAYERS
  504. fetchVideoUrl(ryua, url, p);
  505. #else
  506. fetchVideoUrl(ryua, url);
  507. #endif
  508. }
  509. }
  510.  
  511. void BrowserWindow::openYTAudioUrl(const QMap<int, QString>& url_map) {
  512. Q_UNUSED(url_map);
  513. qDebug() << "BrowserWindow::openYTAudioUrl";
  514.  
  515. int itag = ryua->selectedQuality();
  516. QString url = ryua->selectedAudioUrl();
  517.  
  518. qDebug() << "BrowserWindow::openYTAudioUrl: url:" << url << "itag:" << itag;
  519.  
  520. if (!url.isEmpty()) {
  521. openYTUrl(ryua->urlTitle(), ryu->extensionForItag(itag), url);
  522. }
  523. }
  524.  
  525. void BrowserWindow::showErrorNoSslSupport() {
  526. qDebug() << "BrowserWindow::showErrorNoSslSupport";
  527. QMessageBox::warning(this, tr("Connection failed"),
  528. tr("The video you requested needs to open a HTTPS connection.") +"<br>"+
  529. tr("Unfortunately the OpenSSL component, required for it, is not available in your system."));
  530. }
  531.  
  532. void BrowserWindow::showErrorEmptyList() {
  533. qDebug() << "showErrorEmptyList";
  534. QMessageBox::warning(this, tr("No video found"),
  535. tr("It wasn't possible to find the URL for this video."));
  536. }
  537.  
  538. void BrowserWindow::showErrorSignatureNotFound(const QString & title) {
  539. qDebug() << "YTDialog::showErrorSignatureNotFound:" << title;
  540.  
  541. QString t = title;
  542. t.replace(" - YouTube", "");
  543.  
  544. #ifdef YT_USE_YTSIG
  545. int ret = QMessageBox::question(this, tr("Problems with YouTube"),
  546. tr("Unfortunately due to changes in YouTube, the video '%1' can't be played.").arg(t) + "<br><br>" +
  547. tr("Do you want to update the YouTube code? This may fix the problem."),
  548. QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
  549. if (ret == QMessageBox::Yes) {
  550. updateYTCode();
  551. }
  552. #else
  553. QMessageBox::warning(this, tr("Problems with YouTube"),
  554. tr("Unfortunately due to changes in YouTube, the video '%1' can't be played.").arg(t) + "<br><br>" +
  555. tr("Maybe updating this application could fix the problem."));
  556. #endif
  557. }
  558.  
  559. #ifdef YT_USE_YTSIG
  560. void BrowserWindow::updateYTCode() {
  561. qDebug() << "BrowserWindow::updateYTCode";
  562.  
  563. if (!codedownloader) {
  564. codedownloader = new CodeDownloader(this);
  565. }
  566. codedownloader->saveAs(script_file);
  567. codedownloader->show();
  568. codedownloader->download(QUrl(URL_YT_CODE));
  569. }
  570. #endif
  571.  
  572. #ifdef SHOW_RELEASE_DIALOG
  573. void BrowserWindow::showAboutRelease() {
  574. QMessageBox::about(this, tr("About this release"),
  575. "<p>"+ tr("Due to changes in YouTube, the old SMTube doesn't work anymore.") + "<p>"+
  576. tr("This is a new version of SMTube, written from scratch.") +" "+
  577. tr("Some functionality is not available yet.")
  578. #ifdef YT_USE_YTSIG
  579. + "<p><b>"+ tr("Important:") + "</b><br>"+
  580. tr("If the VEVO videos fail to play, please use the option %1 in the Help menu.")
  581. .arg("<i><b>" + tr("Update the YouTube code") + "</b></i>")
  582. #endif
  583. );
  584. }
  585. #endif
  586.  
  587. void BrowserWindow::showAbout() {
  588. About d(this);
  589. d.exec();
  590. }
  591.  
  592. void BrowserWindow::showConfigDialog() {
  593. ConfigDialog d(this);
  594.  
  595. d.setPlaybackResolution(preferred_resolution);
  596. #ifdef USE_PLAYERS
  597. d.setPlayers(players.allPlayers());
  598. d.setDefaultPlayers(players.defaultPlayers());
  599. #endif
  600.  
  601. #ifdef D_BUTTON
  602. d.setAddDownloadButton(add_download_button);
  603. d.setExternalDownloadUrl(external_download_url);
  604. #endif
  605.  
  606. d.setDefaultFont(qApp->font());
  607.  
  608. #ifdef STYLE_SWITCHING
  609. d.setStyle(qApp->style()->objectName());
  610. #endif
  611.  
  612. if (d.exec() == QDialog::Accepted) {
  613. preferred_resolution = d.playbackResolution();
  614. #ifdef USE_PLAYERS
  615. players.setAllPlayers(d.players());
  616. view->setPlayers(players.availablePlayers());
  617. #endif
  618.  
  619. #ifdef D_BUTTON
  620. add_download_button = d.addDownloadButton();
  621. external_download_url = d.externalDownloadUrl();
  622. #endif
  623.  
  624. QFont new_font = d.defaultFont();
  625. if (qApp->font() != new_font) qApp->setFont(new_font);
  626.  
  627. #ifdef STYLE_SWITCHING
  628. setStyle(d.style());
  629. #endif
  630. }
  631. }
  632.  
  633. void BrowserWindow::saveConfig() {
  634. qDebug() << "BrowserWindow::saveConfig";
  635.  
  636. settings->beginGroup("window");
  637. settings->setValue("size", size());
  638. settings->setValue("pos", pos());
  639. settings->setValue("font", qApp->font().toString());
  640. #ifdef STYLE_SWITCHING
  641. settings->setValue("style", qApp->style()->objectName());
  642. #endif
  643. settings->endGroup();
  644.  
  645. settings->beginGroup("view");
  646. settings->setValue("toolbar", toggleToolbarAct->isChecked());
  647. settings->setValue("statusbar", toggleStatusbarAct->isChecked());
  648. settings->endGroup();
  649.  
  650. settings->beginGroup("General");
  651. settings->setValue("playback_resolution", preferred_resolution);
  652. settings->setValue("user_agent", ryu->userAgent());
  653. settings->setValue("use_https_main", ryu->useHttpsMain());
  654. //settings->setValue("use_https_vi", ryu->useHttpsVi());
  655.  
  656. #ifdef D_BUTTON
  657. settings->setValue("add_download_button", add_download_button);
  658. settings->setValue("external_download_url", external_download_url);
  659. #endif
  660.  
  661. settings->endGroup();
  662.  
  663. settings->beginGroup("browser");
  664. QWebSettings * ws = view->page()->settings();
  665. settings->setValue("plugins", ws->testAttribute(QWebSettings::PluginsEnabled));
  666. settings->setValue("javascript", ws->testAttribute(QWebSettings::JavascriptEnabled));
  667. settings->setValue("java", ws->testAttribute(QWebSettings::JavaEnabled));
  668. settings->setValue("images", ws->testAttribute(QWebSettings::AutoLoadImages));
  669. settings->setValue("developer_extras", ws->testAttribute(QWebSettings::DeveloperExtrasEnabled));
  670. settings->setValue("use_cookies", use_cookies);
  671. settings->setValue("minimum_font_size", ws->fontSize(QWebSettings::MinimumFontSize));
  672. settings->setValue("zoom", view->page()->mainFrame()->zoomFactor());
  673. settings->endGroup();
  674.  
  675. #ifdef USE_PLAYERS
  676. players.save(settings);
  677. #endif
  678. }
  679.  
  680. void BrowserWindow::loadConfig() {
  681. qDebug() << "BrowserWindow::loadConfig";
  682.  
  683. settings->beginGroup("window");
  684. resize(settings->value("size", QSize(650, 715)).toSize());
  685. move(settings->value("pos", pos()).toPoint());
  686. QFont f;
  687. QString current_font = qApp->font().toString();
  688. f.fromString(settings->value("font", current_font).toString());
  689. qApp->setFont(f);
  690.  
  691. #ifdef STYLE_SWITCHING
  692. setStyle(settings->value("style", "").toString());
  693. #endif
  694.  
  695. settings->endGroup();
  696.  
  697. if (!DesktopInfo::isInsideScreen(this)) {
  698. move(0,0);
  699. qWarning("BrowserWindow::loadConfig: window is outside of the screen, moved to 0x0");
  700. }
  701.  
  702. settings->beginGroup("view");
  703. toggleToolbarAct->setChecked(settings->value("toolbar", false).toBool());
  704. toggleStatusbarAct->setChecked(settings->value("statusbar", false).toBool());
  705. settings->endGroup();
  706.  
  707. settings->beginGroup("General");
  708. preferred_resolution = settings->value("playback_resolution", RetrieveYoutubeUrl::R360p).toInt();
  709. ryu->setUserAgent(settings->value("user_agent", "").toString());
  710. ryu->setUseHttpsMain(settings->value("use_https_main", false).toBool());
  711. //ryu->setUseHttpsVi(settings->value("use_https_vi", false).toBool());
  712.  
  713. #ifdef D_BUTTON
  714. add_download_button = settings->value("add_download_button", false).toBool();
  715.  
  716. QString default_url = "http://www.dlvyoutube.com/%YT_URL%";
  717. external_download_url = settings->value("external_download_url", default_url).toString();
  718. #endif
  719.  
  720. #ifdef SHOW_RELEASE_DIALOG
  721. bool shown_notes = settings->value("shown_notes", false).toBool();
  722. settings->setValue("shown_notes", true);
  723. #endif
  724. settings->endGroup();
  725.  
  726. settings->beginGroup("browser");
  727. QWebSettings * ws = view->page()->settings();
  728. ws->setAttribute(QWebSettings::PluginsEnabled, settings->value("plugins", false).toBool());
  729. ws->setAttribute(QWebSettings::JavascriptEnabled, settings->value("javascript", true).toBool());
  730. ws->setAttribute(QWebSettings::JavaEnabled, settings->value("java", false).toBool());
  731. ws->setAttribute(QWebSettings::AutoLoadImages, settings->value("images", true).toBool());
  732. ws->setAttribute(QWebSettings::DeveloperExtrasEnabled, settings->value("developer_extras", false).toBool());
  733. #ifndef PORTABLE_APP
  734. bool use_cache = settings->value("use_cache", true).toBool();
  735. #endif
  736. use_cookies = settings->value("use_cookies", use_cookies).toBool();
  737.  
  738. int current_font_size = ws->fontSize(QWebSettings::MinimumFontSize);
  739. int minimum_font_size = settings->value("minimum_font_size", current_font_size).toInt();
  740. ws->setFontSize(QWebSettings::MinimumFontSize, minimum_font_size);
  741.  
  742. qreal zoom = settings->value("zoom", 1).toReal();
  743. view->page()->mainFrame()->setZoomFactor(zoom);
  744.  
  745. settings->endGroup();
  746.  
  747. #ifndef PORTABLE_APP
  748. if (use_cache) {
  749. #if QT_VERSION >= 0x050000
  750. QString cache_path = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
  751. #else
  752. QString cache_path = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
  753. #endif
  754. qDebug() << "BrowserWindow::loadConfig: cache enabled. Location:" << cache_path;
  755. QWebSettings::enablePersistentStorage(cache_path);
  756. }
  757. #endif
  758.  
  759. SupportedUrls::load();
  760.  
  761. #ifdef USE_PLAYERS
  762. players.load(settings);
  763. view->setPlayers(players.availablePlayers());
  764. #else
  765. view->setPlayer(HCPLAYER_NAME);
  766. #endif
  767.  
  768. #ifdef SHOW_RELEASE_DIALOG
  769. if (!shown_notes) {
  770. QTimer::singleShot(3000, this, SLOT(showAboutRelease()));
  771. }
  772. #endif
  773. }
  774.  
  775. #ifdef STYLE_SWITCHING
  776. void BrowserWindow::setStyle(QString style) {
  777. if (style.isEmpty()) style = default_style;
  778. QString current_style = qApp->style()->objectName();
  779. if (!style.isEmpty() && style != current_style) {
  780. qDebug() << "BrowserWindow::setStyle:" << style;
  781. //qApp->setStyleSheet("");
  782. qApp->setStyle(style);
  783. #ifdef Q_OS_WIN
  784. qApp->setPalette(qApp->style()->standardPalette());
  785. #endif
  786. }
  787. }
  788. #endif
  789.  
  790. #include "moc_browserwindow.cpp"
Add Comment
Please, Sign In to add comment