Exemplo n.º 1
0
    def test_multifile_torrent(self):
        tdef = TorrentDef()

        dn = os.path.join(TESTS_DATA_DIR, "contentdir")
        tdef.add_content(dn, "dirintorrent")

        fn = os.path.join(TESTS_DATA_DIR, "video.avi")
        tdef.add_content(fn, os.path.join("dirintorrent", "video.avi"))

        tdef.set_tracker("http://tribler.org/announce")
        tdef.finalize()

        impl = LibtorrentDownloadImpl(self.session, tdef)
        # Override the add_torrent because it will be called
        impl.ltmgr = MockObject()
        impl.ltmgr.add_torrent = lambda _, _dummy2: fake_handler
        impl.set_selected_files = lambda: None
        fake_handler = MockObject()
        fake_handler.is_valid = lambda: True
        fake_handler.status = lambda: fake_status
        fake_handler.set_share_mode = lambda _: None
        fake_handler.resume = lambda: None
        fake_handler.resolve_countries = lambda _: None
        fake_status = MockObject()
        fake_status.share_mode = False
        # Create a dummy download config
        impl.dlconfig = DownloadStartupConfig().dlconfig.copy()
        # Create a dummy pstate
        pstate = CallbackConfigParser()
        pstate.add_section("state")
        test_dict = dict()
        test_dict["a"] = "b"
        pstate.set("state", "engineresumedata", test_dict)
        return impl.network_create_engine_wrapper(pstate)
Exemplo n.º 2
0
    def test_configparser_copy(self):
        ccp = CallbackConfigParser()
        ccp.read_file(os.path.join(self.CONFIG_FILES_DIR, 'config1.conf'))

        copy_ccp = ccp.copy()
        self.assertEqual(copy_ccp.get('general', 'version'), 11)
        self.assertTrue(copy_ccp.get('search_community', 'enabled'))
Exemplo n.º 3
0
    def test_downloadconfig(self):
        dlconf = CallbackConfigParser()
        dlconf.add_section('downloadconfig')
        dlconf.set('downloadconfig', 'hops', 5)
        dlcfg = DownloadConfigInterface(dlconf)

        self.assertIsInstance(dlcfg.get_dest_dir(), unicode)
        dlcfg.set_dest_dir(self.session_base_dir)
        self.assertEqual(dlcfg.get_dest_dir(), self.session_base_dir)

        dlcfg.set_corrected_filename("foobar")
        self.assertEqual(dlcfg.get_corrected_filename(), "foobar")

        dlcfg.set_mode(1)
        self.assertEqual(dlcfg.get_mode(), 1)

        dlcfg.set_hops(4)
        self.assertEqual(dlcfg.get_hops(), 4)

        dlcfg.set_safe_seeding(False)
        self.assertFalse(dlcfg.get_safe_seeding())

        dlcfg.set_selected_files("foo.bar")
        self.assertEqual(dlcfg.get_selected_files(), ["foo.bar"])

        dlcfg.set_max_speed(UPLOAD, 1337)
        dlcfg.set_max_speed(DOWNLOAD, 1338)
        self.assertEqual(dlcfg.get_max_speed(UPLOAD), 1337)
        self.assertEqual(dlcfg.get_max_speed(DOWNLOAD), 1338)
Exemplo n.º 4
0
    def load(filename=None):
        """
        Load a saved SessionStartupConfig from disk.

        @param filename  An absolute Unicode filename, if None, the default path will be used.
        @return SessionStartupConfig object
        """
        if not filename:
            # Then try to read from default location
            filename = SessionStartupConfig.get_default_config_filename(
                SessionStartupConfig.get_default_state_dir())
        if not os.path.isfile(filename):
            # No config on the default location, just start from scratch
            return SessionStartupConfig()

        # Class method, no locking required
        sessconfig = CallbackConfigParser()
        try:
            sessconfig.read_file(filename)
        except:
            # Config file seems to be corrupt, backup the file and start from scratch
            copyfile(
                filename,
                os.path.join(os.path.dirname(filename), 'corrupt_config.bak'))
            return SessionStartupConfig()

        return SessionStartupConfig(sessconfig)
Exemplo n.º 5
0
 def copy(self):
     config = CallbackConfigParser()
     config._sections = {
         'downloadconfig':
         copy.deepcopy(self.dlconfig._sections['downloadconfig'])
     }
     return DownloadStartupConfig(config)
Exemplo n.º 6
0
    def __init__(self, dlconfig=None):
        super(DownloadConfigInterface, self).__init__()

        self.dlconfig = dlconfig or CallbackConfigParser()

        # Dumb^WPoor man's versioning of DownloadConfig, add missing default values.
        write = False
        for section, sect_dict in dldefaults.iteritems():
            if not self.dlconfig.has_section(section):
                self.dlconfig.add_section(section)
            for k, v in sect_dict.iteritems():
                if not self.dlconfig.has_option(section, k):
                    write = True
                    self.dlconfig.set(section, k, v)

        if write and self.dlconfig.filename:
            self.dlconfig.write_file()

        if dlconfig:
            # TODO(emilon): I guess this can be removed?
            # modify/fix incorrectly saved dlconfigs
            if dlconfig.has_option('downloadconfig', 'saveas') and isinstance(
                    dlconfig.get('downloadconfig', 'saveas'), tuple):
                dlconfig.set('downloadconfig', 'saveas',
                             dlconfig.get('saveas')[-1])
Exemplo n.º 7
0
    def setup_tribler_gui_config(self):
        """
        Initialize the TriblerGUI configuration file and make sure that we have all required values.
        """
        configfilepath = os.path.join(self.get_state_dir(), STATEDIR_GUICONFIG)
        gui_config = CallbackConfigParser()
        DefaultDownloadStartupConfig.getInstance().set_dest_dir(
            get_default_dest_dir())

        # Load the config file.
        if os.path.exists(configfilepath):
            gui_config.read_file(configfilepath, 'utf-8-sig')

        if not gui_config.has_section('Tribler'):
            gui_config.add_section('Tribler')

        for k, v in tribler_defaults['Tribler'].iteritems():
            if not gui_config.has_option(k, v):
                gui_config.set('Tribler', k, v)

        if not gui_config.has_section('downloadconfig'):
            gui_config.add_section('downloadconfig')

        for k, v in DefaultDownloadStartupConfig.getInstance(
        ).dlconfig._sections['downloadconfig'].iteritems():
            if not gui_config.has_option(k, v):
                gui_config.set('downloadconfig', k, v)

        # Make sure we use the same ConfigParser instance for both Utility and DefaultDownloadStartupConfig.
        DefaultDownloadStartupConfig.getInstance().dlconfig = gui_config

        gui_config.write_file(configfilepath)
Exemplo n.º 8
0
    def test_configparser_false_callback(self):
        def parser_callback(section, option, old_value, new_value):
            return False

        ccp = CallbackConfigParser()
        ccp.read_file(os.path.join(self.CONFIG_FILES_DIR, 'config1.conf'))
        ccp.set_callback(parser_callback)
        ccp.set('search_community', 'enabled', False)
Exemplo n.º 9
0
    def test_configparser_config1(self):
        ccp = CallbackConfigParser()
        ccp.read_file(os.path.join(self.CONFIG_FILES_DIR, 'config1.conf'))

        self.assertEqual(ccp.get('general', 'version'), 11)
        self.assertTrue(ccp.get('search_community', 'enabled'))
        self.assertIsInstance(
            ccp.get('tunnel_community', 'socks5_listen_ports'), list)
        self.assertFalse(ccp.get('foo', 'bar'))
Exemplo n.º 10
0
    def test_configparser_write_file_defaults(self):
        ccp = CallbackConfigParser(defaults={'foo': 'bar'})

        new_path = os.path.join(self.session_base_dir, 'config_new.conf')
        ccp.write_file(new_path)

        self.assertTrue(os.path.isfile(new_path))
        ccp.read_file(new_path)
        self.assertEqual(ccp.get('DEFAULT', 'foo'), 'bar')
Exemplo n.º 11
0
    def test_get_settings(self):
        """
        Testing whether the API returns a correct settings dictionary when the settings are requested
        """
        self.should_check_equality = False
        tribler_config = CallbackConfigParser()
        tribler_config.add_section('Tribler')
        tribler_config.write_file(os.path.join(self.session.get_state_dir(), 'tribler.conf'))

        return self.do_request('settings', expected_code=200).addCallback(self.verify_settings)
Exemplo n.º 12
0
    def __init__(self, session):
        resource.Resource.__init__(self)
        self.session = session

        # Load the Tribler GUI configuration file
        self.gui_config_file_path = os.path.join(self.session.get_state_dir(),
                                                 STATEDIR_GUICONFIG)
        self.tribler_gui_config = CallbackConfigParser()
        self.tribler_gui_config.read_file(self.gui_config_file_path,
                                          'utf-8-sig')
Exemplo n.º 13
0
    def __init__(self, session):
        super(WatchFolder, self).__init__()

        self._logger = logging.getLogger(self.__class__.__name__)
        self.session = session

        gui_config_file_path = os.path.join(self.session.get_state_dir(), STATEDIR_GUICONFIG)
        config = CallbackConfigParser()
        config.read_file(gui_config_file_path, 'utf-8-sig')
        self.tribler_gui_config = config.get_config_as_json()
Exemplo n.º 14
0
        def resume_ready(_):
            """
            check if resume data is ready
            """
            basename = binascii.hexlify(tdef.get_infohash()) + '.state'
            filename = os.path.join(self.session.get_downloads_pstate_dir(), basename)

            engine_data = CallbackConfigParser()
            engine_data.read_file(filename)

            self.assertEqual(tdef.get_infohash(), engine_data.get('state', 'engineresumedata').get('info-hash'))
Exemplo n.º 15
0
    def test_configparser_set_callback(self):
        def parser_callback(section, option, old_value, new_value):
            return True

        ccp = CallbackConfigParser()
        ccp.set_callback(parser_callback)
        ccp.read_file(os.path.join(self.CONFIG_FILES_DIR, 'config1.conf'))

        ccp.set('search_community', 'enabled', False)
        ccp.set('search_community', 'bar', 42)

        self.assertFalse(ccp.get('search_community', 'enabled'))
        self.assertEquals(ccp.get('search_community', 'bar'), 42)
Exemplo n.º 16
0
    def load(filename):
        """
        Load a saved DownloadStartupConfig from disk.

        @param filename  An absolute Unicode filename
        @return DownloadStartupConfig object
        """
        # Class method, no locking required
        dlconfig = CallbackConfigParser()
        try:
            dlconfig.read_file(filename)
        except:
            raise IOError, "Failed to open download config file"

        return DownloadStartupConfig(dlconfig)
Exemplo n.º 17
0
    def load(filename):
        """
        Load a saved DownloadStartupConfig from disk.

        @param filename  An absolute Unicode filename
        @return DownloadStartupConfig object
        """
        # Class method, no locking required
        dlconfig = CallbackConfigParser()
        try:
            dlconfig.read_file(filename)
        except (ParsingError, IOError, MissingSectionHeaderError):
            logger.error("Failed to open download config file: %s", filename)
            raise

        return DownloadStartupConfig(dlconfig)
Exemplo n.º 18
0
    def __init__(self, dlconfig=None):
        super(DownloadConfigInterface, self).__init__()

        self.dlconfig = dlconfig or CallbackConfigParser()

        # Dumb^WPoor man's versioning of DownloadConfig, add missing default values.
        write = False
        for section, sect_dict in dldefaults.items():
            if not self.dlconfig.has_section(section):
                self.dlconfig.add_section(section)
            for k, v in sect_dict.items():
                if not self.dlconfig.has_option(section, k):
                    write = True
                    self.dlconfig.set(section, k, v)

        if write and self.dlconfig.filename:
            self.dlconfig.write_file()
Exemplo n.º 19
0
    def setupConfig(self):
        self.configfilepath = os.path.join(self.getConfigPath(),
                                           STATEDIR_GUICONFIG)
        self.config = CallbackConfigParser()

        # Load the config file.
        if os.path.exists(self.configfilepath):
            self.config.read_file(self.configfilepath, 'utf-8-sig')

        if not self.config.has_section('Tribler'):
            self.config.add_section('Tribler')

        # Tribler.conf also contains the default download config. So we need to merge it now.
        if not self.config.has_section('downloadconfig'):
            self.config.add_section('downloadconfig')
            for k, v in DefaultDownloadStartupConfig.getInstance(
            ).dlconfig._sections['downloadconfig'].iteritems():
                self.config.set('downloadconfig', k, v)

        # Make sure we use the same ConfigParser instance for both Utility and DefaultDownloadStartupConfig.
        DefaultDownloadStartupConfig.getInstance().dlconfig = self.config
Exemplo n.º 20
0
    def load(filename=None):
        """
        Load a saved SessionStartupConfig from disk.

        @param filename  An absolute Unicode filename, if None, the default path will be used.
        @return SessionStartupConfig object
        """
        if not filename:
            # Then try to read from default location
            filename = SessionStartupConfig.get_default_config_filename(
                SessionStartupConfig.get_default_state_dir())
        if not os.path.isfile(filename):
            # No config on the default location, just start from scratch
            return SessionStartupConfig()

        # Class method, no locking required
        sessconfig = CallbackConfigParser()
        try:
            sessconfig.read_file(filename)
        except:
            raise IOError("Failed to open session config file")

        return SessionStartupConfig(sessconfig)
Exemplo n.º 21
0
 def load_download_pstate(self, filename):
     """ Called by any thread """
     pstate = CallbackConfigParser()
     pstate.read_file(filename)
     return pstate
Exemplo n.º 22
0
    def test_startup_session_save_load(self):
        sci = SessionStartupConfig(CallbackConfigParser())
        file_path = os.path.join(self.session_base_dir, "startupconfig.conf")
        sci.save(file_path)

        sci.load(file_path)
Exemplo n.º 23
0
    def test_session_config_init(self):
        sessconf = CallbackConfigParser()
        sessconf.add_section('mainline_dht')
        sessconf.set('mainline_dht', 'mainline_dht_port', 1234)
        sci = SessionConfigInterface(sessconf)
        self.assertTrue(sci)

        self.assertIsInstance(sci.get_listen_port(), int)
        self.assertIsInstance(sci.get_mainline_dht_listen_port(), int)
        self.assertIsInstance(sci.get_default_state_dir(), unicode)

        sci.set_state_dir(self.session_base_dir)
        self.assertEqual(sci.get_state_dir(), self.session_base_dir)

        default_log_dir = os.path.join(self.session_base_dir, "logs")
        self.assertEqual(sci.get_log_dir(), default_log_dir)

        sci.set_log_dir(self.LOG_DIR)
        self.assertEqual(sci.get_log_dir(), self.LOG_DIR)

        self.assertIsInstance(sci.get_install_dir(), (unicode, str))
        self.assertIsInstance(sci.get_permid_keypair_filename(), str)

        sci.set_listen_port(1337)
        self.assertEqual(sci.sessconfig.get('general', 'minport'), 1337)
        self.assertEqual(sci.sessconfig.get('general', 'maxport'), 1337)

        self.assertIsInstance(sci.get_tunnel_community_socks5_listen_ports(),
                              list)
        self.assertFalse(sci.get_tunnel_community_exitnode_enabled())

        sci.set_tunnel_community_enabled(False)
        self.assertFalse(sci.get_tunnel_community_enabled())

        sci.set_megacache(False)
        self.assertFalse(sci.get_megacache())

        sci.set_libtorrent(False)
        self.assertFalse(sci.get_libtorrent())

        sci.set_libtorrent_max_conn_download(5)
        self.assertEqual(sci.get_libtorrent_max_conn_download(), 5)

        sci.set_libtorrent_max_download_rate(200)
        self.assertEqual(sci.get_libtorrent_max_download_rate(), 200)

        sci.set_libtorrent_max_upload_rate(300)
        self.assertEqual(sci.get_libtorrent_max_upload_rate(), 300)

        sci.set_libtorrent_proxy_settings(3, ("127.0.0.1", 1337),
                                          ("foo", "bar"))
        self.assertEqual(sci.get_libtorrent_proxy_settings(),
                         (3, ("127.0.0.1", 1337), ("foo", "bar")))

        sci.set_anon_proxy_settings(5, ("127.0.0.1", 1337), ("foo", "bar"))
        self.assertEqual(sci.get_anon_proxy_settings(),
                         (5, ("127.0.0.1", 1337), ("foo", "bar")))

        sci.set_libtorrent_utp(False)
        self.assertFalse(sci.get_libtorrent_utp())

        sci.set_torrent_store(False)
        self.assertFalse(sci.get_torrent_store())

        sci.set_torrent_store_dir(self.session_base_dir)
        self.assertEqual(sci.get_torrent_store_dir(), self.session_base_dir)

        sci.set_torrent_collecting(False)
        self.assertFalse(sci.get_torrent_collecting())

        sci.set_dht_torrent_collecting(False)
        self.assertFalse(sci.get_dht_torrent_collecting())

        sci.set_torrent_collecting_max_torrents(1337)
        self.assertEqual(sci.get_torrent_collecting_max_torrents(), 1337)

        sci.set_torrent_collecting_dir(self.session_base_dir)
        self.assertEqual(sci.get_torrent_collecting_dir(),
                         self.session_base_dir)

        sci.set_torrent_checking(False)
        self.assertFalse(sci.get_torrent_checking())

        sci.set_stop_collecting_threshold(1337)
        self.assertEqual(sci.get_stop_collecting_threshold(), 1337)

        sci.set_nickname("foobar")
        self.assertEqual(sci.get_nickname(), "foobar")

        self.assertEqual(sci.get_mugshot(), (None, None))
        sci.set_mugshot("myimage", mime="image/png")
        self.assertEqual(sci.get_mugshot(), ("image/png", "myimage"))

        sci.set_peer_icon_path(self.session_base_dir)
        self.assertEqual(sci.get_peer_icon_path(), self.session_base_dir)

        sci.set_video_analyser_path(self.session_base_dir)
        self.assertEqual(sci.get_video_analyser_path(), self.session_base_dir)

        sci.set_mainline_dht(False)
        self.assertFalse(sci.get_mainline_dht())

        sci.set_mainline_dht_listen_port(1337)
        self.assertEqual(
            sci.sessconfig.get('mainline_dht', 'mainline_dht_port'), 1337)

        sci.set_multicast_local_peer_discovery(False)
        self.assertFalse(sci.get_multicast_local_peer_discovery())

        sci.set_dispersy(False)
        self.assertFalse(sci.get_dispersy())

        sci.set_dispersy_port(1337)
        self.assertIsInstance(sci.get_dispersy_port(), int)
        self.assertEqual(sci.sessconfig.get('dispersy', 'dispersy_port'), 1337)

        sci.set_videoserver_enabled(False)
        self.assertFalse(sci.get_videoserver_enabled())

        sci.set_videoplayer_path(self.session_base_dir)
        self.assertEqual(sci.get_videoplayer_path(), self.session_base_dir)

        sci.set_videoserver_port(1337)
        self.assertIsInstance(sci.get_videoserver_port(), int)
        self.assertEqual(sci.sessconfig.get('video', 'port'), 1337)

        sci.set_preferred_playback_mode(5)
        self.assertEqual(sci.get_preferred_playback_mode(), 5)

        sci.set_enable_torrent_search(False)
        self.assertFalse(sci.get_enable_torrent_search())

        sci.set_enable_channel_search(False)
        self.assertFalse(sci.get_enable_channel_search())

        sci.set_enable_metadata(False)
        self.assertFalse(sci.get_enable_metadata())

        sci.set_metadata_store_dir(self.session_base_dir)
        self.assertEqual(sci.get_metadata_store_dir(), self.session_base_dir)

        sci.set_channel_community_enabled(False)
        self.assertFalse(sci.get_channel_community_enabled())

        sci.set_preview_channel_community_enabled(False)
        self.assertFalse(sci.get_preview_channel_community_enabled())

        sci.set_http_api_enabled(True)
        self.assertTrue(sci.get_http_api_enabled())

        sci.set_http_api_port(1337)
        self.assertEqual(sci.sessconfig.get('http_api', 'port'), 1337)

        sci.set_resource_monitor_enabled(False)
        self.assertFalse(sci.get_resource_monitor_enabled())

        sci.set_resource_monitor_poll_interval(12)
        self.assertEqual(sci.get_resource_monitor_poll_interval(), 12)

        sci.set_resource_monitor_history_size(1234)
        self.assertEqual(sci.get_resource_monitor_history_size(), 1234)

        self.assertIsInstance(
            sci.get_default_config_filename(self.session_base_dir), str)
Exemplo n.º 24
0
    def __init__(self, sessconfig=None):
        """ Constructor.
        @param sessconfig Optional dictionary used internally
        to make this a copy constructor.
        """
        self._logger = logging.getLogger(self.__class__.__name__)

        self.selected_ports = {}
        self.sessconfig = sessconfig or CallbackConfigParser()

        # Poor man's versioning of SessionConfig, add missing default values.
        for section, sect_dict in sessdefaults.iteritems():
            if not self.sessconfig.has_section(section):
                self.sessconfig.add_section(section)
            for k, v in sect_dict.iteritems():
                if not self.sessconfig.has_option(section, k):
                    self.sessconfig.set(section, k, v)

        if not sessconfig:
            return

        # Set video_analyser_path
        if sys.platform == 'win32':
            ffmpegname = u"ffmpeg.exe"
        elif sys.platform == 'darwin':
            ffmpegname = u"ffmpeg"
        elif find_executable("avconv"):
            ffmpegname = u"avconv"
        else:
            ffmpegname = u"ffmpeg"

        ffmpegpath = find_executable(ffmpegname)
        if ffmpegpath is None:
            if sys.platform == 'darwin':
                self.sessconfig.set(u'general', u'videoanalyserpath',
                                    u"vlc/ffmpeg")
            elif is_android(strict=True):
                self.sessconfig.set(
                    u'general', u'videoanalyserpath',
                    os.path.join(os.environ['ANDROID_PRIVATE'], 'ffmpeg'))
            else:
                self.sessconfig.set(u'general', u'videoanalyserpath',
                                    ffmpegname)
        else:
            self.sessconfig.set(u'general', u'videoanalyserpath', ffmpegpath)

        # Set videoplayer path
        if sys.platform == 'win32':
            videoplayerpath = os.path.expandvars(
                '${PROGRAMFILES}') + '\\Windows Media Player\\wmplayer.exe'
        elif sys.platform == 'darwin':
            videoplayerpath = find_executable("vlc") or (
                "/Applications/VLC.app"
                if os.path.exists("/Applications/VLC.app") else
                None) or "/Applications/QuickTime Player.app"
        else:
            videoplayerpath = find_executable("vlc") or "vlc"

        self.sessconfig.set(u'video', u'path', videoplayerpath)

        self.sessconfig.set(u'general', u'ipv6_binds_v4',
                            autodetect_socket_style())
Exemplo n.º 25
0
 def load(filename):
     dlconfig = CallbackConfigParser()
     dlconfig.read_file(filename)
     return DefaultDownloadStartupConfig(dlconfig)
Exemplo n.º 26
0
    def __init__(self, sessconfig=None):
        """ Constructor.
        @param sessconfig Optional dictionary used internally
        to make this a copy constructor.
        """
        self._logger = logging.getLogger(self.__class__.__name__)

        self.selected_ports = {}
        self.sessconfig = sessconfig or CallbackConfigParser()

        # Poor man's versioning of SessionConfig, add missing default values.
        for section, sect_dict in sessdefaults.iteritems():
            if not self.sessconfig.has_section(section):
                self.sessconfig.add_section(section)
            for k, v in sect_dict.iteritems():
                if not self.sessconfig.has_option(section, k):
                    self.sessconfig.set(section, k, v)

        if not sessconfig:
            return

        if sys.platform == 'win32':
            # TODO(emilon): This is to work around the case where windows has
            # non-ASCI chars on %PATH% contents. Should be removed if we migrate to
            # python 3.
            from Tribler.Main.hacks import get_environment_variable
            path_env = get_environment_variable(u"PATH")
        elif is_android():
            path_env = unicode(os.environ["PYTHONPATH"])
        else:
            path_env = os.environ["PATH"]

        # Set video_analyser_path
        if sys.platform == 'win32':
            ffmpegname = u"ffmpeg.exe"
        elif sys.platform == 'darwin':
            ffmpegname = u"ffmpeg"
        elif find_executable("avconv", path_env):
            ffmpegname = u"avconv"
        else:
            ffmpegname = u"ffmpeg"

        ffmpegpath = find_executable(ffmpegname, path_env)

        if ffmpegpath is None:
            if sys.platform == 'darwin':
                self.sessconfig.set(u'general', u'videoanalyserpath',
                                    u"vlc/ffmpeg")
            else:
                self.sessconfig.set(u'general', u'videoanalyserpath',
                                    os.path.abspath(ffmpegname))
        else:
            self.sessconfig.set(u'general', u'videoanalyserpath',
                                os.path.abspath(ffmpegpath))

        # Set videoplayer path
        if sys.platform == 'win32':
            videoplayerpath = os.path.expandvars(
                '${PROGRAMFILES}') + '\\Windows Media Player\\wmplayer.exe'
        elif sys.platform == 'darwin':
            videoplayerpath = find_executable("vlc") or (
                "/Applications/VLC.app"
                if os.path.exists("/Applications/VLC.app") else
                None) or "/Applications/QuickTime Player.app"
        else:
            videoplayerpath = find_executable("vlc") or "vlc"

        self.sessconfig.set(u'video', u'path', videoplayerpath)

        self.sessconfig.set(u'general', u'ipv6_binds_v4',
                            autodetect_socket_style())