def __init__(self, parent): super().__init__(parent) self.setWindowFlag(Qt.Window) self.setWindowFlag(Qt.WindowStaysOnTopHint) self.setWindowTitle("Add New Exercise") self.setWindowModality(Qt.WindowModal) self.setLayout(QFormLayout()) self.label_name = QLabel("Exercise Name:", self) self.line_edit_name = QLineEdit(self) self.layout().addRow(self.label_name, self.line_edit_name) self.label_measures = QLabel("Number of Measures:", self) self.spin_box_measures = QSpinBox(self) self.min, self.max = 0, 5 self.spin_box_measures.setRange(self.min, self.max) self.spin_box_measures.valueChanged.connect( self.change_visibility_measure_widgets) self.layout().addRow(self.label_measures, self.spin_box_measures) self.labels_measure_type = [] self.comboboxes_type = [] self.labels_measure_name = [] self.line_edits_measure_name = [] for i in range(self.min, self.max): label_measure_type = QLabel(f"Type of Measure {i + 1}:", self) self.labels_measure_type.append(label_measure_type) combobox_type = QComboBox(self) self.comboboxes_type.append(combobox_type) self.layout().addRow(label_measure_type, combobox_type) combobox_type.hide() label_measure_type.hide() label_measure_name = QLabel(f"Name of Measure {i + 1}:", self) self.labels_measure_name.append(label_measure_name) line_edit_measure_name = QLineEdit(self) self.line_edits_measure_name.append(line_edit_measure_name) self.layout().addRow(label_measure_name, line_edit_measure_name) label_measure_name.hide() line_edit_measure_name.hide() self.button_discard = QPushButton("Discard Exercise", self) self.button_discard.clicked.connect(self.button_discard_action) self.button_add = QPushButton("Add Exercise", self) self.button_add.clicked.connect(self.button_add_action) self.layout().addRow(self.button_discard, self.button_add)
class JobsWindow(QWidget): def __init__(self): super().__init__() self.quit_button = QPushButton("Quit", self) self.update_button = QPushButton("Update Data", self) self.enter_data = QPushButton("Enter Data", self) self.data_button = QPushButton("Run Data Visualization", self) self.back_button = QPushButton("Back", self) self.text_visualization_button = QPushButton("Text Visualization", self) self.map_visualization = QPushButton("Map Visualization", self) self.order_selector_text = QComboBox(self) self.data_selector_map = QComboBox(self) self.data_visualization_label = QLabel("Welcome to data visualization!", self) self.welcome_label = QLabel("Welcome to Jobs data Visualization.", self) self.list_control = None self.update_label_01 = QLabel("", self) self.update_label_02 = QLabel("", self) self.update_label_03 = QLabel("", self) self.update_label_04 = QLabel("", self) self.update_label_05 = QLabel("", self) self.update_label_06 = QLabel("", self) self.update_label_07 = QLabel("", self) self.update_label_08 = QLabel("", self) self.excel_label = QLabel("Excel Spreadsheet:", self) self.update_information = QLabel( "If you would like to update a single entry please select the table and enter all of its information.\n" "If you would like to import from a spreadsheet type it into the box on the right and select the table.\n" "When you are ready with which ever function press Enter Data.\n" "For any data you want to append make sure the id is None.\n" "Also only work from one method at a time and make sure he other is empty.", self) self.table_selection = QComboBox(self) self.update_box_01 = QLineEdit(self) self.update_box_02 = QLineEdit(self) self.update_box_03 = QLineEdit(self) self.update_box_04 = QLineEdit(self) self.update_box_05 = QLineEdit(self) self.update_box_06 = QLineEdit(self) self.update_box_07 = QLineEdit(self) self.update_box_08 = QLineEdit(self) self.update_excel_selection = QLineEdit(self) self.list_control = None self.setup_window() def setup_window(self): self.setWindowTitle("Jobs Window") display_list = QListWidget(self) self.list_control = display_list display_list.resize(500, 350) self.setGeometry(50, 50, 500, 500) self.quit_button.clicked.connect(QApplication.instance().quit) self.quit_button.resize(self.quit_button.sizeHint()) self.quit_button.move(415, 450) self.update_button.clicked.connect(self.update_data) self.update_button.move(200, 200) self.data_button.clicked.connect(self.run_data_visualization) self.data_button.move(175, 250) self.back_button.clicked.connect(self.go_back) self.back_button.move(25, 450) self.data_visualization_label.move(20, 400) self.text_visualization_button.move(400 - self.text_visualization_button.width(), 600) self.order_selector_text.move(self.text_visualization_button.x(), self.text_visualization_button.y()+self.text_visualization_button.height()+10) self.text_visualization_button.clicked.connect(self.text_visualization) self.map_visualization.move(self.text_visualization_button.x() + self.text_visualization_button.width(), self.text_visualization_button.y()) self.data_selector_map.move(self.map_visualization.x(), self.map_visualization.y()+self.map_visualization.height()+10) self.map_visualization.clicked.connect(self.run_map_visualization) self.welcome_label.move(150, 150) self.update_box_01.move(150, 30) self.update_box_02.move(150, 60) self.update_box_03.move(150, 90) self.update_box_04.move(150, 120) self.update_box_05.move(150, 150) self.update_box_06.move(150, 180) self.update_box_07.move(150, 210) self.update_box_08.move(150, 240) self.excel_label.move(340, 70) self.update_excel_selection.move(340, 90) self.update_information.move(25, 325) self.update_label_01.setGeometry(5, 30, 145, 20) self.update_label_02.setGeometry(5, 60, 145, 20) self.update_label_03.setGeometry(5, 90, 145, 20) self.update_label_04.setGeometry(5, 120, 145, 20) self.update_label_05.setGeometry(5, 150, 145, 20) self.update_label_06.setGeometry(5, 180, 145, 20) self.update_label_07.setGeometry(5, 210, 145, 20) self.update_label_08.setGeometry(5, 240, 145, 20) self.table_selection.setGeometry(10, 10, 145, 20) self.enter_data.move(10, 260) self.enter_data.clicked.connect(self.import_data) self.table_selection.addItem("---") self.table_selection.addItem("Schools") self.table_selection.addItem("Jobs") self.order_selector_text.addItem("---") self.order_selector_text.addItem("ASC") self.order_selector_text.addItem("DESC") self.data_selector_map.addItem("---") self.data_selector_map.addItem("Employment to Graduates") self.data_selector_map.addItem("Average Salary to Average Declining Balance Percent") self.table_selection.currentIndexChanged.connect(self.update_selection) self.hidden_at_start() self.show() def hidden_at_start(self): self.hide_update_boxes() self.list_control.hide() self.update_information.hide() self.map_visualization.hide() self.text_visualization_button.hide() self.data_visualization_label.hide() self.back_button.hide() self.table_selection.hide() self.enter_data.hide() self.update_excel_selection.hide() self.excel_label.hide() self.data_selector_map.hide() self.order_selector_text.hide() def hide_update_boxes(self): self.update_box_01.hide() self.update_box_02.hide() self.update_box_03.hide() self.update_box_04.hide() self.update_box_05.hide() self.update_box_06.hide() self.update_box_07.hide() self.update_box_08.hide() self.update_label_01.setText("") self.update_label_02.setText("") self.update_label_03.setText("") self.update_label_04.setText("") self.update_label_05.setText("") self.update_label_06.setText("") self.update_label_07.setText("") self.update_label_08.setText("") def update_data(self): self.update_button.hide() self.data_button.hide() self.back_button.show() self.welcome_label.hide() self.table_selection.show() self.enter_data.show() self.update_information.show() self.update_excel_selection.show() self.excel_label.show() def update_selection(self): self.hide_update_boxes() if self.table_selection.currentText() == "Jobs": self.update_box_01.show() self.update_label_01.setText("jobs_id") self.update_box_02.show() self.update_label_02.setText("state_name") self.update_box_03.show() self.update_label_03.setText("occupation_code") self.update_box_04.show() self.update_label_04.setText("tittle") self.update_box_05.show() self.update_label_05.setText("employment") self.update_box_06.show() self.update_label_06.setText("salary_25th_percentile") elif self.table_selection.currentText() == "Schools": self.update_box_01.show() self.update_label_01.setText("school_id") self.update_box_02.show() self.update_label_02.setText("name") self.update_box_03.show() self.update_label_03.setText("state_abrev") self.update_box_04.show() self.update_label_04.setText("size_2017") self.update_box_05.show() self.update_label_05.setText("size_2018") self.update_box_06.show() self.update_label_06.setText("earnings") self.update_box_07.show() self.update_label_07.setText("repayment_overall") self.update_box_08.show() self.update_label_08.setText("repayment_cohort") def import_data(self): if self.update_excel_selection.text() == "": if self.table_selection.currentText() == "Jobs": information_to_update = [self.update_box_01.text(), self.update_box_02.text(), self.update_box_03.text(), self.update_box_04.text(), self.update_box_05.text(), self.update_box_06.text()] jobs.update_data_from_list(information_to_update, "Jobs", "jobs_db.sqlite") elif self.table_selection.currentText() == "Schools": information_to_update = [self.update_box_01.text(), self.update_box_02.text(), self.update_box_03.text(), self.update_box_04.text(), self.update_box_05.text(), self.update_box_06.text(), self.update_box_07.text(), self.update_box_08.text()] jobs.update_data_from_list(information_to_update, "Schools", "jobs_db.sqlite") else: if self.table_selection.currentText() == "Jobs": jobs.update_data_from_excel(self.update_excel_selection.text(), "Jobs", "jobs_db.sqlite") elif self.table_selection.currentText() == "Schools": jobs.update_data_from_excel(self.update_excel_selection.text(), "Jobs", "jobs_db.sqlite") def run_data_visualization(self): self.update_button.hide() self.data_button.hide() self.data_visualization_label.show() self.back_button.show() self.setGeometry(50, 50, 800, 800) self.back_button.move(25, 750) self.quit_button.move(715, 750) self.welcome_label.hide() self.map_visualization.show() self.text_visualization_button.show() self.data_selector_map.show() self.order_selector_text.show() def go_back(self): self.back_button.hide() self.update_button.show() self.data_button.show() self.data_visualization_label.hide() self.setGeometry(50, 50, 500, 500) self.back_button.move(25, 450) self.quit_button.move(415, 450) self.welcome_label.show() self.hidden_at_start() def text_visualization(self): self.list_control.clear() conn, cursor = jobs.open_db("jobs_db.sqlite") if self.order_selector_text.currentText() == "ASC": data_visualization_per_state = jobs.query_run('''SELECT state_abrev, state_name, ''' + ''' total(jobs.employment) as employment, total(school.size_2018/4), round(avg(school.repayment_cohort),3) as repayment_cohort, round(avg(jobs.salary_25th_percentile)) as averge_entry_salary FROM school JOIN states using(state_abrev) JOIN jobs using(state_name) GROUP BY state_name ORDER BY employment ASC;''', cursor) elif self.order_selector_text.currentText() == "DESC": data_visualization_per_state = jobs.query_run('''SELECT state_abrev, state_name, ''' + ''' total(jobs.employment) as employment, total(school.size_2018/4), round(avg(school.repayment_cohort),3) as repayment_cohort, round(avg(jobs.salary_25th_percentile)) as averge_entry_salary FROM school JOIN states using(state_abrev) JOIN jobs using(state_name) GROUP BY state_name ORDER BY employment DESC;''', cursor) else: data_visualization_per_state = jobs.query_run('''SELECT state_abrev, state_name, ''' + ''' total(jobs.employment) as employment, total(school.size_2018/4), round(avg(school.repayment_cohort),3) as repayment_cohort, round(avg(jobs.salary_25th_percentile)) as averge_entry_salary FROM school JOIN states using(state_abrev) JOIN jobs using(state_name) GROUP BY state_name ;''', cursor) QListWidgetItem("State", listview=self.list_control) for state in data_visualization_per_state: state_display_data = f"{state[0]}, {state[1]}" grad_employ_data = f"Employment/Graduates: {state[2]/state[3]}" repayment_data = f"Average Entry Salary/Average Declining Balance Percent: {state[5]/state[4]}" state_item = QListWidgetItem(state_display_data, listview=self.list_control) grad_item = QListWidgetItem(grad_employ_data, listview=self.list_control) repayment_item = QListWidgetItem(repayment_data, listview=self.list_control) grad_item.setForeground(Qt.darkGreen) repayment_item.setForeground(Qt.blue) state_item.setForeground(Qt.white) state_item.setBackground(Qt.black) self.list_control.show() jobs.close_db(conn) def run_map_visualization(self): conn, cursor = jobs.open_db("jobs_db.sqlite") data_visualization_per_state = jobs.query_run('''SELECT state_abrev, state_name, ''' + ''' total(jobs.employment) as employment, total(school.size_2018/4), round(avg(school.repayment_cohort),3) as repayment_cohort, round(avg(jobs.salary_25th_percentile)) as averge_entry_salary FROM school JOIN states using(state_abrev) JOIN jobs using(state_name) GROUP BY state_name ;''', cursor) state_abrev = [] state_grads = [] state_repayment = [] for state in data_visualization_per_state: state_abrev.append(state[0]) state_grads.append(state[2]/state[3]) state_repayment.append(state[5]/state[4]) if self.data_selector_map.currentText() == "Graduates to Employment": us_map = px.Figure(data=px.Choropleth(locations=state_abrev, z=state_grads, locationmode='USA-states', colorbar_title="Employment/Graduates" )) us_map.update_layout(geo_scope='usa', title_text='Employment VS Graduates By State') us_map.show() elif self.data_selector_map.currentText() == "Average Declining Balance Percent": us_map = px.Figure(data=px.Choropleth(locations=state_abrev, z=state_repayment, locationmode='USA-states', colorbar_title="Salary/Average Percent" )) us_map.update_layout(geo_scope='usa', title_text='Average Salary VS Average ' 'Percent of People with Declining Loans') us_map.show() else: us_map = px.Figure(data=px.Choropleth(locations=state_abrev, z=state_grads, locationmode='USA-states', colorbar_title="Graduates" )) us_map.update_layout(geo_scope='usa', title_text='Graduates By State') us_map.show() jobs.close_db(conn) self.list_control.hide()
class VideoFinderAddLink(AddLinkWindow): running_thread = None threadPool = {} def __init__(self, parent, receiver_slot, settings, video_dict={}): super().__init__(parent, receiver_slot, settings, video_dict) self.setWindowTitle( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Video Finder')) self.size_label.hide() # empty lists for no_audio and no_video and video_audio files self.no_audio_list = [] self.no_video_list = [] self.video_audio_list = [] self.media_title = '' # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # extension_label self.extension_label = QLabel(self.link_frame) self.change_name_horizontalLayout.addWidget(self.extension_label) # Fetch Button self.url_submit_pushButtontton = QPushButton(self.link_frame) self.link_horizontalLayout.addWidget(self.url_submit_pushButtontton) # Status Box self.status_box_textEdit = QTextEdit(self.link_frame) self.status_box_textEdit.setMaximumHeight(150) self.link_verticalLayout.addWidget(self.status_box_textEdit) # Select format horizontal layout select_format_horizontalLayout = QHBoxLayout() # Selection Label self.select_format_label = QLabel(self.link_frame) select_format_horizontalLayout.addWidget(self.select_format_label) # Selection combobox self.media_comboBox = QComboBox(self.link_frame) self.media_comboBox.setMinimumWidth(200) select_format_horizontalLayout.addWidget(self.media_comboBox) # Duration label self.duration_label = QLabel(self.link_frame) select_format_horizontalLayout.addWidget(self.duration_label) self.format_selection_frame = QFrame(self) self.format_selection_frame.setLayout(select_format_horizontalLayout) self.link_verticalLayout.addWidget(self.format_selection_frame) # advanced_format_selection_checkBox self.advanced_format_selection_checkBox = QCheckBox(self) self.link_verticalLayout.addWidget( self.advanced_format_selection_checkBox) # advanced_format_selection_frame self.advanced_format_selection_frame = QFrame(self) self.link_verticalLayout.addWidget( self.advanced_format_selection_frame) advanced_format_selection_horizontalLayout = QHBoxLayout( self.advanced_format_selection_frame) # video_format_selection self.video_format_selection_label = QLabel( self.advanced_format_selection_frame) self.video_format_selection_comboBox = QComboBox( self.advanced_format_selection_frame) # audio_format_selection self.audio_format_selection_label = QLabel( self.advanced_format_selection_frame) self.audio_format_selection_comboBox = QComboBox( self.advanced_format_selection_frame) for widget in [ self.video_format_selection_label, self.video_format_selection_comboBox, self.audio_format_selection_label, self.audio_format_selection_comboBox ]: advanced_format_selection_horizontalLayout.addWidget(widget) # Set Texts self.url_submit_pushButtontton.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Fetch Media List')) self.select_format_label.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Select a format')) self.video_format_selection_label.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Video format:')) self.audio_format_selection_label.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Audio format:')) self.advanced_format_selection_checkBox.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Advanced options')) # Add Slot Connections self.url_submit_pushButtontton.setEnabled(False) self.change_name_lineEdit.setEnabled(False) self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) self.format_selection_frame.setEnabled(True) self.advanced_format_selection_frame.setEnabled(False) self.advanced_format_selection_checkBox.toggled.connect( self.advancedFormatFrame) self.url_submit_pushButtontton.clicked.connect(self.submitClicked) self.media_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'video_audio')) self.video_format_selection_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'video')) self.audio_format_selection_comboBox.activated.connect( partial(self.mediaSelectionChanged, 'audio')) self.link_lineEdit.textChanged.disconnect( super().linkLineChanged) # Should be disconnected. self.link_lineEdit.textChanged.connect(self.linkLineChangedHere) self.setMinimumSize(650, 480) self.status_box_textEdit.hide() self.format_selection_frame.hide() self.advanced_format_selection_frame.hide() self.advanced_format_selection_checkBox.hide() if 'link' in video_dict.keys() and video_dict['link']: self.link_lineEdit.setText(video_dict['link']) self.url_submit_pushButtontton.setEnabled(True) else: # check clipboard clipboard = QApplication.clipboard() text = clipboard.text() if (("tp:/" in text[2:6]) or ("tps:/" in text[2:7])): self.link_lineEdit.setText(str(text)) self.url_submit_pushButtontton.setEnabled(True) def advancedFormatFrame(self, button): if self.advanced_format_selection_checkBox.isChecked(): self.advanced_format_selection_frame.setEnabled(True) self.format_selection_frame.setEnabled(False) self.mediaSelectionChanged( 'video', int(self.video_format_selection_comboBox.currentIndex())) else: self.advanced_format_selection_frame.setEnabled(False) self.format_selection_frame.setEnabled(True) self.mediaSelectionChanged('video_audio', int(self.media_comboBox.currentIndex())) def getReadableSize(self, size): try: return '{:1.2f} MB'.format(int(size) / 1048576) except: return str(size) def getReadableDuration(self, seconds): try: seconds = int(seconds) hours = seconds // 3600 seconds = seconds % 3600 minutes = seconds // 60 seconds = seconds % 60 return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds) except: return str(seconds) # Define native slots def urlChanged(self, value): if ' ' in value or value == '': self.url_submit_pushButtontton.setEnabled(False) self.url_submit_pushButtontton.setToolTip( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Please enter a valid video link')) else: self.url_submit_pushButtontton.setEnabled(True) self.url_submit_pushButtontton.setToolTip('') def submitClicked(self, button=None): # Clear media list self.media_comboBox.clear() self.format_selection_frame.hide() self.advanced_format_selection_checkBox.hide() self.advanced_format_selection_frame.hide() self.video_format_selection_comboBox.clear() self.audio_format_selection_comboBox.clear() self.change_name_lineEdit.clear() self.threadPool.clear() self.change_name_checkBox.setChecked(False) self.video_audio_list.clear() self.no_video_list.clear() self.no_audio_list.clear() self.url_submit_pushButtontton.setEnabled(False) self.status_box_textEdit.setText( QCoreApplication.translate("ytaddlink_src_ui_tr", 'Fetching Media Info...')) self.status_box_textEdit.show() self.ok_pushButton.setEnabled(False) self.download_later_pushButton.setEnabled(False) dictionary_to_send = deepcopy(self.plugin_add_link_dictionary) # More options more_options = self.collectMoreOptions() for k in more_options.keys(): dictionary_to_send[k] = more_options[k] dictionary_to_send['link'] = self.link_lineEdit.text() fetcher_thread = MediaListFetcherThread(self.fetchedResult, dictionary_to_send, self) self.parent.threadPool.append(fetcher_thread) self.parent.threadPool[len(self.parent.threadPool) - 1].start() def fileNameChanged(self, value): if value.strip() == '': self.ok_pushButton.setEnabled(False) def mediaSelectionChanged(self, combobox, index): try: if combobox == 'video_audio': if self.media_comboBox.currentText() == 'Best quality': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[-1]['ext']) else: self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText( '.' + self.video_audio_list[index]['ext']) self.change_name_checkBox.setChecked(True) elif combobox == 'video': if self.video_format_selection_comboBox.currentText( ) != 'No video': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[index - 1]['ext']) self.change_name_checkBox.setChecked(True) else: if self.audio_format_selection_comboBox.currentText( ) != 'No audio': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_video_list[ int(self.audio_format_selection_comboBox. currentIndex()) - 1]['ext']) self.change_name_checkBox.setChecked(True) else: self.change_name_lineEdit.setChecked(False) elif combobox == 'audio': if self.audio_format_selection_comboBox.currentText( ) != 'No audio' and self.video_format_selection_comboBox.currentText( ) == 'No video': self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_video_list[index - 1]['ext']) self.change_name_checkBox.setChecked(True) elif (self.audio_format_selection_comboBox.currentText() == 'No audio' and self.video_format_selection_comboBox.currentText() != 'No video') or ( self.audio_format_selection_comboBox.currentText() != 'No audio' and self.video_format_selection_comboBox.currentText() != 'No video'): self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[ int(self.video_format_selection_comboBox.currentIndex( )) - 1]['ext']) self.change_name_checkBox.setChecked(True) elif self.audio_format_selection_comboBox.currentText( ) == 'No audio' and self.video_format_selection_comboBox.currentText( ) == 'No video': self.change_name_checkBox.setChecked(False) except Exception as ex: logger.sendToLog(ex, "ERROR") def fetchedResult(self, media_dict): self.url_submit_pushButtontton.setEnabled(True) if 'error' in media_dict.keys(): self.status_box_textEdit.setText('<font color="#f11">' + str(media_dict['error']) + '</font>') self.status_box_textEdit.show() else: # Show the media list # add no audio and no video options to the comboboxes self.video_format_selection_comboBox.addItem('No video') self.audio_format_selection_comboBox.addItem('No audio') self.media_title = media_dict['title'] if 'formats' not in media_dict.keys( ) and 'entries' in media_dict.keys(): formats = media_dict['entries'] formats = formats[0] media_dict['formats'] = formats['formats'] elif 'formats' not in media_dict.keys( ) and 'format' in media_dict.keys(): media_dict['formats'] = [media_dict.copy()] try: i = 0 for f in media_dict['formats']: no_audio = False no_video = False text = '' if 'acodec' in f.keys(): # only video, no audio if f['acodec'] == 'none': no_audio = True # resolution if 'height' in f.keys(): text = text + ' ' + '{}p'.format(f['height']) if 'vcodec' in f.keys(): # if f['vcodec'] == 'none' and f['acodec'] != 'none': # continue # No video, show audio bit rate if f['vcodec'] == 'none': text = text + '{}kbps'.format(f['abr']) no_video = True if 'ext' in f.keys(): text = text + ' ' + '.{}'.format(f['ext']) if 'filesize' in f.keys() and f['filesize']: # Youtube api does not supply file size for some formats, so check it. text = text + ' ' + '{}'.format( self.getReadableSize(f['filesize'])) else: # Start spider to find file size input_dict = deepcopy(self.plugin_add_link_dictionary) input_dict['link'] = f['url'] more_options = self.collectMoreOptions() for key in more_options.keys(): input_dict[key] = more_options[key] size_fetcher = FileSizeFetcherThread(input_dict, i) self.threadPool[str(i)] = { 'thread': size_fetcher, 'item_id': i } self.parent.threadPool.append(size_fetcher) self.parent.threadPool[len(self.parent.threadPool) - 1].start() self.parent.threadPool[len(self.parent.threadPool) - 1].FOUND.connect( self.findFileSize) # Add current format to the related comboboxes if no_audio: self.no_audio_list.append(f) self.video_format_selection_comboBox.addItem(text) elif no_video: self.no_video_list.append(f) self.audio_format_selection_comboBox.addItem(text) else: self.video_audio_list.append(f) self.media_comboBox.addItem(text) i = i + 1 self.status_box_textEdit.hide() if 'duration' in media_dict.keys(): self.duration_label.setText( 'Duration ' + self.getReadableDuration(media_dict['duration'])) self.format_selection_frame.show() self.advanced_format_selection_checkBox.show() self.advanced_format_selection_frame.show() self.ok_pushButton.setEnabled(True) self.download_later_pushButton.setEnabled(True) # if we have no options for separate audio and video, then hide advanced_format_selection... if len(self.no_audio_list) == 0 and len( self.no_video_list) == 0: self.advanced_format_selection_checkBox.hide() self.advanced_format_selection_frame.hide() # set index of comboboxes on best available quality. # we have both audio and video if len(self.no_audio_list) != 0 and len( self.no_video_list) != 0: self.media_comboBox.addItem('Best quality') self.media_comboBox.setCurrentIndex( len(self.video_audio_list)) self.change_name_lineEdit.setText(self.media_title) self.extension_label.setText('.' + self.no_audio_list[-1]['ext']) self.change_name_checkBox.setChecked(True) # video and audio are not separate elif len(self.video_audio_list) != 0: self.media_comboBox.setCurrentIndex( len(self.video_audio_list) - 1) if len(self.no_audio_list) != 0: self.video_format_selection_comboBox.setCurrentIndex( len(self.no_audio_list)) if len(self.no_video_list) != 0: self.audio_format_selection_comboBox.setCurrentIndex( len(self.no_video_list)) # if we have only audio or we have only video then hide media_comboBox if len(self.video_audio_list) == 0: self.media_comboBox.hide() self.select_format_label.hide() # only video if len(self.no_video_list) != 0 and len( self.no_audio_list) == 0: self.mediaSelectionChanged( 'video', int(self.video_format_selection_comboBox. currentIndex())) self.advanced_format_selection_checkBox.setChecked( True) self.advanced_format_selection_checkBox.hide() # only audio elif len(self.no_video_list) == 0 and len( self.no_audio_list) != 0: self.mediaSelectionChanged( 'audio', int(self.audio_format_selection_comboBox. currentIndex())) self.advanced_format_selection_checkBox.setChecked( True) self.advanced_format_selection_checkBox.hide() # audio and video else: self.mediaSelectionChanged( 'video_audio', int(self.media_comboBox.currentIndex())) except Exception as ex: logger.sendToLog(ex, "ERROR") def findFileSize(self, result): try: item_id = self.threadPool[str(result['thread_key'])]['item_id'] if result['file_size'] and result['file_size'] != '0': text = self.media_comboBox.itemText(item_id) self.media_comboBox.setItemText( item_id, '{} - {}'.format(text, result['file_size'])) except Exception as ex: logger.sendToLog(ex, "ERROR") def linkLineChangedHere(self, lineEdit): if str(lineEdit) == '': self.url_submit_pushButtontton.setEnabled(False) else: self.url_submit_pushButtontton.setEnabled(True) # This method collects additional information like proxy ip, user, password etc. def collectMoreOptions(self): options = { 'ip': None, 'port': None, 'proxy_user': None, 'proxy_passwd': None, 'download_user': None, 'download_passwd': None } if self.proxy_checkBox.isChecked(): options['ip'] = self.ip_lineEdit.text() options['port'] = self.port_spinBox.value() options['proxy_user'] = self.proxy_user_lineEdit.text() options['proxy_passwd'] = self.proxy_pass_lineEdit.text() if self.download_checkBox.isChecked(): options['download_user'] = self.download_user_lineEdit.text() options['download_passwd'] = self.download_pass_lineEdit.text() # These info (keys) are required for spider to find file size, because spider() does not check if key exists. additional_info = [ 'header', 'load_cookies', 'user_agent', 'referer', 'out' ] for i in additional_info: if i not in self.plugin_add_link_dictionary.keys(): options[i] = None return options # user submitted information by pressing ok_pushButton, so get information # from VideoFinderAddLink window and return them to the mainwindow with callback! def okButtonPressed(self, download_later, button=None): link_list = [] # separate audio format and video format is selected. if self.advanced_format_selection_checkBox.isChecked(): if self.video_format_selection_comboBox.currentText( ) == 'No video' and self.audio_format_selection_comboBox.currentText( ) != 'No audio': # only audio link must be added to the link_list audio_link = self.no_video_list[ self.audio_format_selection_comboBox.currentIndex() - 1]['url'] link_list.append(audio_link) elif self.video_format_selection_comboBox.currentText( ) != 'No video' and self.audio_format_selection_comboBox.currentText( ) == 'No audio': # only video link must be added to the link_list video_link = self.no_audio_list[ self.video_format_selection_comboBox.currentIndex() - 1]['url'] link_list.append(video_link) elif self.video_format_selection_comboBox.currentText( ) != 'No video' and self.audio_format_selection_comboBox.currentText( ) != 'No audio': # video and audio links must be added to the link_list audio_link = self.no_video_list[ self.audio_format_selection_comboBox.currentIndex() - 1]['url'] video_link = self.no_audio_list[ self.video_format_selection_comboBox.currentIndex() - 1]['url'] link_list = [video_link, audio_link] elif self.video_format_selection_comboBox.currentText( ) == 'No video' and self.audio_format_selection_comboBox.currentText( ) == 'No audio': # no video and audio is selected! REALLY?!. user is DRUNK! close the window! :)) self.close() else: if self.media_comboBox.currentText() == 'Best quality': # the last item in no_video_list and no_audio_list are the best. video_link = self.no_audio_list[-1]['url'] audio_link = self.no_video_list[-1]['url'] link_list = [video_link, audio_link] else: audio_and_video_link = self.video_audio_list[ self.media_comboBox.currentIndex()]['url'] link_list.append(audio_and_video_link) # write user's new inputs in persepolis_setting for next time :) self.persepolis_setting.setValue('add_link_initialization/ip', self.ip_lineEdit.text()) self.persepolis_setting.setValue('add_link_initialization/port', self.port_spinBox.value()) self.persepolis_setting.setValue('add_link_initialization/proxy_user', self.proxy_user_lineEdit.text()) self.persepolis_setting.setValue( 'add_link_initialization/download_user', self.download_user_lineEdit.text()) # get proxy information if not (self.proxy_checkBox.isChecked()): ip = None port = None proxy_user = None proxy_passwd = None else: ip = self.ip_lineEdit.text() if not (ip): ip = None port = self.port_spinBox.value() if not (port): port = None proxy_user = self.proxy_user_lineEdit.text() if not (proxy_user): proxy_user = None proxy_passwd = self.proxy_pass_lineEdit.text() if not (proxy_passwd): proxy_passwd = None # get download username and password information if not (self.download_checkBox.isChecked()): download_user = None download_passwd = None else: download_user = self.download_user_lineEdit.text() if not (download_user): download_user = None download_passwd = self.download_pass_lineEdit.text() if not (download_passwd): download_passwd = None # check that if user limits download speed. if not (self.limit_checkBox.isChecked()): limit = 0 else: if self.limit_comboBox.currentText() == "KiB/s": limit = str(self.limit_spinBox.value()) + str("K") else: limit = str(self.limit_spinBox.value()) + str("M") # get start time for download if user set that. if not (self.start_checkBox.isChecked()): start_time = None else: start_time = self.start_time_qDataTimeEdit.text() # get end time for download if user set that. if not (self.end_checkBox.isChecked()): end_time = None else: end_time = self.end_time_qDateTimeEdit.text() # set name for file(s) if self.change_name_checkBox.isChecked(): name = str(self.change_name_lineEdit.text()) if name == '': name = 'video_finder_file' else: name = 'video_finder_file' # video finder always finds extension # but if it can't find file extension # use mp4 for extension. if str(self.extension_label.text()) == '': extension = '.mp4' else: extension = str(self.extension_label.text()) # did user select separate audio and video? if len(link_list) == 2: video_name = name + extension audio_name = name + '.' + \ str(self.no_video_list[self.audio_format_selection_comboBox.currentIndex() - 1]['ext']) name_list = [video_name, audio_name] else: name_list = [name + extension] # get number of connections connections = self.connections_spinBox.value() # get download_path download_path = self.download_folder_lineEdit.text() # referer if self.referer_lineEdit.text() != '': referer = self.referer_lineEdit.text() else: referer = None # header if self.header_lineEdit.text() != '': header = self.header_lineEdit.text() else: header = None # user_agent if self.user_agent_lineEdit.text() != '': user_agent = self.user_agent_lineEdit.text() else: user_agent = None # load_cookies if self.load_cookies_lineEdit.text() != '': load_cookies = self.load_cookies_lineEdit.text() else: load_cookies = None add_link_dictionary_list = [] if len(link_list) == 1: # save information in a dictionary(add_link_dictionary). add_link_dictionary = { 'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[0], 'start_time': start_time, 'end_time': end_time, 'link': link_list[0], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': limit, 'download_path': download_path } add_link_dictionary_list.append(add_link_dictionary) else: video_add_link_dictionary = { 'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[0], 'start_time': start_time, 'end_time': end_time, 'link': link_list[0], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': limit, 'download_path': download_path } audio_add_link_dictionary = { 'referer': referer, 'header': header, 'user_agent': user_agent, 'load_cookies': load_cookies, 'out': name_list[1], 'start_time': None, 'end_time': end_time, 'link': link_list[1], 'ip': ip, 'port': port, 'proxy_user': proxy_user, 'proxy_passwd': proxy_passwd, 'download_user': download_user, 'download_passwd': download_passwd, 'connections': connections, 'limit_value': limit, 'download_path': download_path } add_link_dictionary_list = [ video_add_link_dictionary, audio_add_link_dictionary ] # get category of download category = str(self.add_queue_comboBox.currentText()) del self.plugin_add_link_dictionary # return information to mainwindow self.callback(add_link_dictionary_list, download_later, category) # close window self.close()