class App(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.setUpStuff() def setUpStuff(self): self.webView = QWebEngineView() self.webView.load(QUrl('http://youtube.com')) self.webView.setBaseSize(500, 500) self.webView.setVisible(True) self.gridLayout.addWidget(self.webView, 1, 0, 1, 2) self.webView.installEventFilter(self) self.getActualURL() self.downloadButton.clicked.connect(self.youtubeDownload) self.setURL.clicked.connect(self.setURLm) self.getActualURL() def getActualURL(self): print("getactualurl") i = self.webView.url() print(i) i = str(i) i = i[19:] ilen = i.__len__() url = i[:ilen - 2] print(url) self.urlInput.setText(url) @pyqtSlot() def youtubeDownload(self): self.getActualURL() print("ytdownload") try: with youtube_dl.YoutubeDL({}) as ydl: dirname = os.path.split(os.path.abspath(__file__)) path = dirname[0] + "\\Downloads" print("script: __file__ is", path) if not os.path.exists(path): os.makedirs(path) os.chdir(path) ydl.download([str(self.urlInput.displayText())]) except: msgBox = QMessageBox() msgBox.setText("Error:") msgBox.setInformativeText( "An unknown error occurred. Ensure video link is correct") msgBox.setStandardButtons(QMessageBox.Ok) msgBox.setDefaultButton(QMessageBox.Ok) msgBox.exec_() @pyqtSlot() def setURLm(self): print("seturlm") try: shortcut = False url = self.urlInput.displayText() i7 = url[:7] i8 = url[:8] if (i7 == "http://" or i8 == "https://"): pass else: url = "http://" + url print(url) self.webView.load(QUrl(url)) except: pass def eventFilter(self, obj, event): #if(obj == self.webView): self.getActualURL() if event.type() == QtCore.QEvent.MouseButtonPress: print("t") #in (QtCore.QEvent.MouseButtonPress,QtCore.QEvent.MouseButtonDblClick): if event.button() == QtCore.Qt.LeftButton: print("left") if event.button() == QtCore.Qt.ExtraButton1: self.webView.back() if event.button() == QtCore.Qt.ExtraButton2: self.webView.forward() return QtGui.QWidget.eventFilter(self, obj, event)
class Browser(QWidget): def __init__(self): super().__init__() # Create a search url widget self.search_url = QLineEdit() self.search_url.setStyleSheet( "background-color:black; color:white; border-radius:14px; margin:0px,10px,0px,10px; border:2px solid grey; padding: 2px 10px 2px 10px; font-weight:bold;" ) self.search_url.setFont(QtGui.QFont("sans-serif", 11)) self.search_url.setPlaceholderText("Search in Google or Type a URL") self.search_url.setMinimumWidth(500) self.search_url.returnPressed.connect(self.webb) self.search_url.setEnabled(True) self.search_url.setAlignment(Qt.AlignCenter) # Create a vbox vbox = QVBoxLayout() # Back Button self.back_button = QPushButton() self.back_button.setIcon(self.style().standardIcon( QStyle.SP_ArrowBack)) self.back_button.setEnabled(False) self.back_button.clicked.connect(self.go_back) # forword Button self.forword_button = QPushButton() self.forword_button.setIcon(self.style().standardIcon( QStyle.SP_ArrowForward)) self.forword_button.clicked.connect(self.go_fast) # Reload Button self.reload_button = QPushButton() self.reload_button.setIcon(self.style().standardIcon( QStyle.SP_BrowserReload)) self.reload_button.clicked.connect(self.go_reload_buton) # Reload Button self.stop_button = QPushButton() self.stop_button.setIcon(self.style().standardIcon( QStyle.SP_BrowserStop)) self.stop_button.setEnabled(False) self.stop_button.clicked.connect(self.go_stop_button) # Create a Hbox hbox = QHBoxLayout() hbox.addWidget(self.back_button) hbox.addWidget(self.forword_button) hbox.addWidget(self.reload_button) hbox.addWidget(self.stop_button) hbox.addWidget(self.search_url) self.web = QWebEngineView() self.web.load(QUrl(f"https://google.com/")) self.web.show() vbox.addLayout(hbox) vbox.addWidget(self.web) self.setLayout(vbox) self.show() def webb(self): self.stop_button.setEnabled(True) self.back_button.setEnabled(True) if 'http://' or 'https://' not in self.search_url: self.web.load(QUrl(f"https://{self.search_url.text()}/")) self.web.show() else: self.web.load(QUrl(self.search_url.text())) self.web.show() def go_back(self): self.web.back() def go_fast(self): self.web.forward() def go_reload_buton(self): self.web.reload() def go_stop_button(self): self.web.stop()
class MainWidget(QWidget): def __init__(self, url): super().__init__() fontDB = QFontDatabase() fontDB.addApplicationFont(':/mono-font') # fontDB.addApplicationFont(':/Taipei-font') screen = QDesktopWidget().screenGeometry() self.width, self.height = screen.width(), screen.height() self.html = '' self.url = url self.GI = None self.DL = None self.web_view = QWebEngineView(self) self.web_view.load(QUrl(self.url)) self.web_view.page().titleChanged.connect(self.get_html) btnExit = QPushButton('', self) btnExit.setIcon(QIcon(':/exit-icon')) btnExit.setIconSize(QSize(32, 32)) btnExit.setToolTip('Exit') btnExit.clicked.connect(QApplication.quit) self.btnHome = QPushButton('', self) self.btnHome.setIcon(QIcon(':/home-icon')) self.btnHome.setIconSize(QSize(32, 32)) self.btnHome.setToolTip('Home') self.btnHome.clicked.connect(self.goHome) self.btnBack = QPushButton('', self) self.btnBack.setIcon(QIcon(':/go_back-icon')) self.btnBack.setIconSize(QSize(32, 32)) self.btnBack.setToolTip('Backward') self.btnBack.clicked.connect(self.goBack) self.btnBack.setDisabled(True) self.btnNext = QPushButton('', self) self.btnNext.setIcon(QIcon(':/go_forward-icon')) self.btnNext.setIconSize(QSize(32, 32)) self.btnNext.setToolTip('Forward') self.btnNext.clicked.connect(self.goForward) self.btnNext.setDisabled(True) self.cmbDownList = QComboBox(self) self.cmbDownList.setMinimumHeight(40) # font = self.cmbDownList.font() font = QFont('Liberation Mono') font.setPointSize(14) self.cmbDownList.setFont(font) self.cmbDownList.setIconSize(QSize(24, 24)) self.cmbDownList.currentIndexChanged.connect(self.onIndexChanged) self.cmbDownList.setToolTip('Select a stream to download') self.cmbCapsList = QComboBox(self) self.cmbCapsList.setMinimumHeight(40) # font = QFont('Taipei Sans TC Beta') font = self.cmbCapsList.font() font.setPointSize(14) self.cmbCapsList.setFont(font) self.cmbCapsList.setToolTip('Select a caption/subtitle to download') btnSettings = QPushButton('', self) btnSettings.setIcon(QIcon(':/settings-icon')) btnSettings.setIconSize(QSize(32, 32)) btnSettings.setToolTip('Settings') btnSettings.clicked.connect(self.onSettings) self.btnDLoad = QPushButton('', self) self.btnDLoad.setIcon(QIcon(':/download-icon')) self.btnDLoad.setIconSize(QSize(32, 32)) self.btnDLoad.setToolTip('Download') self.btnDLoad.clicked.connect(self.goDownload) self.btnDLoad.setDisabled(True) self.progressBar = QProgressBar(self) self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) hBox1 = QHBoxLayout() hBox1.addWidget(btnExit, 0) hBox1.addWidget(self.btnHome, 0) hBox1.addWidget(self.btnBack, 0) hBox1.addWidget(self.btnNext, 0) hBox1.addWidget(self.cmbDownList, 1) hBox1.addWidget(self.cmbCapsList, 0) hBox1.addWidget(btnSettings, 0) hBox1.addWidget(self.btnDLoad, 0) vBox = QVBoxLayout() vBox.addLayout(hBox1) vBox.addWidget(self.web_view) vBox.addWidget(self.progressBar) self.setLayout(vBox) self.setWindowTitle('Youtube Download Helper') self.setGeometry(QRect(round((self.width - 760) / 2), round((self.height - 550) / 2), 760, 550)) self.setMinimumSize(QSize(760, 550)) def store_html(self, html): # print('store_html()') self.html = html if self.web_view.page().action(QWebEnginePage.Back).isEnabled(): self.btnBack.setEnabled(True) else: self.btnBack.setDisabled(True) if self.web_view.page().action(QWebEnginePage.Forward).isEnabled(): self.btnNext.setEnabled(True) else: self.btnNext.setDisabled(True) if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com': # print(self.web_view.title()) self.btnHome.setEnabled(True) else: self.btnHome.setDisabled(True) self.cmbDownList.clear() self.cmbCapsList.clear() url = self.web_view.page().url().url() if 'video-id' in self.html and '?v=' in url: # fp = open(self.web_view.title() + '.html', 'w') # fp.write(self.html) # fp.close() self.GI = GetItem(url) self.GI.addItem.connect(self.onAddItem) self.GI.addCaption.connect(self.onAddCaption) self.GI.finished.connect(self.onAddItemFinished) self.GI.start() else: self.btnDLoad.setDisabled(True) def get_html(self): # print('get_html') self.web_view.page().toHtml(self.store_html) def goHome(self): self.web_view.setUrl(QUrl(self.url)) def goBack(self): self.web_view.back() def goForward(self): self.web_view.forward() def goDownload(self): global download_ongoing download_ongoing = True self.btnDLoad.setDisabled(True) self.progressBar.setValue(0) self.DL = DownLoad(self.web_view.page().url().url(), self.cmbDownList.currentIndex(), self.cmbCapsList.currentIndex()) self.DL.valueChanged.connect(self.onValueChanged) self.DL.dlCompleted.connect(self.onDlCompleted) self.DL.start() def onAddItem(self, icon, item): self.cmbDownList.addItem(QIcon(icon), item) def onAddCaption(self, cap): self.cmbCapsList.addItem(cap) def onAddItemFinished(self): if not download_ongoing: self.btnDLoad.setEnabled(True) def onValueChanged(self, per): self.progressBar.setValue(round(per)) # print('%.2f%% completed' % per) def onDlCompleted(self): global download_ongoing download_ongoing = False self.btnDLoad.setDisabled(True) self.progressBar.setValue(0) def onIndexChanged(self): if not download_ongoing: self.btnDLoad.setEnabled(True) def onSettings(self): sWnd = SettingsDlg(self.width, self.height) sWnd.exec() if sWnd.SettingsChanged: # print('Settings saved!') if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com': self.web_view.reload()