deduplicate download opening code

This commit is contained in:
Daniel Schadt 2017-01-04 15:31:47 +01:00
parent 8c5ad7d46d
commit 4fdd3cd761
3 changed files with 47 additions and 57 deletions

View File

@ -20,7 +20,6 @@
"""Shared QtWebKit/QtWebEngine code for downloads.""" """Shared QtWebKit/QtWebEngine code for downloads."""
import sys import sys
import shlex
import html import html
import os.path import os.path
import collections import collections
@ -30,13 +29,11 @@ import tempfile
import sip import sip
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QObject, QUrl, QModelIndex, from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QObject, QUrl, QModelIndex,
QTimer, QAbstractListModel) QTimer, QAbstractListModel)
from PyQt5.QtGui import QDesktopServices
from qutebrowser.commands import cmdexc, cmdutils from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import (usertypes, standarddir, utils, message, log, from qutebrowser.utils import (usertypes, standarddir, utils, message, log,
qtutils) qtutils)
from qutebrowser.misc import guiprocess
ModelRole = usertypes.enum('ModelRole', ['item'], start=Qt.UserRole, ModelRole = usertypes.enum('ModelRole', ['item'], start=Qt.UserRole,
@ -532,31 +529,7 @@ class AbstractDownloadItem(QObject):
if filename is None: # pragma: no cover if filename is None: # pragma: no cover
log.downloads.error("No filename to open the download!") log.downloads.error("No filename to open the download!")
return return
utils.open_file(filename, cmdline)
# the default program to open downloads with - will be empty string
# if we want to use the default
override = config.get('general', 'default-open-dispatcher')
# precedence order: cmdline > default-open-dispatcher > openUrl
if cmdline is None and not override:
log.downloads.debug("Opening {} with the system application"
.format(filename))
url = QUrl.fromLocalFile(filename)
QDesktopServices.openUrl(url)
return
if cmdline is None and override:
cmdline = override
cmd, *args = shlex.split(cmdline)
args = [arg.replace('{}', filename) for arg in args]
if '{}' not in cmdline:
args.append(filename)
log.downloads.debug("Opening {} with {}"
.format(filename, [cmd] + args))
proc = guiprocess.GUIProcess(what='download')
proc.start_detached(cmd, args)
def _ensure_can_set_filename(self, filename): def _ensure_can_set_filename(self, filename):
"""Make sure we can still set a filename.""" """Make sure we can still set a filename."""

View File

@ -35,12 +35,10 @@ import email.message
import quopri import quopri
from PyQt5.QtCore import QUrl from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from qutebrowser.browser import downloads from qutebrowser.browser import downloads
from qutebrowser.browser.webkit import webkitelem from qutebrowser.browser.webkit import webkitelem
from qutebrowser.utils import log, objreg, message, usertypes, utils, urlutils from qutebrowser.utils import log, objreg, message, usertypes, utils, urlutils
from qutebrowser.config import config
_File = collections.namedtuple('_File', _File = collections.namedtuple('_File',
['content', 'content_type', 'content_location', ['content', 'content_type', 'content_location',
@ -490,31 +488,7 @@ class _Downloader:
message.info("Page saved as {}".format(self.target)) message.info("Page saved as {}".format(self.target))
if isinstance(self.target, downloads.OpenFileDownloadTarget): if isinstance(self.target, downloads.OpenFileDownloadTarget):
filename = fobj.name utils.open_file(fobj.name, self.target.cmdline)
# the default program to open downloads with - will be empty string
# if we want to use the default
override = config.get('general', 'default-open-dispatcher')
cmdline = self.target.cmdline
# precedence order: cmdline > default-open-dispatcher > openUrl
if cmdline is None and not override:
log.downloads.debug("Opening {} with the system application"
.format(filename))
url = QUrl.fromLocalFile(filename)
QDesktopServices.openUrl(url)
return
if cmdline is None and override:
cmdline = override
cmd, *args = shlex.split(cmdline)
args = [arg.replace('{}', filename) for arg in args]
if '{}' not in cmdline:
args.append(filename)
log.downloads.debug("Opening {} with {}"
.format(filename, [cmd] + args))
proc = guiprocess.GUIProcess(what='download')
proc.start_detached(cmd, args)
def _collect_zombies(self): def _collect_zombies(self):
"""Collect done downloads and add their data to the MHTML file. """Collect done downloads and add their data to the MHTML file.

View File

@ -29,14 +29,17 @@ import functools
import contextlib import contextlib
import itertools import itertools
import socket import socket
import shlex
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtGui import QKeySequence, QColor, QClipboard from PyQt5.QtGui import QKeySequence, QColor, QClipboard, QDesktopServices
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
import pkg_resources import pkg_resources
import qutebrowser import qutebrowser
from qutebrowser.utils import qtutils, log from qutebrowser.utils import qtutils, log
from qutebrowser.misc import guiprocess
from qutebrowser.config import config
fake_clipboard = None fake_clipboard = None
@ -825,3 +828,43 @@ def random_port():
port = sock.getsockname()[1] port = sock.getsockname()[1]
sock.close() sock.close()
return port return port
def open_file(filename, cmdline=None):
"""Open the given file.
If cmdline is not given, general->default-open-dispatcher is used.
If default-open-dispatcher is unset, the system's default application is
used.
Args:
filename: The filename to open.
cmdline: The command to use as string. A `{}` is expanded to the
filename. None means to use the system's default application
or `default-open-dispatcher` if set. If no `{}` is found, the
filename is appended to the cmdline.
"""
# the default program to open downloads with - will be empty string
# if we want to use the default
override = config.get('general', 'default-open-dispatcher')
# precedence order: cmdline > default-open-dispatcher > openUrl
if cmdline is None and not override:
log.misc.debug("Opening {} with the system application"
.format(filename))
url = QUrl.fromLocalFile(filename)
QDesktopServices.openUrl(url)
return
if cmdline is None and override:
cmdline = override
cmd, *args = shlex.split(cmdline)
args = [arg.replace('{}', filename) for arg in args]
if '{}' not in cmdline:
args.append(filename)
log.misc.debug("Opening {} with {}"
.format(filename, [cmd] + args))
proc = guiprocess.GUIProcess(what='open-file')
proc.start_detached(cmd, args)