#!/usr/bin/env python2 ''' Contains code for youtube-dlG options frame. ''' from os import name import wx from .LogManager import LogGUI from .version import __version__ from .utils import ( get_icon_path, fix_path, is_dash ) from .data import ( __descriptionfull__, __licensefull__, __projecturl__, __appname__, __author__ ) AUDIO_QUALITY = ['high', 'mid', 'low'] AUDIO_FORMATS = [ "mp3", "wav", "aac", "m4a", "vorbis" ] VIDEO_FORMATS = [ "default", "3gp [176x144]", "3gp [320x240]", "flv [400x240]", "flv [640x360]", "flv [854x480]", "webm [640x360]", "webm [854x480]", "webm [1280x720]", "webm [1920x1080]", "mp4 [640x360]", "mp4 [1280x720]", "mp4 [1920x1080]", "mp4 [4096x3072]", "mp4 144p (DASH)", "mp4 240p (DASH)", "mp4 360p (DASH)", "mp4 480p (DASH)", "mp4 720p (DASH)", "mp4 1080p (DASH)", "mp4 1440p (DASH)", "mp4 2160p (DASH)", "webm 240p (DASH)", "webm 360p (DASH)", "webm 480p (DASH)", "webm 720p (DASH)", "webm 1080p (DASH)", "webm 1440p (DASH)", "webm 2160p (DASH)", "mp4 360p (3D)", "mp4 480p (3D)", "mp4 720p (3D)", "mp4 1080p (3D)", "webm 360p (3D)", "webm 480p (3D)", "webm 720p (3D)" ] DASH_AUDIO_FORMATS = [ "none", "m4a 48k (DASH)", "m4a 128k (DASH)", "m4a 256k (DASH)", "webm 48k (DASH)", "webm 256k (DASH)" ] SUBS_LANG = [ "English", "Greek", "Portuguese", "French", "Italian", "Russian", "Spanish", "German" ] # Set wx.CheckBox height for Windows & Linux # so it looks the same on both platforms WX_CHECKBOX_SIZE = (-1, -1) if name == 'nt': WX_CHECKBOX_SIZE = (-1, 25) class OptionsFrame(wx.Frame): ''' Youtube-dlG options frame. Params opt_manager: OptionsManager.OptionsManager object. parent: Frame parent. logger: LogManager.LogManager object. Accessible Methods reset() Params: None Return: None load_all_options() Params: None Return: None save_all_options() Params: None Return: None ''' def __init__(self, opt_manager, parent=None, logger=None): wx.Frame.__init__(self, parent, -1, "Options", size=(640, 270)) self.opt_manager = opt_manager # Create GUI panel = wx.Panel(self) notebook = wx.Notebook(panel) # Create Tabs self.tabs = ( (GeneralPanel(notebook, self.opt_manager, self.reset), "General"), (VideoPanel(notebook), "Video"), (AudioPanel(notebook), "Audio"), (PlaylistPanel(notebook), "Playlist"), (OutputPanel(notebook), "Output"), (SubtitlesPanel(notebook), "Subtitles"), (FilesystemPanel(notebook), "Filesystem"), (ShutdownPanel(notebook), "Shutdown"), (AuthenticationPanel(notebook), "Authentication"), (ConnectionPanel(notebook), "Connection"), (LogPanel(notebook, logger), "Log"), (OtherPanel(notebook), "Commands") ) # Add tabs on notebook for tab, label in self.tabs: notebook.AddPage(tab, label) sizer = wx.BoxSizer() sizer.Add(notebook, 1, wx.EXPAND) panel.SetSizer(sizer) self.Bind(wx.EVT_CLOSE, self.OnClose) self.load_all_options() def OnClose(self, event): ''' Event handler for wx.EVT_CLOSE. ''' self.save_all_options() self.Destroy() def reset(self): ''' Reset default options. ''' self.opt_manager.load_default() self.load_all_options() def load_all_options(self): ''' Load tabs options. ''' for tab, _ in self.tabs: tab.load_options(self.opt_manager) def save_all_options(self): ''' Save tabs options ''' for tab, _ in self.tabs: tab.save_options(self.opt_manager) class LogPanel(wx.Panel): ''' Options frame log tab panel. Params parent: wx.Panel parent. logger: LogManager.LogManager.object. ''' def __init__(self, parent, logger): wx.Panel.__init__(self, parent) self.logger = logger # Create components self.enable_checkbox = wx.CheckBox(self, label='Enable Log', size=WX_CHECKBOX_SIZE) self.time_checkbox = wx.CheckBox(self, label='Write Time', size=WX_CHECKBOX_SIZE) self.clear_button = wx.Button(self, label='Clear Log') self.view_button = wx.Button(self, label='View Log') if self.logger is None: self.time_checkbox.Disable() self.clear_button.Disable() self.view_button.Disable() # Set BoxSizer main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(20) main_sizer.Add(self.enable_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.time_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(15) main_sizer.Add(self._create_buttons_sizer(), flag=wx.ALIGN_CENTER_HORIZONTAL) # Create extra items if logger is not None: path_text = wx.StaticText(self, label="Path: " + self.logger.log_file) self.log_size = wx.StaticText(self, label="Log Size %s Bytes" % self.logger.size()) main_sizer.AddSpacer(20) main_sizer.Add(path_text, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(self.log_size, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) # Set Events self.Bind(wx.EVT_CHECKBOX, self.OnEnable, self.enable_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnTime, self.time_checkbox) self.Bind(wx.EVT_BUTTON, self.OnClear, self.clear_button) self.Bind(wx.EVT_BUTTON, self.OnView, self.view_button) def _create_buttons_sizer(self): ''' Create buttons BoxSizer. ''' sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.clear_button) sizer.AddSpacer(20) sizer.Add(self.view_button) return sizer def _create_popup(self, text, title, style): ''' Create popup. ''' wx.MessageBox(text, title, style) def OnTime(self, event): ''' Event handler for self.time_checkbox. ''' if self.logger is not None: self.logger.add_time = self.time_checkbox.GetValue() def OnEnable(self, event): ''' Event handler for self.enable_checkbox. ''' self._create_popup( 'Please restart ' + __appname__, 'Restart', wx.OK | wx.ICON_INFORMATION ) def OnClear(self, event): ''' Event handler for self.clear_button. ''' if self.logger is not None: self.logger.clear() self.log_size.SetLabel("Log Size %s Bytes" % self.logger.size()) def OnView(self, event): ''' Event handler for self.view_button. ''' if self.logger is not None: logger_gui = LogGUI(self) logger_gui.Show() logger_gui.load(self.logger.log_file) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.enable_checkbox.SetValue(opt_manager.options['enable_log']) self.time_checkbox.SetValue(opt_manager.options['log_time']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['enable_log'] = self.enable_checkbox.GetValue() opt_manager.options['log_time'] = self.time_checkbox.GetValue() class ShutdownPanel(wx.Panel): ''' Options frame shutdown tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.shutdown_checkbox = wx.CheckBox(self, label='Shutdown when finished', size=WX_CHECKBOX_SIZE) self.sudo_pass_box = wx.TextCtrl(self, size=(250, 25), style=wx.TE_PASSWORD) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(40) main_sizer.Add(self.shutdown_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(20) main_sizer.Add(wx.StaticText(self, label='SUDO password'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.sudo_pass_box, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) self.Bind(wx.EVT_CHECKBOX, self.OnShutdownCheck, self.shutdown_checkbox) def OnShutdownCheck(self, event): ''' Event handler for self.shutdown_checkbox. ''' if name != 'nt': self.sudo_pass_box.Enable(self.shutdown_checkbox.GetValue()) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.shutdown_checkbox.SetValue(opt_manager.options['shutdown']) self.sudo_pass_box.SetValue(opt_manager.options['sudo_password']) if name == 'nt' or not opt_manager.options['shutdown']: self.sudo_pass_box.Disable() def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['shutdown'] = self.shutdown_checkbox.GetValue() opt_manager.options['sudo_password'] = self.sudo_pass_box.GetValue() class PlaylistPanel(wx.Panel): ''' Options frame playlist tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.start_spinner = wx.SpinCtrl(self, size=(70, 20)) self.start_spinner.SetRange(1, 999) self.stop_spinner = wx.SpinCtrl(self, size=(70, 20)) self.stop_spinner.SetRange(0, 999) self.max_spinner = wx.SpinCtrl(self, size=(70, 20)) self.max_spinner.SetRange(0, 999) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(20) main_sizer.Add(wx.StaticText(self, label='Playlist Start'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.start_spinner, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(15) main_sizer.Add(wx.StaticText(self, label='Playlist Stop'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.stop_spinner, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(15) main_sizer.Add(wx.StaticText(self, label='Max Downloads'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.max_spinner, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.start_spinner.SetValue(opt_manager.options['playlist_start']) self.stop_spinner.SetValue(opt_manager.options['playlist_end']) self.max_spinner.SetValue(opt_manager.options['max_downloads']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['playlist_start'] = self.start_spinner.GetValue() opt_manager.options['playlist_end'] = self.stop_spinner.GetValue() opt_manager.options['max_downloads'] = self.max_spinner.GetValue() class ConnectionPanel(wx.Panel): ''' Options frame connection tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) # Create components self.retries_spinner = wx.SpinCtrl(self, size=(50, -1)) self.retries_spinner.SetRange(1, 99) self.user_agent_box = wx.TextCtrl(self, size=(550, -1)) self.referer_box = wx.TextCtrl(self, size=(550, -1)) self.proxy_box = wx.TextCtrl(self, size=(550, -1)) # Set BoxSizer main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(10) main_sizer.Add(self._create_retries_sizer()) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='User Agent'), flag=wx.LEFT, border=10) main_sizer.AddSpacer(5) main_sizer.Add(self.user_agent_box, flag=wx.LEFT, border=10) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='Referer'), flag=wx.LEFT, border=10) main_sizer.AddSpacer(5) main_sizer.Add(self.referer_box, flag=wx.LEFT, border=10) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='Proxy'), flag=wx.LEFT, border=10) main_sizer.AddSpacer(5) main_sizer.Add(self.proxy_box, flag=wx.LEFT, border=10) self.SetSizer(main_sizer) def _create_retries_sizer(self): ''' Create retries BoxSizer. ''' sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.AddSpacer(10) sizer.Add(wx.StaticText(self, label='Retries')) sizer.AddSpacer(5) sizer.Add(self.retries_spinner) return sizer def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.proxy_box.SetValue(opt_manager.options['proxy']) self.referer_box.SetValue(opt_manager.options['referer']) self.retries_spinner.SetValue(opt_manager.options['retries']) self.user_agent_box.SetValue(opt_manager.options['user_agent']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['proxy'] = self.proxy_box.GetValue() opt_manager.options['referer'] = self.referer_box.GetValue() opt_manager.options['retries'] = self.retries_spinner.GetValue() opt_manager.options['user_agent'] = self.user_agent_box.GetValue() class AuthenticationPanel(wx.Panel): ''' Options frame authentication tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.username_box = wx.TextCtrl(self, size=(250, 25)) self.password_box = wx.TextCtrl(self, size=(250, 25), style=wx.TE_PASSWORD) self.video_pass_box = wx.TextCtrl(self, size=(250, 25), style=wx.TE_PASSWORD) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(15) main_sizer.Add(wx.StaticText(self, label='Username'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.username_box, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(15) main_sizer.Add(wx.StaticText(self, label='Password'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.password_box, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(15) main_sizer.Add(wx.StaticText(self, label='Video Password (vimeo, smotri)'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.video_pass_box, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.username_box.SetValue(opt_manager.options['username']) self.password_box.SetValue(opt_manager.options['password']) self.video_pass_box.SetValue(opt_manager.options['video_password']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['username'] = self.username_box.GetValue() opt_manager.options['password'] = self.password_box.GetValue() opt_manager.options['video_password'] = self.video_pass_box.GetValue() class AudioPanel(wx.Panel): ''' Options frame audio tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.to_audio_checkbox = wx.CheckBox(self, label='Convert to Audio', size=WX_CHECKBOX_SIZE) self.keep_video_checkbox = wx.CheckBox(self, label='Keep Video', size=WX_CHECKBOX_SIZE) self.audio_format_combo = wx.ComboBox(self, choices=AUDIO_FORMATS, size=(160, 30)) self.audio_quality_combo = wx.ComboBox(self, choices=AUDIO_QUALITY, size=(80, 25)) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(15) main_sizer.Add(self.to_audio_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.keep_video_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='Audio Format'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.audio_format_combo, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='Audio Quality'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.audio_quality_combo, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) self.Bind(wx.EVT_CHECKBOX, self.OnAudioCheck, self.to_audio_checkbox) def OnAudioCheck(self, event): ''' Event handler for self.to_audio_checkbox. ''' if self.to_audio_checkbox.GetValue(): self.keep_video_checkbox.Enable() self.audio_format_combo.Enable() self.audio_quality_combo.Enable() else: self.keep_video_checkbox.Disable() self.audio_format_combo.Disable() self.audio_quality_combo.Disable() def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.to_audio_checkbox.SetValue(opt_manager.options['to_audio']) self.keep_video_checkbox.SetValue(opt_manager.options['keep_video']) self.audio_format_combo.SetValue(opt_manager.options['audio_format']) self.audio_quality_combo.SetValue(opt_manager.options['audio_quality']) self.OnAudioCheck(None) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['to_audio'] = self.to_audio_checkbox.GetValue() opt_manager.options['keep_video'] = self.keep_video_checkbox.GetValue() opt_manager.options['audio_format'] = self.audio_format_combo.GetValue() opt_manager.options['audio_quality'] = self.audio_quality_combo.GetValue() class VideoPanel(wx.Panel): ''' Options frame video tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.video_format_combo = wx.ComboBox(self, choices=VIDEO_FORMATS, size=(180, 30)) self.dash_audio_combo = wx.ComboBox(self, choices=DASH_AUDIO_FORMATS, size=(180, 30)) self.clear_dash_checkbox = wx.CheckBox(self, label='Clear DASH audio/video files', size=WX_CHECKBOX_SIZE) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(20) main_sizer.Add(wx.StaticText(self, label='Video Format'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.video_format_combo, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='DASH Audio'), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(5) main_sizer.Add(self.dash_audio_combo, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(20) main_sizer.Add(self.clear_dash_checkbox, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) self.Bind(wx.EVT_COMBOBOX, self.OnVideoFormatPick, self.video_format_combo) self.Bind(wx.EVT_COMBOBOX, self.OnAudioFormatPick, self.dash_audio_combo) def OnAudioFormatPick(self, event): ''' Event handler for self.dash_audio_combo. ''' if is_dash(self.dash_audio_combo.GetValue()): self.clear_dash_checkbox.Enable() else: self.clear_dash_checkbox.SetValue(False) self.clear_dash_checkbox.Disable() def OnVideoFormatPick(self, event): ''' Event handler for self.video_format_combo. ''' if is_dash(self.video_format_combo.GetValue()): self.dash_audio_combo.Enable() else: self.dash_audio_combo.Disable() self.clear_dash_checkbox.Disable() self.clear_dash_checkbox.SetValue(False) self.OnAudioFormatPick(None) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.video_format_combo.SetValue(opt_manager.options['video_format']) self.dash_audio_combo.SetValue(opt_manager.options['dash_audio_format']) self.clear_dash_checkbox.SetValue(opt_manager.options['clear_dash_files']) self.OnVideoFormatPick(None) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['video_format'] = self.video_format_combo.GetValue() opt_manager.options['dash_audio_format'] = self.dash_audio_combo.GetValue() opt_manager.options['clear_dash_files'] = self.clear_dash_checkbox.GetValue() class OutputPanel(wx.Panel): ''' Options frame output tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.restrict_filenames_checkbox = wx.CheckBox(self, label='Restrict filenames (ASCII)', size=WX_CHECKBOX_SIZE) self.id_as_name_checkbox = wx.CheckBox(self, label='ID as Name', size=WX_CHECKBOX_SIZE) self.title_checkbox = wx.CheckBox(self, label='Title as Name', size=WX_CHECKBOX_SIZE) self.custom_title_checkbox = wx.CheckBox(self, label='Custom Template (youtube-dl)', size=WX_CHECKBOX_SIZE) self.title_template_box = wx.TextCtrl(self, size=(300, 20)) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(15) main_sizer.Add(self.restrict_filenames_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.id_as_name_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.title_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.custom_title_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(10) main_sizer.Add(self.title_template_box, flag=wx.LEFT, border=5) self.SetSizer(main_sizer) self.Bind(wx.EVT_CHECKBOX, self.OnCheck, self.id_as_name_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnCheck, self.title_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnCheck, self.custom_title_checkbox) def _group_load(self, output_format): ''' Disable components base on output_format. ''' if output_format == 'id': self.id_as_name_checkbox.SetValue(True) self.title_checkbox.SetValue(False) self.custom_title_checkbox.SetValue(False) self.title_template_box.Disable() elif output_format == 'title': self.id_as_name_checkbox.SetValue(False) self.title_checkbox.SetValue(True) self.custom_title_checkbox.SetValue(False) self.title_template_box.Disable() elif output_format == 'custom': self.id_as_name_checkbox.SetValue(False) self.title_checkbox.SetValue(False) self.custom_title_checkbox.SetValue(True) self.title_template_box.Enable() def _get_output_format(self): ''' Return output_format. ''' if self.id_as_name_checkbox.GetValue(): return 'id' elif self.title_checkbox.GetValue(): return 'title' elif self.custom_title_checkbox.GetValue(): return 'custom' def OnCheck(self, event): ''' Event handler for output checkboxes. ''' box = event.GetEventObject() if box == self.id_as_name_checkbox: output_format = 'id' elif box == self.title_checkbox: output_format = 'title' else: output_format = 'custom' self._group_load(output_format) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self._group_load(opt_manager.options['output_format']) self.title_template_box.SetValue(opt_manager.options['output_template']) self.restrict_filenames_checkbox.SetValue(opt_manager.options['restrict_filenames']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['output_format'] = self._get_output_format() opt_manager.options['output_template'] = self.title_template_box.GetValue() opt_manager.options['restrict_filenames'] = self.restrict_filenames_checkbox.GetValue() class FilesystemPanel(wx.Panel): ''' Options frame filesystem tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.ignore_errors_checkbox = wx.CheckBox(self, label='Ignore Errors', size=WX_CHECKBOX_SIZE) self.open_dir_checkbox = wx.CheckBox(self, label='Open download folder', size=WX_CHECKBOX_SIZE) self.write_info_checkbox = wx.CheckBox(self, label='Write info to (.json) file', size=WX_CHECKBOX_SIZE) self.write_desc_checkbox = wx.CheckBox(self, label='Write description to file', size=WX_CHECKBOX_SIZE) self.write_thumbnail_checkbox = wx.CheckBox(self, label='Write thumbnail to disk', size=WX_CHECKBOX_SIZE) self.min_filesize_box = wx.TextCtrl(self, size=(70, -1)) self.max_filesize_box = wx.TextCtrl(self, size=(70, -1)) main_sizer = wx.BoxSizer(wx.HORIZONTAL) main_sizer.Add(self._set_left_sizer(), flag=wx.EXPAND) main_sizer.AddSpacer(150) main_sizer.Add(self._set_right_sizer(), 1, flag=wx.EXPAND) self.SetSizer(main_sizer) def _set_left_sizer(self): ''' Set left BoxSizer. ''' sizer = wx.BoxSizer(wx.VERTICAL) sizer.AddSpacer(15) sizer.Add(self.ignore_errors_checkbox, flag=wx.LEFT, border=5) sizer.AddSpacer(5) sizer.Add(self.open_dir_checkbox, flag=wx.LEFT, border=5) sizer.AddSpacer(5) sizer.Add(self.write_desc_checkbox, flag=wx.LEFT, border=5) sizer.AddSpacer(5) sizer.Add(self.write_thumbnail_checkbox, flag=wx.LEFT, border=5) sizer.AddSpacer(5) sizer.Add(self.write_info_checkbox, flag=wx.LEFT, border=5) return sizer def _set_right_sizer(self): ''' Set right BoxSizer. ''' static_box = wx.StaticBox(self, label='Filesize (e.g. 50k or 44.6m)') sizer = wx.StaticBoxSizer(static_box, wx.VERTICAL) sizer.AddSpacer(50) # Cross platform hack for the horizontal sizer # so it looks the same both on Windows & Linux extra_border = 0 if name != 'nt': extra_border = 3 hor_sizer = wx.BoxSizer(wx.HORIZONTAL) hor_sizer.Add(wx.StaticText(self, label='Min')) hor_sizer.AddSpacer(10 + extra_border) hor_sizer.Add(self.min_filesize_box) sizer.Add(hor_sizer, flag=wx.ALIGN_CENTER_HORIZONTAL) sizer.AddSpacer(10) hor_sizer = wx.BoxSizer(wx.HORIZONTAL) hor_sizer.Add(wx.StaticText(self, label='Max')) hor_sizer.AddSpacer(10) hor_sizer.Add(self.max_filesize_box) sizer.Add(hor_sizer, flag=wx.ALIGN_CENTER_HORIZONTAL) return sizer def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.open_dir_checkbox.SetValue(opt_manager.options['open_dl_dir']) self.min_filesize_box.SetValue(opt_manager.options['min_filesize']) self.max_filesize_box.SetValue(opt_manager.options['max_filesize']) self.write_info_checkbox.SetValue(opt_manager.options['write_info']) self.ignore_errors_checkbox.SetValue(opt_manager.options['ignore_errors']) self.write_desc_checkbox.SetValue(opt_manager.options['write_description']) self.write_thumbnail_checkbox.SetValue(opt_manager.options['write_thumbnail']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['write_thumbnail'] = self.write_thumbnail_checkbox.GetValue() opt_manager.options['write_description'] = self.write_desc_checkbox.GetValue() opt_manager.options['ignore_errors'] = self.ignore_errors_checkbox.GetValue() opt_manager.options['write_info'] = self.write_info_checkbox.GetValue() opt_manager.options['open_dl_dir'] = self.open_dir_checkbox.GetValue() opt_manager.options['min_filesize'] = self.min_filesize_box.GetValue() opt_manager.options['max_filesize'] = self.max_filesize_box.GetValue() # Check min_filesize input if opt_manager.options['min_filesize'] == '': opt_manager.options['min_filesize'] = '0' if opt_manager.options['max_filesize'] == '': opt_manager.options['max_filesize'] = '0' class SubtitlesPanel(wx.Panel): ''' Options frame subtitles tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.write_subs_checkbox = wx.CheckBox(self, label='Download subtitle file by language', size=WX_CHECKBOX_SIZE) self.write_all_subs_checkbox = wx.CheckBox(self, label='Download all available subtitles', size=WX_CHECKBOX_SIZE) self.write_auto_subs_checkbox = wx.CheckBox(self, label='Download automatic subtitle file (YOUTUBE ONLY)', size=WX_CHECKBOX_SIZE) self.embed_subs_checkbox = wx.CheckBox(self, label='Embed subtitles in the video (only for mp4 videos)', size=WX_CHECKBOX_SIZE) self.subs_languages_combo = wx.ComboBox(self, choices=SUBS_LANG, size=(140, 30)) self.embed_subs_checkbox.Disable() self.subs_languages_combo.Disable() main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(15) main_sizer.Add(self.write_subs_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.write_all_subs_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.write_auto_subs_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(5) main_sizer.Add(self.embed_subs_checkbox, flag=wx.LEFT, border=5) main_sizer.AddSpacer(10) main_sizer.Add(wx.StaticText(self, label='Subtitles Langues'), flag=wx.LEFT, border=10) main_sizer.AddSpacer(5) main_sizer.Add(self.subs_languages_combo, flag=wx.LEFT, border=15) self.SetSizer(main_sizer) self.Bind(wx.EVT_CHECKBOX, self.OnWriteSubsChk, self.write_subs_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnWriteAllSubsChk, self.write_all_subs_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnWriteAutoSubsChk, self.write_auto_subs_checkbox) def OnWriteAutoSubsChk(self, event): ''' Event handler for self.write_auto_subs_checkbox. ''' if self.write_auto_subs_checkbox.GetValue(): self.embed_subs_checkbox.Enable() self.write_subs_checkbox.Disable() self.write_all_subs_checkbox.Disable() else: self.embed_subs_checkbox.Disable() self.embed_subs_checkbox.SetValue(False) self.write_subs_checkbox.Enable() self.write_all_subs_checkbox.Enable() def OnWriteSubsChk(self, event): ''' Event handler for self.write_subs_checkbox. ''' if self.write_subs_checkbox.GetValue(): self.embed_subs_checkbox.Enable() self.subs_languages_combo.Enable() self.write_all_subs_checkbox.Disable() self.write_auto_subs_checkbox.Disable() else: self.embed_subs_checkbox.Disable() self.embed_subs_checkbox.SetValue(False) self.subs_languages_combo.Disable() self.write_all_subs_checkbox.Enable() self.write_auto_subs_checkbox.Enable() def OnWriteAllSubsChk(self, event): ''' Event handler for self.write_all_subs_checkbox. ''' if self.write_all_subs_checkbox.GetValue(): self.write_subs_checkbox.Disable() self.write_auto_subs_checkbox.Disable() else: self.write_subs_checkbox.Enable() self.write_auto_subs_checkbox.Enable() def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.write_subs_checkbox.SetValue(opt_manager.options['write_subs']) self.subs_languages_combo.SetValue(opt_manager.options['subs_lang']) self.embed_subs_checkbox.SetValue(opt_manager.options['embed_subs']) self.write_all_subs_checkbox.SetValue(opt_manager.options['write_all_subs']) self.write_auto_subs_checkbox.SetValue(opt_manager.options['write_auto_subs']) self.OnWriteSubsChk(None) self.OnWriteAllSubsChk(None) self.OnWriteAutoSubsChk(None) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['write_subs'] = self.write_subs_checkbox.GetValue() opt_manager.options['subs_lang'] = self.subs_languages_combo.GetValue() opt_manager.options['embed_subs'] = self.embed_subs_checkbox.GetValue() opt_manager.options['write_all_subs'] = self.write_all_subs_checkbox.GetValue() opt_manager.options['write_auto_subs'] = self.write_auto_subs_checkbox.GetValue() class GeneralPanel(wx.Panel): ''' Options frame general tab panel. Params parent: wx.Panel parent. opt_manager: OptionsHandler.OptionsHandler object. reset_handler: Method to reset all options & frame. ''' def __init__(self, parent, opt_manager, reset_handler): wx.Panel.__init__(self, parent) self.reset_handler = reset_handler self.savepath_box = wx.TextCtrl(self) self.about_button = wx.Button(self, label='About', size=(110, 40)) self.open_button = wx.Button(self, label='Open', size=(110, 40)) self.reset_button = wx.Button(self, label='Reset Options', size=(110, 40)) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(20) sp_label = wx.StaticText(self, label='Save Path') main_sizer.Add(sp_label, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(self._create_savepath_sizer(), flag=wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND) main_sizer.AddSpacer(20) main_sizer.Add(self._create_buttons_sizer(), flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(30) settings_file = wx.StaticText(self, label='Settings: ' + opt_manager.settings_file) main_sizer.Add(settings_file, flag=wx.ALIGN_CENTER_HORIZONTAL) self.SetSizer(main_sizer) self.Bind(wx.EVT_BUTTON, self.OnOpen, self.open_button) self.Bind(wx.EVT_BUTTON, self.OnAbout, self.about_button) self.Bind(wx.EVT_BUTTON, self.OnReset, self.reset_button) def _create_savepath_sizer(self): ''' Return self.savepath_box BoxSizer. ''' sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.savepath_box, 1, flag=wx.LEFT | wx.RIGHT, border=80) return sizer def _create_buttons_sizer(self): ''' Return buttons BoxSizer. ''' sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.about_button) sizer.Add(self.open_button, flag=wx.LEFT | wx.RIGHT, border=50) sizer.Add(self.reset_button) return sizer def OnReset(self, event): ''' Event handler reset button. ''' self.reset_handler() def OnOpen(self, event): ''' Event handler open button. ''' dlg = wx.DirDialog(None, "Choose directory") if dlg.ShowModal() == wx.ID_OK: self.savepath_box.SetValue(dlg.GetPath()) dlg.Destroy() def OnAbout(self, event): ''' Event handler about button. ''' info = wx.AboutDialogInfo() # Load about icon app_icon = get_icon_path() if app_icon is not None: info.SetIcon(wx.Icon(app_icon, wx.BITMAP_TYPE_PNG)) info.SetName(__appname__) info.SetVersion(__version__) info.SetDescription(__descriptionfull__) info.SetWebSite(__projecturl__) info.SetLicense(__licensefull__) info.AddDeveloper(__author__) wx.AboutBox(info) def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.savepath_box.SetValue(opt_manager.options['save_path']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['save_path'] = fix_path(self.savepath_box.GetValue()) class OtherPanel(wx.Panel): ''' Options frame command tab panel. Params parent: wx.Panel parent. ''' def __init__(self, parent): wx.Panel.__init__(self, parent) self.cmd_args_box = wx.TextCtrl(self) main_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer.AddSpacer(50) label = wx.StaticText(self, label='Command line arguments (e.g. --help)') main_sizer.Add(label, flag=wx.ALIGN_CENTER_HORIZONTAL) main_sizer.AddSpacer(10) main_sizer.Add(self._create_cmd_sizer(), flag=wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND) self.SetSizer(main_sizer) def _create_cmd_sizer(self): ''' Create BoxSizer for self.cmd_args_box. ''' sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.cmd_args_box, 1, wx.LEFT | wx.RIGHT, border=80) return sizer def load_options(self, opt_manager): ''' Load panel options from OptionsHandler object. ''' self.cmd_args_box.SetValue(opt_manager.options['cmd_args']) def save_options(self, opt_manager): ''' Save panel options to OptionsHandler object. ''' opt_manager.options['cmd_args'] = self.cmd_args_box.GetValue()