summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.rst22
-rw-r--r--PKG-INFO10
-rw-r--r--README.rst3
-rw-r--r--RELEASE_NOTES.rst4
-rw-r--r--data/net.damonlynch.rapid-photo-downloader.appdata.xml.in8
-rwxr-xr-xinstall.py70
-rw-r--r--po/de.po649
-rw-r--r--raphodo/__about__.py2
-rw-r--r--raphodo/cache.py17
-rw-r--r--raphodo/devicedisplay.py104
-rw-r--r--raphodo/jobcodepanel.py52
-rwxr-xr-xraphodo/rapid.py14
-rwxr-xr-xraphodo/rpdsql.py9
-rw-r--r--rapid_photo_downloader.egg-info/PKG-INFO10
-rw-r--r--rapid_photo_downloader.egg-info/requires.txt11
-rw-r--r--setup.py13
-rw-r--r--upgrade.py40
17 files changed, 605 insertions, 433 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index ade7630..75a4f60 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,6 +1,28 @@
Changelog for Rapid Photo Downloader
====================================
+0.9.10 (2018-07-29)
+-------------------
+
+ - Fix bug #1784175: Make application compatible with changes to sip
+ introduced in PyQt 5.11, and do not install PyQt 5.11 on systems with
+ Python 3.5.3 or older.
+
+ - Fix bug #1775654: optional dependencies listed in setup.py as required.
+
+ - Fix bug #1755915: Crash while accessing non-existant SQL database 'cache'
+ while exiting.
+
+ - Fix bug #1764167: Division by zero error when scanning device that does not
+ report its size
+
+ - Fix bug #1774411: splash screen covering name-dialog when set to auto-
+ download
+
+ - Fixed bug in Appstream specification.
+
+ - Updated German translation.
+
0.9.9 (2018-03-08)
------------------
diff --git a/PKG-INFO b/PKG-INFO
index 4243871..2adc5fa 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
Name: rapid-photo-downloader
-Version: 0.9.9
+Version: 0.9.10
Summary: Downloads, renames and backs up photos and videos from cameras, phones, memory cards and other devices
Home-page: http://www.damonlynch.net/rapid
Author: Damon Lynch
@@ -158,8 +158,7 @@ Description: Rapid Photo Downloader
------------
After `satisfying software requirements`_ using your Linux distribution's standard package
- installation tools, you should install Rapid Photo Downloader using the following steps, assuming
- you use sudo to get super-user (root) access.
+ installation tools, you should install Rapid Photo Downloader using the following steps.
First, you may need to update your user's copy of pip and setuptools:
@@ -227,5 +226,8 @@ Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Video
+Provides-Extra: color_ouput
+Provides-Extra: progress_bar
diff --git a/README.rst b/README.rst
index 7db9761..ca09bbf 100644
--- a/README.rst
+++ b/README.rst
@@ -150,8 +150,7 @@ Installation
------------
After `satisfying software requirements`_ using your Linux distribution's standard package
-installation tools, you should install Rapid Photo Downloader using the following steps, assuming
-you use sudo to get super-user (root) access.
+installation tools, you should install Rapid Photo Downloader using the following steps.
First, you may need to update your user's copy of pip and setuptools:
diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst
index e3a0d8a..7e3c5f0 100644
--- a/RELEASE_NOTES.rst
+++ b/RELEASE_NOTES.rst
@@ -1,5 +1,5 @@
-Release Notes for Rapid Photo Downloader 0.9.9
-==============================================
+Release Notes for Rapid Photo Downloader 0.9.10
+===============================================
- If you installed Rapid Photo Downloader using the install script, you can
update it one of two ways: using the install script again, or using the
diff --git a/data/net.damonlynch.rapid-photo-downloader.appdata.xml.in b/data/net.damonlynch.rapid-photo-downloader.appdata.xml.in
index f83e18d..40c6ef7 100644
--- a/data/net.damonlynch.rapid-photo-downloader.appdata.xml.in
+++ b/data/net.damonlynch.rapid-photo-downloader.appdata.xml.in
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2014-2017 Damon Lynch <damonlynch@gmail.com> -->
-<application>
- <id type="desktop">net.damonlynch.rapid-photo-downloader</id>
+<!-- Copyright 2014-2018 Damon Lynch <damonlynch@gmail.com> -->
+<component type="desktop-application">
+ <id>net.damonlynch.rapid-photo-downloader</id>
<provides>
<id>rapid-photo-downloader.desktop</id>
<binary>rapid-photo-downloader</binary>
@@ -67,4 +67,4 @@
</screenshot>
</screenshots>
<updatecontact>damonlynch@gmail.com</updatecontact>
-</application>
+</component>
diff --git a/install.py b/install.py
index d3c8e6f..c9f95a2 100755
--- a/install.py
+++ b/install.py
@@ -61,7 +61,7 @@ from gettext import gettext as _
import gettext
-__version__ = '0.1.9'
+__version__ = '0.2.0'
__title__ = _('Rapid Photo Downloader installer')
__description__ = _("Download and install latest version of Rapid Photo Downloader.")
@@ -313,7 +313,40 @@ def pypi_pyqt5_capable() -> bool:
else False.
"""
- return platform.machine() == 'x86_64' and platform.python_version_tuple()[1] in ('5', '6')
+ return platform.machine() == 'x86_64' and StrictVersion(platform.python_version()) >= StrictVersion('3.5.0')
+
+
+def pyqt_511_2_compatible() -> bool:
+ """
+ Python 3.5.3 or older fail to run with PyQt 5.11.2
+
+ :return: True if this python version is compatible with PyQt 5.11.2
+ """
+
+ return StrictVersion(platform.python_version()) > StrictVersion('3.5.3')
+
+
+def pypi_pyqt5_version() -> bytes:
+ """
+ :return: bytes containing correct version of PyQt5 to install from PyPi
+ """
+
+ if not pyqt_511_2_compatible():
+ return b'PyQt5==5.10'
+ else:
+ return b'PyQt5>=5.11'
+
+
+def uninstall_incompatible_pyqt5() -> None:
+ """
+ If a version of PyQt > 5.10 is installed using pip on a system with
+ Python 3.5.3 or older, uninstall PyQt5
+ """
+
+ if not pyqt_511_2_compatible():
+ version = python_package_version('PyQt5')
+ if version and StrictVersion(version) > StrictVersion('5.10'):
+ uninstall_pip_package(package='PyQt5', no_deps_only=False)
def make_pip_command(args: str, split: bool=True):
@@ -440,7 +473,7 @@ def match_pyqt5_and_sip():
def pip_package(package: str, local_pip: bool) -> str:
"""
- Helper function to construct installing core pythong packages
+ Helper function to construct installing core python packages
:param package: the python package
:param local_pip: if True, install the package using pip and Pypi,
else install using the Linux distribution package tools.
@@ -670,7 +703,7 @@ def opensuse_missing_packages(packages: str):
]
-def opensuse_package_installed(package) -> bool:
+def opensuse_package_installed(package: str) -> bool:
"""
:param package: package to check
:return: True if the package is installed in the openSUSE distribution, else False
@@ -678,6 +711,15 @@ def opensuse_package_installed(package) -> bool:
return not opensuse_missing_packages(package)
+def package_in_pip_output(package: str, output: str) -> bool:
+ """
+ Determine if a package is found in the output of packages installed by pip
+ :param package:
+ :param output:
+ :return: True if found, False otherwise
+ """
+ return re.search('^{}\s'.format(package), output, re.IGNORECASE | re.MULTILINE) is not None
+
def uninstall_pip_package(package: str, no_deps_only: bool) -> None:
"""
@@ -705,7 +747,7 @@ def uninstall_pip_package(package: str, no_deps_only: bool) -> None:
while True:
try:
output = subprocess.check_output(l_args, universal_newlines=True)
- if package in output:
+ if package_in_pip_output(package, output):
try:
subprocess.check_call(u_args)
except subprocess.CalledProcessError:
@@ -722,7 +764,12 @@ def uninstall_with_deps():
packages = 'psutil gphoto2 pyzmq pyxdg arrow python-dateutil rawkit PyPrind colorlog easygui ' \
'colour pymediainfo sortedcontainers requests tornado'
if pypi_pyqt5_capable():
- packages = '{} PyQt5 sip'.format(packages)
+ version = python_package_version('PyQt5')
+
+ if version and StrictVersion(version) < StrictVersion('5.11'):
+ packages = '{} PyQt5 sip'.format(packages)
+ else:
+ packages = '{} PyQt5 PyQt5_sip'.format(packages)
for package in packages.split():
uninstall_pip_package(package, no_deps_only=True)
@@ -872,7 +919,10 @@ def install_required_distro_packages(distro: Distro,
'gir1.2-udisks-2.0 gir1.2-notify-0.7 gir1.2-glib-2.0 gir1.2-gstreamer-1.0 '\
'libgphoto2-dev python3-arrow python3-psutil g++ libmediainfo0v5 '\
'python3-zmq exiv2 python3-colorlog libraw-bin ' \
- 'python3-easygui python3-sortedcontainers python3-tornado'
+ 'python3-easygui python3-sortedcontainers python3-tornado python3-setuptools python3-wheel'
+
+ # For some strange reason, setuptools and wheel must be manually specified on Linux Mint
+ # It's odd because sometimes setuptools imports even without this package, and other times, it doesn't
if not pypi_pyqt5_capable():
packages = 'qt5-image-formats-plugins python3-pyqt5 {}'.format(packages)
@@ -1433,7 +1483,11 @@ def do_install(installer: str,
with tar.extractfile(tarfile_content_name(installer, 'requirements.txt')) as requirements:
reqbytes = requirements.read()
if pypi_pyqt5_capable():
- reqbytes = reqbytes.rstrip() + b'\nPyQt5>=5.9.2'
+
+ # Possibily remove an incompatible version of PyQt installed via pip
+ uninstall_incompatible_pyqt5()
+
+ reqbytes = reqbytes.rstrip() + b'\n' + pypi_pyqt5_version()
with tempfile.NamedTemporaryFile(delete=False) as temp_requirements:
temp_requirements.write(reqbytes)
diff --git a/po/de.po b/po/de.po
index 0dcf6ba..7841bf7 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: rapid\n"
"Report-Msgid-Bugs-To: damonlynch@gmail.com\n"
-"POT-Creation-Date: 2018-02-14 16:23+0000\n"
-"PO-Revision-Date: 2018-02-14 18:12+0000\n"
-"Last-Translator: Tobias Bannert <tobannert@gmail.com>\n"
+"POT-Creation-Date: 2018-03-09 00:05+0000\n"
+"PO-Revision-Date: 2018-05-05 17:47+0000\n"
+"Last-Translator: Spheniscus <Unknown>\n"
"Language-Team: German <de@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2018-02-18 19:32+0000\n"
-"X-Generator: Launchpad (build 18553)\n"
+"X-Launchpad-Export-Date: 2018-07-30 03:12+0000\n"
+"X-Generator: Launchpad (build 18737)\n"
"Language: de\n"
#: ../install.py:65
@@ -608,14 +608,14 @@ msgid "%(size_free)s free of %(size_total)s"
msgstr "%(size_free)s frei von %(size_total)s"
#: ../raphodo/destinationdisplay.py:190 ../raphodo/devicedisplay.py:993
-#: ../raphodo/rapid.py:2044 ../raphodo/rapid.py:2172 ../raphodo/rapid.py:6073
+#: ../raphodo/rapid.py:2047 ../raphodo/rapid.py:2175 ../raphodo/rapid.py:6091
#: ../raphodo/rpdfile.py:930
msgid "Photos"
msgstr "Fotos"
#. translators: the name of the Videos folder
#: ../raphodo/destinationdisplay.py:191 ../raphodo/devicedisplay.py:994
-#: ../raphodo/rapid.py:2049 ../raphodo/rapid.py:2173 ../raphodo/rapid.py:6074
+#: ../raphodo/rapid.py:2052 ../raphodo/rapid.py:2176 ../raphodo/rapid.py:6092
#: ../raphodo/rpdfile.py:958 ../raphodo/storage.py:472
msgid "Videos"
msgstr "Filme"
@@ -667,8 +667,8 @@ msgid "Cameras"
msgstr "Kameras"
#: ../raphodo/devices.py:464 ../raphodo/devices.py:927
-#: ../raphodo/preferencedialog.py:108 ../raphodo/preferencedialog.py:118
-#: ../raphodo/rapid.py:2000
+#: ../raphodo/preferencedialog.py:110 ../raphodo/preferencedialog.py:120
+#: ../raphodo/rapid.py:2003
msgid "Devices"
msgstr "Geräte"
@@ -683,7 +683,7 @@ msgstr "Von %(device_names)s wird heruntergeladen"
msgid "%(no_devices)s %(device_type)s"
msgstr "%(no_devices)s %(device_type)s"
-#: ../raphodo/devices.py:912 ../raphodo/rapid.py:1828
+#: ../raphodo/devices.py:912 ../raphodo/rapid.py:1831
msgid "Select Source"
msgstr "Quelle auswählen"
@@ -1691,11 +1691,11 @@ msgstr "Datum & Uhrzeit"
msgid "Text"
msgstr "Text"
-#: ../raphodo/generatenameconfig.py:193 ../raphodo/rapid.py:2146
+#: ../raphodo/generatenameconfig.py:193 ../raphodo/rapid.py:2149
msgid "Filename"
msgstr "Dateiname"
-#: ../raphodo/generatenameconfig.py:194 ../raphodo/preferencedialog.py:724
+#: ../raphodo/generatenameconfig.py:194 ../raphodo/preferencedialog.py:727
msgid "Metadata"
msgstr "Metadaten"
@@ -1739,7 +1739,7 @@ msgstr "Name"
#. Translators: for an explanation of what this means,
#. see http://damonlynch.net/rapid/documentation/index.html#renamefilename
-#: ../raphodo/generatenameconfig.py:211 ../raphodo/rapid.py:2147
+#: ../raphodo/generatenameconfig.py:211 ../raphodo/rapid.py:2150
msgid "Extension"
msgstr "Erweiterung"
@@ -2150,7 +2150,7 @@ msgid "YYYYMM"
msgstr "JJJJMM"
#: ../raphodo/generatenameconfig.py:398 ../raphodo/jobcodepanel.py:199
-#: ../raphodo/nameeditor.py:848 ../raphodo/rapid.py:1873
+#: ../raphodo/nameeditor.py:848 ../raphodo/rapid.py:1876
#: ../raphodo/renamepanel.py:83 ../raphodo/renamepanel.py:246
msgid "Job Code"
msgstr "Auftragscode"
@@ -2318,11 +2318,11 @@ msgstr "Zuletzt verwendet"
msgid "Job Code Sort:"
msgstr "Auftragscodesortierung:"
-#: ../raphodo/jobcodepanel.py:206 ../raphodo/rapid.py:2154
+#: ../raphodo/jobcodepanel.py:206 ../raphodo/rapid.py:2157
msgid "Ascending"
msgstr "Aufsteigend"
-#: ../raphodo/jobcodepanel.py:207 ../raphodo/rapid.py:2155
+#: ../raphodo/jobcodepanel.py:207 ../raphodo/rapid.py:2158
msgid "Descending"
msgstr "Absteigend"
@@ -2338,8 +2338,8 @@ msgstr "&Anwenden"
msgid "&Remove"
msgstr "Entfe&rnen"
-#: ../raphodo/jobcodepanel.py:229 ../raphodo/preferencedialog.py:200
-#: ../raphodo/preferencedialog.py:229 ../raphodo/preferencedialog.py:531
+#: ../raphodo/jobcodepanel.py:229 ../raphodo/preferencedialog.py:202
+#: ../raphodo/preferencedialog.py:231 ../raphodo/preferencedialog.py:533
msgid "Remove All"
msgstr "Alle entfernen"
@@ -2457,7 +2457,7 @@ msgstr "Voreinstellung:"
msgid "{choice} ({variant})"
msgstr "{choice} ({variant})"
-#: ../raphodo/nameeditor.py:1030 ../raphodo/preferencedialog.py:783
+#: ../raphodo/nameeditor.py:1030 ../raphodo/preferencedialog.py:787
msgid "Get help online..."
msgstr "Im Netz Hilfe erhalten …"
@@ -2555,44 +2555,44 @@ msgstr "%(downloaded)s von %(total)s"
msgid "Downloading..."
msgstr "Wird heruntergeladen …"
-#: ../raphodo/preferencedialog.py:86
+#: ../raphodo/preferencedialog.py:88
msgid "Preferences"
msgstr "Einstellungen"
-#: ../raphodo/preferencedialog.py:108 ../raphodo/preferencedialog.py:118
+#: ../raphodo/preferencedialog.py:110 ../raphodo/preferencedialog.py:120
msgid "Automation"
msgstr "Automatisierung"
-#: ../raphodo/preferencedialog.py:108 ../raphodo/preferencedialog.py:118
+#: ../raphodo/preferencedialog.py:110 ../raphodo/preferencedialog.py:120
msgid "Thumbnails"
msgstr "Vorschaubilder"
-#: ../raphodo/preferencedialog.py:108 ../raphodo/preferencedialog.py:118
-#: ../raphodo/preferencedialog.py:428
+#: ../raphodo/preferencedialog.py:110 ../raphodo/preferencedialog.py:120
+#: ../raphodo/preferencedialog.py:430
msgid "Error Handling"
msgstr "Fehlerbehandlung"
-#: ../raphodo/preferencedialog.py:108 ../raphodo/preferencedialog.py:118
+#: ../raphodo/preferencedialog.py:110 ../raphodo/preferencedialog.py:120
msgid "Warnings"
msgstr "Warnungen"
-#: ../raphodo/preferencedialog.py:109
+#: ../raphodo/preferencedialog.py:111
msgid "Consolidation"
msgstr "Zusammenfassung"
-#: ../raphodo/preferencedialog.py:109 ../raphodo/preferencedialog.py:119
+#: ../raphodo/preferencedialog.py:111 ../raphodo/preferencedialog.py:121
msgid "Miscellaneous"
msgstr "Verschiedenes"
-#: ../raphodo/preferencedialog.py:147
+#: ../raphodo/preferencedialog.py:149
msgid "Device Scanning"
msgstr "Gerätedurchsuchung"
-#: ../raphodo/preferencedialog.py:148
+#: ../raphodo/preferencedialog.py:150
msgid "Scan only external devices"
msgstr "Nur externe Geräte durchsuchen"
-#: ../raphodo/preferencedialog.py:150
+#: ../raphodo/preferencedialog.py:152
msgid ""
"Scan for photos and videos only on devices that are external to the "
"computer,\n"
@@ -2602,11 +2602,11 @@ msgstr ""
"einschließlich Kameras, Speicherkarten, externer Laufwerke und USB-"
"Speichermedien."
-#: ../raphodo/preferencedialog.py:153
+#: ../raphodo/preferencedialog.py:155
msgid "Scan only specific folders on devices"
msgstr "Durchsuche nur spezifische Ordner auf Geräten"
-#: ../raphodo/preferencedialog.py:155
+#: ../raphodo/preferencedialog.py:157
msgid ""
"Scan for photos and videos only in the folders specified below (except "
"paths\n"
@@ -2619,11 +2619,11 @@ msgstr ""
"\n"
"Änderung dieser Einstellung führt zum erneuten Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:161
+#: ../raphodo/preferencedialog.py:163
msgid "Folders to scan:"
msgstr "Ordner, die durchsucht werden sollen:"
-#: ../raphodo/preferencedialog.py:164
+#: ../raphodo/preferencedialog.py:166
msgid ""
"Folders at the base level of device file systems that will be scanned\n"
"for photos and videos."
@@ -2631,11 +2631,11 @@ msgstr ""
"Ordner auf Wurzelebene von Dateisystemen der Geräte, die nach\n"
"Fotos und Videos durchsucht werden."
-#: ../raphodo/preferencedialog.py:167 ../raphodo/preferencedialog.py:219
+#: ../raphodo/preferencedialog.py:169 ../raphodo/preferencedialog.py:221
msgid "Add..."
msgstr "Hinzufügen …"
-#: ../raphodo/preferencedialog.py:169
+#: ../raphodo/preferencedialog.py:171
msgid ""
"Add a folder to the list of folders to scan for photos and videos.\n"
"\n"
@@ -2646,12 +2646,12 @@ msgstr ""
"\n"
"Änderung dieser Einstellung führt zum erneuten Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:172 ../raphodo/preferencedialog.py:198
-#: ../raphodo/preferencedialog.py:224 ../raphodo/preferencedialog.py:529
+#: ../raphodo/preferencedialog.py:174 ../raphodo/preferencedialog.py:200
+#: ../raphodo/preferencedialog.py:226 ../raphodo/preferencedialog.py:531
msgid "Remove"
msgstr "Entfernen"
-#: ../raphodo/preferencedialog.py:174
+#: ../raphodo/preferencedialog.py:176
msgid ""
"Remove a folder from the list of folders to scan for photos and videos.\n"
"\n"
@@ -2662,15 +2662,15 @@ msgstr ""
"\n"
"Änderung dieser Einstellung führt zum erneuten Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:191
+#: ../raphodo/preferencedialog.py:193
msgid "Devices that have been set to automatically ignore or download from."
msgstr "Geräte, die automatisch ignoriert oder berücksichtigt werden sollen."
-#: ../raphodo/preferencedialog.py:192
+#: ../raphodo/preferencedialog.py:194
msgid "Remembered Devices"
msgstr "Gemerkte Geräte"
-#: ../raphodo/preferencedialog.py:196
+#: ../raphodo/preferencedialog.py:198
msgid ""
"Remove a device from the list of devices to automatically ignore or download "
"from."
@@ -2678,7 +2678,7 @@ msgstr ""
"Gerät entfernen aus der Liste von Geräten, die automatisch ignoriert oder "
"berücksichtigt werden sollen."
-#: ../raphodo/preferencedialog.py:202
+#: ../raphodo/preferencedialog.py:204
msgid ""
"Clear the list of devices from which to automatically ignore or download "
"from.\n"
@@ -2691,18 +2691,18 @@ msgstr ""
"Hinweis: Änderungen werden wirksam beim nächsten Durchsuchen des Rechners "
"nach Geräten."
-#: ../raphodo/preferencedialog.py:215
+#: ../raphodo/preferencedialog.py:217
msgid "Ignored Paths"
msgstr "Pfade ignorieren"
-#: ../raphodo/preferencedialog.py:216
+#: ../raphodo/preferencedialog.py:218
msgid ""
"The end part of a path that should never be scanned for photos or videos."
msgstr ""
"Letzter Teil eines Pfades, der niemals nach Fotos oder Videos durchsucht "
"werden soll."
-#: ../raphodo/preferencedialog.py:221
+#: ../raphodo/preferencedialog.py:223
msgid ""
"Add a path to the list of paths to ignore.\n"
"\n"
@@ -2712,7 +2712,7 @@ msgstr ""
"\n"
"Änderung dieser Einstellung erfordert ein erneutes Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:226
+#: ../raphodo/preferencedialog.py:228
msgid ""
"Remove a path from the list of paths to ignore.\n"
"\n"
@@ -2722,7 +2722,7 @@ msgstr ""
"\n"
"Änderung dieser Einstellung erfordert ein erneutes Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:231
+#: ../raphodo/preferencedialog.py:233
msgid ""
"Clear the list of paths to ignore.\n"
"\n"
@@ -2732,7 +2732,7 @@ msgstr ""
"\n"
"Änderung dieser Einstellung erfordert ein erneutes Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:239
+#: ../raphodo/preferencedialog.py:241
msgid ""
"Use python-style <a "
"href=\"http://damonlynch.net/rapid/documentation/#regularexpressions\">regula"
@@ -2742,7 +2742,7 @@ msgstr ""
"href=\"http://damonlynch.net/rapid/documentation/#regularexpressions\">regula"
"r expressions</a> im Python-Stil"
-#: ../raphodo/preferencedialog.py:243
+#: ../raphodo/preferencedialog.py:245
msgid ""
"Use regular expressions in the list of ignored paths.\n"
"\n"
@@ -2752,57 +2752,59 @@ msgstr ""
"\n"
"Änderung dieser Einstellung erfordert ein erneutes Durchsuchen aller Geräte."
-#: ../raphodo/preferencedialog.py:283
+#: ../raphodo/preferencedialog.py:285
msgid "Program Automation"
msgstr "Programmautomatisierung"
-#: ../raphodo/preferencedialog.py:284
+#: ../raphodo/preferencedialog.py:286
msgid "Start downloading at program startup"
msgstr "Herunterladen beim Programmstart beginnen"
-#: ../raphodo/preferencedialog.py:285
+#: ../raphodo/preferencedialog.py:287
msgid "Start downloading upon device insertion"
msgstr "Mit dem Herunterladen beginnen, sobald ein Geräte verfügbar ist"
-#: ../raphodo/preferencedialog.py:286
+#: ../raphodo/preferencedialog.py:288
msgid "Unmount (eject) device upon download completion"
msgstr "Gerät nach Abschluss der Übertragung aushängen"
-#: ../raphodo/preferencedialog.py:287
+#: ../raphodo/preferencedialog.py:289
msgid "Exit program when download completes"
msgstr "Programm beenden wenn alle Übertragungen abgeschlossen sind"
-#: ../raphodo/preferencedialog.py:288
+#: ../raphodo/preferencedialog.py:290
msgid "Exit program even if download had warnings or errors"
msgstr "Programm beenden auch wenn Fehler oder Warnungen aufgetreten sind"
-#: ../raphodo/preferencedialog.py:315
+#: ../raphodo/preferencedialog.py:317
msgid "Thumbnail Generation"
msgstr "Vorschaubildgenerierung"
-#: ../raphodo/preferencedialog.py:316
+#: ../raphodo/preferencedialog.py:318
msgid "Generate thumbnails"
msgstr "Vorschaubilder generieren"
-#: ../raphodo/preferencedialog.py:318
+#: ../raphodo/preferencedialog.py:320
msgid "Generate thumbnails to show in the main program window"
msgstr "Erzeuge Vorschaubilder zur Anzeige im Hauptfenster"
-#: ../raphodo/preferencedialog.py:320
+#: ../raphodo/preferencedialog.py:322
msgid "Cache thumbnails"
msgstr "Vorschaubilder zwischenspeichern"
-#: ../raphodo/preferencedialog.py:323
+#: ../raphodo/preferencedialog.py:325
msgid ""
"Save thumbnails shown in the main program window in a thumbnail cache unique "
"to Rapid Photo Downloader"
msgstr ""
+"Speichere im Hauptfenster gezeigte Vorschaubilder in einem Zwischenspeicher "
+"wie bei Rapid Photo Downloader"
-#: ../raphodo/preferencedialog.py:327
+#: ../raphodo/preferencedialog.py:329
msgid "Generate system thumbnails"
msgstr "Systemvorschaubilder generieren"
-#: ../raphodo/preferencedialog.py:330
+#: ../raphodo/preferencedialog.py:332
msgid ""
"While downloading, save thumbnails that can be used by desktop file managers "
"and other programs"
@@ -2810,79 +2812,79 @@ msgstr ""
"Speichere während der Übertragung Vorschaubilder, die von Desktop-"
"Dateimanagern und anderen Programmen verwendet werden können"
-#: ../raphodo/preferencedialog.py:339
+#: ../raphodo/preferencedialog.py:341
msgid "Number of CPU cores used to generate thumbnails."
msgstr ""
"Anzahl der CPU-Kerne, die zur Generierung von Vorschaubildern verwendet "
"werden."
-#: ../raphodo/preferencedialog.py:340
+#: ../raphodo/preferencedialog.py:342
msgid "CPU cores:"
msgstr "CPU-Kerne:"
#. Translators: the * acts as an asterisk to denote a reference to an annotation
#. such as '* Takes effect upon program restart'
-#: ../raphodo/preferencedialog.py:355 ../raphodo/preferencedialog.py:401
+#: ../raphodo/preferencedialog.py:357 ../raphodo/preferencedialog.py:403
msgid "*"
msgstr "*"
-#: ../raphodo/preferencedialog.py:378
+#: ../raphodo/preferencedialog.py:380
msgid "Thumbnail Cache"
msgstr "Vorschaubildzwischenspeicher"
-#: ../raphodo/preferencedialog.py:380
+#: ../raphodo/preferencedialog.py:382
msgid "Calculating..."
msgstr "Wird berechnet …"
-#: ../raphodo/preferencedialog.py:386
+#: ../raphodo/preferencedialog.py:388
msgid "days"
msgstr "Tage"
-#: ../raphodo/preferencedialog.py:387
+#: ../raphodo/preferencedialog.py:389
msgid "forever"
msgstr "für immer"
-#: ../raphodo/preferencedialog.py:392
+#: ../raphodo/preferencedialog.py:394
msgid "Cache size:"
msgstr "Zwischenspeichergröße:"
-#: ../raphodo/preferencedialog.py:394
+#: ../raphodo/preferencedialog.py:396
msgid "Number of thumbnails:"
msgstr "Anzahl der Vorschaubilder:"
-#: ../raphodo/preferencedialog.py:396
+#: ../raphodo/preferencedialog.py:398
msgid "Database size:"
msgstr "Datenbankgröße:"
-#: ../raphodo/preferencedialog.py:398
+#: ../raphodo/preferencedialog.py:400
msgid "Cache unaccessed thumbnails for:"
msgstr "Speichere nichtverwendete Vorschaubilder für:"
-#: ../raphodo/preferencedialog.py:406
+#: ../raphodo/preferencedialog.py:408
msgid "Purge Cache..."
msgstr "Zwischenspeicher bereinigen …"
-#: ../raphodo/preferencedialog.py:408
+#: ../raphodo/preferencedialog.py:410
msgid "Optimize Cache..."
msgstr "Zwischenspeicher optimieren …"
-#: ../raphodo/preferencedialog.py:421
+#: ../raphodo/preferencedialog.py:423
msgid "* Takes effect upon program restart"
msgstr "* Werden beim Programmneustart wirksam"
-#: ../raphodo/preferencedialog.py:431
+#: ../raphodo/preferencedialog.py:433
msgid "Skip download"
msgstr "Herunterladen überspringen"
-#: ../raphodo/preferencedialog.py:432
+#: ../raphodo/preferencedialog.py:434
msgid "Don't download the file, and issue an error message"
msgstr "Übertrage die Datei nicht, und erzeuge eine Fehlermeldung"
-#: ../raphodo/preferencedialog.py:433
+#: ../raphodo/preferencedialog.py:435
msgid "Add unique identifier"
msgstr "Eine eindeutige Identifizierung hinzufügen"
-#: ../raphodo/preferencedialog.py:436
+#: ../raphodo/preferencedialog.py:438
msgid ""
"Add an identifier like _1 or _2 to the end of the filename, immediately "
"before the file's extension"
@@ -2890,24 +2892,24 @@ msgstr ""
"Ergänze einen Zusatz wie _1 oder _2 am Ende des Dateinamens, direkt vor der "
"Dateinamenserweiterung"
-#: ../raphodo/preferencedialog.py:444
+#: ../raphodo/preferencedialog.py:446
msgid "Overwrite"
msgstr "Überschreiben"
-#: ../raphodo/preferencedialog.py:445
+#: ../raphodo/preferencedialog.py:447
msgid "Overwrite the previously backed up file"
msgstr "Zuvor gesicherte Datei überschreiben"
-#: ../raphodo/preferencedialog.py:446
+#: ../raphodo/preferencedialog.py:448
msgid "Skip"
msgstr "Überspringen"
-#: ../raphodo/preferencedialog.py:448
+#: ../raphodo/preferencedialog.py:450
msgid "Don't overwrite the backup file, and issue an error message"
msgstr ""
"Überschreibe die Sicherungsdatei nicht, und erzeuge eine Fehlermeldung"
-#: ../raphodo/preferencedialog.py:455
+#: ../raphodo/preferencedialog.py:457
msgid ""
"When a photo or video of the same name has already been downloaded, choose "
"whether to skip downloading the file, or to add a unique identifier:"
@@ -2916,7 +2918,7 @@ msgstr ""
"wähle zwischen <i>Herunterladen überspringen</i> und <i>Eine eindeutige "
"Identifizierung hinzufügen</i>:"
-#: ../raphodo/preferencedialog.py:464
+#: ../raphodo/preferencedialog.py:466
msgid ""
"Using sequence numbers to automatically generate unique filenames is "
"strongly recommended. Configure file renaming in the Rename panel in the "
@@ -2926,7 +2928,7 @@ msgstr ""
"Dateinamen automatisch zu erzeugen. Das Verhalten beim Umbenennen wird im "
"gleichnamigen Panel des Hauptfensters eingestellt."
-#: ../raphodo/preferencedialog.py:473
+#: ../raphodo/preferencedialog.py:475
msgid ""
"When backing up, choose whether to overwrite a file on the backup device "
"that has the same name, or skip backing it up:"
@@ -2934,41 +2936,41 @@ msgstr ""
"Auf dem Backup-Medium vorhandene, gleichnamige Datei beim Backup "
"<i>Überschreiben</i> oder <i>Überspringen</i>:"
-#: ../raphodo/preferencedialog.py:494
+#: ../raphodo/preferencedialog.py:496
msgid "Program Warnings"
msgstr "Programmwarnungen"
-#: ../raphodo/preferencedialog.py:495
+#: ../raphodo/preferencedialog.py:497
msgid "Show a warning when:"
msgstr "Eine Warnung anzeigen, wenn:"
-#: ../raphodo/preferencedialog.py:498
+#: ../raphodo/preferencedialog.py:500
msgid "Downloading files currently not displayed"
msgstr "Dateien, die derzeit nicht angezeigt werden, werden heruntergeladen"
-#: ../raphodo/preferencedialog.py:499
+#: ../raphodo/preferencedialog.py:501
msgid ""
"Warn when about to download files that are not displayed in the main window."
msgstr ""
"Warne, falls Dateien übertragen werden würden, die nicht im Hauptfenster "
"angezeigt werden."
-#: ../raphodo/preferencedialog.py:501
+#: ../raphodo/preferencedialog.py:503
msgid "Backup destinations are missing"
msgstr "Sicherungsziele fehlen"
-#: ../raphodo/preferencedialog.py:502
+#: ../raphodo/preferencedialog.py:504
msgid ""
"Warn before starting a download if it is not possible to back up files."
msgstr ""
"Vor dem Start einer Übertragung warnen, falls eine Datensicherung nicht "
"möglich ist."
-#: ../raphodo/preferencedialog.py:504
+#: ../raphodo/preferencedialog.py:506
msgid "Program libraries are missing or broken"
msgstr "Programmbibliotheken fehlen oder sind defekt"
-#: ../raphodo/preferencedialog.py:505
+#: ../raphodo/preferencedialog.py:507
msgid ""
"Warn if a software library used by Rapid Photo Downloader is missing or not "
"functioning."
@@ -2976,11 +2978,11 @@ msgstr ""
"Warnung bei fehlenden oder nicht funktionierenden Software-Bibliotheken, die "
"Rapid Photo Downloader verwendet"
-#: ../raphodo/preferencedialog.py:508
+#: ../raphodo/preferencedialog.py:510
msgid "Filesystem metadata cannot be set"
msgstr "Dateisystemmetadaten können nicht festgelegt werden"
-#: ../raphodo/preferencedialog.py:509
+#: ../raphodo/preferencedialog.py:511
msgid ""
"Warn if there is an error setting a file's filesystem metadata, such as its "
"modification time."
@@ -2988,11 +2990,11 @@ msgstr ""
"Warnen bei Fehlern während der Änderung von Metadaten einer Datei, wie "
"Änderungsdatum."
-#: ../raphodo/preferencedialog.py:512
+#: ../raphodo/preferencedialog.py:514
msgid "Encountering unhandled files"
msgstr "Auffinden unbehandelter Dateien"
-#: ../raphodo/preferencedialog.py:513
+#: ../raphodo/preferencedialog.py:515
msgid ""
"Warn after scanning a device or this computer if there are unrecognized "
"files that will not be included in the download."
@@ -3001,11 +3003,11 @@ msgstr ""
"unbehandelte Dateien gefunden wurden, die nicht bei der bevorstehenden "
"Übertragung berücksichtigt werden."
-#: ../raphodo/preferencedialog.py:517
+#: ../raphodo/preferencedialog.py:519
msgid "Do not warn about unhandled files with extensions:"
msgstr "Nicht warnen bei unbehandelten Dateien mit diesen Dateiendungen:"
-#: ../raphodo/preferencedialog.py:522
+#: ../raphodo/preferencedialog.py:524
msgid ""
"File extensions are case insensitive and do not need to include the leading "
"dot."
@@ -3013,18 +3015,18 @@ msgstr ""
"Dateinamenserweiterungen sind unabhängig von GROSS- und kleinschreibung und "
"müssen den führenden Punkt nicht beinhalten."
-#: ../raphodo/preferencedialog.py:525
+#: ../raphodo/preferencedialog.py:527
msgid "Add"
msgstr "Hinzufügen"
-#: ../raphodo/preferencedialog.py:526
+#: ../raphodo/preferencedialog.py:528
msgid ""
"Add a file extension to the list of unhandled file types to not warn about."
msgstr ""
"Füge eine Dateinamenserweiterung zur Liste unbehandelter Dateitypen hinzu, "
"vor denen nicht gewarnt werden soll."
-#: ../raphodo/preferencedialog.py:528
+#: ../raphodo/preferencedialog.py:530
msgid ""
"Remove a file extension from the list of unhandled file types to not warn "
"about."
@@ -3032,22 +3034,22 @@ msgstr ""
"Entferne eine Dateinamenserweiterung aus der Liste unbehandelter Dateitypen, "
"vor denen nicht gewarnt werden soll."
-#: ../raphodo/preferencedialog.py:532
+#: ../raphodo/preferencedialog.py:534
msgid ""
"Clear the list of file extensions of unhandled file types to not warn about."
msgstr ""
"Bereinige die Liste unbehandelter Dateitypen, vor denen nicht gewarnt werden "
"soll."
-#: ../raphodo/preferencedialog.py:568
+#: ../raphodo/preferencedialog.py:570
msgid "Photo and Video Consolidation"
msgstr "Foto und Video Zusammenfassung"
-#: ../raphodo/preferencedialog.py:571
+#: ../raphodo/preferencedialog.py:573
msgid "Consolidate files across devices and downloads"
msgstr "Dateien über Geräte und Übertragungen hinweg zusammenfassen"
-#: ../raphodo/preferencedialog.py:574
+#: ../raphodo/preferencedialog.py:576
msgid ""
"Analyze the results of device scans looking for duplicate files and matching "
"RAW and JPEG pairs,\n"
@@ -3057,19 +3059,19 @@ msgstr ""
"passenden RAW- und JPEG-Paarungen;\n"
"vergleiche sie über mehrere Geräte und Übertragungen hinweg."
-#: ../raphodo/preferencedialog.py:580
+#: ../raphodo/preferencedialog.py:582
msgid "Treat matching RAW and JPEG files as:"
msgstr "Behandle übereinstimmende RAW- und JPEG-Dateien als:"
-#: ../raphodo/preferencedialog.py:581
+#: ../raphodo/preferencedialog.py:583
msgid "One photo"
msgstr "Ein Foto"
-#: ../raphodo/preferencedialog.py:582
+#: ../raphodo/preferencedialog.py:584
msgid "Two photos"
msgstr "Zwei Fotos"
-#: ../raphodo/preferencedialog.py:584
+#: ../raphodo/preferencedialog.py:586
msgid ""
"Display matching pairs of RAW and JPEG photos as one photo, and if marked, "
"download both."
@@ -3077,7 +3079,7 @@ msgstr ""
"Zeige übereinstimmende Paarungen von RAW- und JPEG-Fotos als ein Foto und, "
"falls markiert, übertrage beide."
-#: ../raphodo/preferencedialog.py:589
+#: ../raphodo/preferencedialog.py:591
msgid ""
"Display matching pairs of RAW and JPEG photos as two different photos. You "
"can still synchronize their sequence numbers."
@@ -3086,23 +3088,23 @@ msgstr ""
"verschiedene Fotos. Sie können immer noch deren Sequenznummern "
"synchronisieren."
-#: ../raphodo/preferencedialog.py:598
+#: ../raphodo/preferencedialog.py:600
msgid "With matching RAW and JPEG photos:"
msgstr "Mit übereinstimmende RAW- und JPEG-Fotos:"
-#: ../raphodo/preferencedialog.py:600
+#: ../raphodo/preferencedialog.py:602
msgid "Do not mark JPEG for download"
msgstr "JPEG nicht zum Übertragen markieren"
-#: ../raphodo/preferencedialog.py:601
+#: ../raphodo/preferencedialog.py:603
msgid "Do not mark RAW for download"
msgstr "RAW nicht zum Übertragen markieren"
-#: ../raphodo/preferencedialog.py:602
+#: ../raphodo/preferencedialog.py:604
msgid "Mark both for download"
msgstr "Beide zum Übertragen markieren"
-#: ../raphodo/preferencedialog.py:609
+#: ../raphodo/preferencedialog.py:611
msgid ""
"When matching RAW and JPEG photos are found, do not automatically mark the "
"JPEG for\n"
@@ -3113,7 +3115,7 @@ msgstr ""
"für die Übertragung vormerken. Sie können es immer noch selbst zum "
"Übertragen markieren."
-#: ../raphodo/preferencedialog.py:614
+#: ../raphodo/preferencedialog.py:616
msgid ""
"When matching RAW and JPEG photos are found, do not automatically mark the "
"RAW for\n"
@@ -3124,7 +3126,7 @@ msgstr ""
"für die Übertragung vormerken. SIe können es immer noch selbst für die "
"Übertragung markieren."
-#: ../raphodo/preferencedialog.py:619
+#: ../raphodo/preferencedialog.py:621
msgid ""
"When matching RAW and JPEG photos are found, automatically mark both for "
"download."
@@ -3132,32 +3134,32 @@ msgstr ""
"Wenn übereinstimmende RAW- und JPEG-Fotos gefunden werden, automatisch beide "
"für die Übertragung markieren."
-#: ../raphodo/preferencedialog.py:625
+#: ../raphodo/preferencedialog.py:627
msgid ""
"If you disable file consolidation, choose what to do when a download device "
"is inserted while completed downloads are displayed:"
msgstr ""
-#: ../raphodo/preferencedialog.py:631
+#: ../raphodo/preferencedialog.py:633
msgid ""
"When a download device is inserted while completed downloads are displayed:"
msgstr ""
"Beim Einstecken eines Geräts bei bestehender Anzeige abgeschlossener "
"Übertragungen:"
-#: ../raphodo/preferencedialog.py:642
+#: ../raphodo/preferencedialog.py:644
msgid "Clear completed downloads"
msgstr "Abgeschlossene Übertragungen bereinigen"
-#: ../raphodo/preferencedialog.py:643
+#: ../raphodo/preferencedialog.py:645
msgid "Keep displaying completed downloads"
msgstr "Abgeschlossene Übertragungen weiterhin anzeigen"
-#: ../raphodo/preferencedialog.py:644
+#: ../raphodo/preferencedialog.py:646
msgid "Prompt for what to do"
msgstr "Nachfragen, was getan werden soll"
-#: ../raphodo/preferencedialog.py:649
+#: ../raphodo/preferencedialog.py:651
msgid ""
"Automatically clear the display of completed downloads whenever a new "
"download device is inserted."
@@ -3165,7 +3167,7 @@ msgstr ""
"Bereinige die Anzeige abgeschlossener Übertragungen automatisch, wenn ein "
"neues Gerät angeschlossen wird."
-#: ../raphodo/preferencedialog.py:654
+#: ../raphodo/preferencedialog.py:656
msgid ""
"Keep displaying completed downloads whenever a new download device is "
"inserted."
@@ -3173,7 +3175,7 @@ msgstr ""
"Zeige abgeschlossene Übertragungen weiterhin an, wenn ein neues Gerät "
"angeschlossen wird."
-#: ../raphodo/preferencedialog.py:658
+#: ../raphodo/preferencedialog.py:660
msgid ""
"Prompt whether to keep displaying completed downloads or clear them whenever "
"a new download device is inserted."
@@ -3181,23 +3183,23 @@ msgstr ""
"Nachfragen, ob abgeschlossene Übertragungen weiterhin angezeigt oder "
"bereinigt werden sollen, wenn ein neues Gerät angeschlossen wird."
-#: ../raphodo/preferencedialog.py:702
+#: ../raphodo/preferencedialog.py:705
msgid "Version Check"
msgstr "Versionsüberprüfung"
-#: ../raphodo/preferencedialog.py:703
+#: ../raphodo/preferencedialog.py:706
msgid "Check for new version at startup"
msgstr "Beim Start auf neue Version prüfen"
-#: ../raphodo/preferencedialog.py:705
+#: ../raphodo/preferencedialog.py:708
msgid "Check for a new version of the program each time the program starts."
msgstr "Bei jedem Programmstart auf neue Version prüfen."
-#: ../raphodo/preferencedialog.py:707
+#: ../raphodo/preferencedialog.py:710
msgid "Include development releases"
msgstr "Aktualisierungen für Entwickler einbeziehen"
-#: ../raphodo/preferencedialog.py:709
+#: ../raphodo/preferencedialog.py:712
msgid ""
"Include alpha, beta and other development releases when checking for a new "
"version of the program.\n"
@@ -3211,11 +3213,11 @@ msgstr ""
"Sollten Sie gerade eine Entwicklerversion einsetzen, so findet die "
"Überprüfung immer statt."
-#: ../raphodo/preferencedialog.py:725
+#: ../raphodo/preferencedialog.py:728
msgid "Ignore DNG date/time metadata on MTP devices"
msgstr "DNG-Datum/Zeit-Metadaten auf MTP-Geräten ignorieren"
-#: ../raphodo/preferencedialog.py:727
+#: ../raphodo/preferencedialog.py:730
msgid ""
"Ignore date/time metadata in DNG files located on MTP devices, and use the "
"file's modification time instead.\n"
@@ -3223,20 +3225,25 @@ msgid ""
"Useful for devices like some phones and tablets that create incorrect DNG "
"metadata."
msgstr ""
+"Ignoriere Zeit/Datum-Metadaten in DNG Dateien auf MTP-Geräten; verwende "
+"stattdessen den Zeitstempel der Änderung.\n"
+"\n"
+"Nützlich bei Geräten - wie einigen Telefonen oder Tablets -, die inkorrekte "
+"DNG-Metadaten erzeugen."
-#: ../raphodo/preferencedialog.py:741
+#: ../raphodo/preferencedialog.py:744
msgid "Completed Downloads"
msgstr "Abgeschlossene Übertragungen"
#. Translators: substituted value is a description for the set of preferences
#. shown in the preference dialog window, e.g. Devices, Automation, etc.
#. This string is shown in a tooltip for the "Restore Defaults" button
-#: ../raphodo/preferencedialog.py:1067
+#: ../raphodo/preferencedialog.py:1071
#, python-format
msgid "Restores default %s preference values"
msgstr "Stellt Standard-Einstellungen von %s wieder her"
-#: ../raphodo/preferencedialog.py:1208
+#: ../raphodo/preferencedialog.py:1212
msgid ""
"Do you want to purge the thumbnail cache? The cache will be purged when the "
"program is next started."
@@ -3244,11 +3251,11 @@ msgstr ""
"Möchten Sie den Zwischenspeicher der Vorschaubilder bereinigen? Der "
"Zwischenspeicher wird beim nächsten Programmstart gelöscht."
-#: ../raphodo/preferencedialog.py:1212
+#: ../raphodo/preferencedialog.py:1216
msgid "Purge Thumbnail Cache"
msgstr "Vorschaubildzwischenspeicher bereinigen"
-#: ../raphodo/preferencedialog.py:1225
+#: ../raphodo/preferencedialog.py:1229
msgid ""
"Do you want to optimize the thumbnail cache? The cache will be optimized "
"when the program is next started."
@@ -3256,53 +3263,53 @@ msgstr ""
"Möchten Sie den Zwischenspeicher der Vorschaubilder optimieren? Der "
"Zwischenspeicher wird beim nächsten Programmstart optimiert."
-#: ../raphodo/preferencedialog.py:1229
+#: ../raphodo/preferencedialog.py:1233
msgid "Optimize Thumbnail Cache"
msgstr "Vorschaubildzwischenspeicher optimieren"
-#: ../raphodo/preferencedialog.py:1481
+#: ../raphodo/preferencedialog.py:1486
msgid "Enter a Folder to Scan"
msgstr "Geben Sie einen Ordner an, der durchsucht werden soll"
-#: ../raphodo/preferencedialog.py:1482
+#: ../raphodo/preferencedialog.py:1487
msgid "Specify a folder that will be scanned for photos and videos"
msgstr "Geben Sie einen Ordner an, der nach Fotos und Videos durchsucht wird"
-#: ../raphodo/preferencedialog.py:1483
+#: ../raphodo/preferencedialog.py:1488
msgid "Folder:"
msgstr "Ordner:"
-#: ../raphodo/preferencedialog.py:1497
+#: ../raphodo/preferencedialog.py:1502
msgid "Enter a Path to Ignore"
msgstr "Geben Sie einen Pfad ein, welcher ignoriert werden sollen"
-#: ../raphodo/preferencedialog.py:1498
+#: ../raphodo/preferencedialog.py:1503
msgid "Specify a path that will never be scanned for photos or videos"
msgstr ""
"Geben Sie einen Pfad ein, welcher nie nach Bildern oder Filmen durchsucht "
"werden soll"
-#: ../raphodo/preferencedialog.py:1499
+#: ../raphodo/preferencedialog.py:1504
msgid "Path:"
msgstr "Pfad:"
-#: ../raphodo/preferencedialog.py:1513
+#: ../raphodo/preferencedialog.py:1518
msgid "Enter a File Extension"
msgstr "Dateiendung eingeben"
-#: ../raphodo/preferencedialog.py:1514
+#: ../raphodo/preferencedialog.py:1519
msgid "Specify a file extension (without the leading dot)"
msgstr "Geben Sie eine Dateiendung an (ohne den führenden Punkt)"
-#: ../raphodo/preferencedialog.py:1515 ../raphodo/renamepanel.py:124
+#: ../raphodo/preferencedialog.py:1520 ../raphodo/renamepanel.py:124
msgid "Extension:"
msgstr "Endung:"
-#: ../raphodo/preferencedialog.py:1530
+#: ../raphodo/preferencedialog.py:1535
msgid "Invalid File Extension"
msgstr "Ungültige Dateiendung"
-#: ../raphodo/preferencedialog.py:1531
+#: ../raphodo/preferencedialog.py:1536
#, python-format
msgid ""
"The file extension <b>%s</b> is recognized by Rapid Photo Downloader, so it "
@@ -3311,7 +3318,7 @@ msgstr ""
"Die Dateinamenserweiterung <b>%s</b> wird von Rapid Photo Downloader "
"erkannt. Deshalb ist ein Warnhinweis unnötig."
-#: ../raphodo/preferencedialog.py:1533
+#: ../raphodo/preferencedialog.py:1538
#, python-format
msgid ""
"Recognized file types:\n"
@@ -3803,16 +3810,16 @@ msgstr ""
msgid "Toggle synchronizing Timeline and thumbnail scrolling (Ctrl-T)"
msgstr ""
-#: ../raphodo/rapid.py:494 ../raphodo/rapid.py:2576 ../raphodo/rapid.py:3969
-#: ../raphodo/rapid.py:4100 ../raphodo/rapid.py:4104 ../raphodo/rapid.py:4127
-#: ../raphodo/rapid.py:4131 ../raphodo/rapid.py:4261 ../raphodo/rapid.py:4272
-#: ../raphodo/rapid.py:4771 ../raphodo/rapid.py:5224 ../raphodo/rapid.py:6027
+#: ../raphodo/rapid.py:494 ../raphodo/rapid.py:2581 ../raphodo/rapid.py:3974
+#: ../raphodo/rapid.py:4105 ../raphodo/rapid.py:4109 ../raphodo/rapid.py:4132
+#: ../raphodo/rapid.py:4136 ../raphodo/rapid.py:4266 ../raphodo/rapid.py:4277
+#: ../raphodo/rapid.py:4777 ../raphodo/rapid.py:5230 ../raphodo/rapid.py:6045
#: ../raphodo/rememberthisdialog.py:99
#: ../data/net.damonlynch.rapid-photo-downloader.desktop.in.h:3
msgid "Rapid Photo Downloader"
msgstr "Rapid-Fotoübertragung"
-#: ../raphodo/rapid.py:1150
+#: ../raphodo/rapid.py:1153
msgid ""
"<b>ExifTool has a problem</b><br><br> Rapid Photo Downloader uses ExifTool "
"to get metadata from videos and photos. The program will run without it, but "
@@ -3823,11 +3830,11 @@ msgstr ""
"ohne ExifTool funktionieren; es wird jedoch <b>wärmstens</b> empfohlen, "
"ExifTool zu installieren."
-#: ../raphodo/rapid.py:1160 ../raphodo/rapid.py:1180
+#: ../raphodo/rapid.py:1163 ../raphodo/rapid.py:1183
msgid "Problem with libmediainfo"
msgstr "Problem mit libmediainfo"
-#: ../raphodo/rapid.py:1169
+#: ../raphodo/rapid.py:1172
msgid ""
"<b>The library libmediainfo appears to be missing</b><br><br> Rapid Photo "
"Downloader uses libmediainfo to get the date and time a video was shot. The "
@@ -3838,18 +3845,18 @@ msgstr ""
"ermitteln. Das Programm wird ohne libmediainfo funktionieren; es wird jedoch "
"empfohlen, libmediainfo zu installieren."
-#: ../raphodo/rapid.py:1467
+#: ../raphodo/rapid.py:1470
msgid "Download failed"
msgstr "Herunterladen fehlgeschlagen"
-#: ../raphodo/rapid.py:1469
+#: ../raphodo/rapid.py:1472
msgid ""
"Sorry, the download of the new version of Rapid Photo Downloader failed."
msgstr ""
"Entschuldigung, das Herunterladen der neuen Version von Rapid Photo "
"Downloader ist fehlgeschlagen."
-#: ../raphodo/rapid.py:1476
+#: ../raphodo/rapid.py:1479
msgid ""
"The new version was successfully downloaded. Do you want to close Rapid "
"Photo Downloader and install it now?"
@@ -3857,19 +3864,19 @@ msgstr ""
"Die neue Version wurde erfolgreich heruntergeladen. Möchten Sie Rapid Photo "
"Downloader schließen und jetzt installieren?"
-#: ../raphodo/rapid.py:1480
+#: ../raphodo/rapid.py:1483
msgid "Update Rapid Photo Downloader"
msgstr "Rapid-Fotoübertragung aktualisieren"
-#: ../raphodo/rapid.py:1484
+#: ../raphodo/rapid.py:1487
msgid "Install"
msgstr "Installieren"
-#: ../raphodo/rapid.py:1502
+#: ../raphodo/rapid.py:1505
msgid "New version saved"
msgstr "Neue Version gespeichert"
-#: ../raphodo/rapid.py:1504
+#: ../raphodo/rapid.py:1507
#, python-format
msgid ""
"The tar file and installer script are saved at:\n"
@@ -3880,11 +3887,11 @@ msgstr ""
"\n"
" %s"
-#: ../raphodo/rapid.py:1521
+#: ../raphodo/rapid.py:1524
msgid "Upgrade failed"
msgstr "Aktualisierung fehlgeschlagen"
-#: ../raphodo/rapid.py:1524
+#: ../raphodo/rapid.py:1527
msgid ""
"Sorry, upgrading Rapid Photo Downloader failed because there was an error "
"opening the installer."
@@ -3892,76 +3899,76 @@ msgstr ""
"Entschuldigung, Aktualisierung von Rapid Photo Downloader fehlgeschlagen "
"wegen eines Fehlers beim Öffnen des Installers."
-#: ../raphodo/rapid.py:1730 ../raphodo/rapid.py:2446
+#: ../raphodo/rapid.py:1733 ../raphodo/rapid.py:2449
msgid "Download"
msgstr "Herunterladen"
-#: ../raphodo/rapid.py:1734
+#: ../raphodo/rapid.py:1737
msgid "&Refresh..."
msgstr "Auff&rischen …"
-#: ../raphodo/rapid.py:1738
+#: ../raphodo/rapid.py:1741
msgid "&Preferences"
msgstr "&Einstellungen"
-#: ../raphodo/rapid.py:1742
+#: ../raphodo/rapid.py:1745
msgid "&Quit"
msgstr "&Beenden"
-#: ../raphodo/rapid.py:1746
+#: ../raphodo/rapid.py:1749
msgid "Error &Reports"
msgstr "Fehlerbe&richte"
-#: ../raphodo/rapid.py:1750
+#: ../raphodo/rapid.py:1753
msgid "Clear Completed Downloads"
msgstr "Abgeschlossene Übertragungen bereinigen"
-#: ../raphodo/rapid.py:1754
+#: ../raphodo/rapid.py:1757
msgid "Get Help Online..."
msgstr "Im Netz Hilfe erhalten …"
-#: ../raphodo/rapid.py:1758
+#: ../raphodo/rapid.py:1761
msgid "&Tip of the Day..."
msgstr "&Tipp des Tages …"
-#: ../raphodo/rapid.py:1762
+#: ../raphodo/rapid.py:1765
msgid "Report a Problem..."
msgstr "Ein Problem melden …"
-#: ../raphodo/rapid.py:1766
+#: ../raphodo/rapid.py:1769
msgid "Make a Donation..."
msgstr "Etwas spenden …"
-#: ../raphodo/rapid.py:1770
+#: ../raphodo/rapid.py:1773
msgid "Translate this Application..."
msgstr "Diese Anwendung übersetzen …"
-#: ../raphodo/rapid.py:1774
+#: ../raphodo/rapid.py:1777
msgid "&About..."
msgstr "&Über …"
-#: ../raphodo/rapid.py:1778
+#: ../raphodo/rapid.py:1781
msgid "Check for Updates..."
msgstr "Auf Aktualisierungen prüfen …"
-#: ../raphodo/rapid.py:1861
+#: ../raphodo/rapid.py:1864
msgid "Timeline"
msgstr "Zeitleiste"
-#: ../raphodo/rapid.py:1871
+#: ../raphodo/rapid.py:1874
msgid "Destination"
msgstr "Ziel"
-#: ../raphodo/rapid.py:1872
+#: ../raphodo/rapid.py:1875
msgid "Rename"
msgstr "Umbenennen"
-#: ../raphodo/rapid.py:1874
+#: ../raphodo/rapid.py:1877
msgid "Back Up"
msgstr "Sicherung"
#. Devices Header and View
-#: ../raphodo/rapid.py:1998
+#: ../raphodo/rapid.py:2001
msgid ""
"Turn on or off the use of devices attached to this computer as download "
"sources"
@@ -3970,79 +3977,79 @@ msgstr ""
" oder ausschalten"
#. This Computer Header and View
-#: ../raphodo/rapid.py:2015
+#: ../raphodo/rapid.py:2018
msgid ""
"Turn on or off the use of a folder on this computer as a download source"
msgstr ""
"Die Benutzung von Ordnern als Quelle zum Herunterladen an diesem Rechner ein-"
" oder ausschalten"
-#: ../raphodo/rapid.py:2017
+#: ../raphodo/rapid.py:2020
msgid "This Computer"
msgstr "Dieser Rechner"
-#: ../raphodo/rapid.py:2030
+#: ../raphodo/rapid.py:2033
msgid "Select a source folder"
msgstr "Quellordner auswählen"
-#: ../raphodo/rapid.py:2059
+#: ../raphodo/rapid.py:2062
msgid "Projected Storage Use"
msgstr "Prognostizierte Speichernutzung"
-#: ../raphodo/rapid.py:2077 ../raphodo/rapid.py:2089
+#: ../raphodo/rapid.py:2080 ../raphodo/rapid.py:2092
msgid "Select a destination folder"
msgstr "Zielordner auswählen"
-#: ../raphodo/rapid.py:2138
+#: ../raphodo/rapid.py:2141
msgid "All"
msgstr "Alle"
-#: ../raphodo/rapid.py:2139
+#: ../raphodo/rapid.py:2142
msgid "New"
msgstr "Neu"
-#: ../raphodo/rapid.py:2141
+#: ../raphodo/rapid.py:2144
msgid "Show:"
msgstr "Anzeigen:"
-#: ../raphodo/rapid.py:2144
+#: ../raphodo/rapid.py:2147
msgid "Modification Time"
msgstr "Änderungszeit"
-#: ../raphodo/rapid.py:2145
+#: ../raphodo/rapid.py:2148
msgid "Checked State"
msgstr "Zustand geprüft"
-#: ../raphodo/rapid.py:2148
+#: ../raphodo/rapid.py:2151
msgid "File Type"
msgstr "Dateityp"
-#: ../raphodo/rapid.py:2149
+#: ../raphodo/rapid.py:2152
msgid "Device"
msgstr "Gerät"
-#: ../raphodo/rapid.py:2151
+#: ../raphodo/rapid.py:2154
msgid "Sort:"
msgstr "Sortieren:"
-#: ../raphodo/rapid.py:2162
+#: ../raphodo/rapid.py:2165
msgid "Select All:"
msgstr "Alles auswählen:"
-#: ../raphodo/rapid.py:2426
+#: ../raphodo/rapid.py:2429
#, python-format
msgid "Download %(files)s"
msgstr "%(files)s herunterladen"
-#: ../raphodo/rapid.py:2442
+#: ../raphodo/rapid.py:2445
msgid "Resume Download"
msgstr "Herunterladen fortsetzen"
-#: ../raphodo/rapid.py:2444
+#: ../raphodo/rapid.py:2447
msgid "Pause"
msgstr "Anhalten"
-#: ../raphodo/rapid.py:2532
+#: ../raphodo/rapid.py:2537
#, python-brace-format
msgid ""
"Please report the problem at <a href=\"{website}\">{website}</a>.<br><br>\n"
@@ -4058,11 +4065,11 @@ msgstr ""
"Datei zu öffnen).\n"
" "
-#: ../raphodo/rapid.py:2546
+#: ../raphodo/rapid.py:2551
msgid "Thank you for reporting a problem in Rapid Photo Downloader"
msgstr "Vielen Dank für die Meldung eines Problems in Rapid Photo Downloader"
-#: ../raphodo/rapid.py:2659
+#: ../raphodo/rapid.py:2664
#, python-format
msgid ""
"<b>Changing This Computer source path</b><br><br>Do you really want to "
@@ -4071,13 +4078,13 @@ msgid ""
"from This Computer will be cancelled."
msgstr ""
-#: ../raphodo/rapid.py:2729
+#: ../raphodo/rapid.py:2734
msgid "You cannot change the download destination while downloading."
msgstr ""
"Sie können das Ziel zum Herunterladen während des Herunterladens nicht "
"ändern."
-#: ../raphodo/rapid.py:2739
+#: ../raphodo/rapid.py:2744
#, python-format
msgid ""
"<b>Confirm Download Destination</b><br><br>Are you sure you want to set the "
@@ -4086,7 +4093,7 @@ msgstr ""
"<b>Ziel zum Herunterladen bestätigen</b><br><br>Sind Sie sicher, dass das "
"Ziel zum Herunterladen von %(file_type)s auf %(path)s festgelegt werden soll?"
-#: ../raphodo/rapid.py:2820
+#: ../raphodo/rapid.py:2825
msgid ""
"\n"
"<b>Downloading all files</b><br><br>\n"
@@ -4105,7 +4112,7 @@ msgstr ""
"Möchten Sie die Übertragung fortsetzen?\n"
" "
-#: ../raphodo/rapid.py:2972
+#: ../raphodo/rapid.py:2977
#, python-format
msgid ""
"These download folders are invalid:\n"
@@ -4116,7 +4123,7 @@ msgstr ""
"%(folder1)s\n"
"%(folder2)s"
-#: ../raphodo/rapid.py:2975
+#: ../raphodo/rapid.py:2980
#, python-format
msgid ""
"This download folder is invalid:\n"
@@ -4125,15 +4132,15 @@ msgstr ""
"Dieser Übertragungsordner ist ungültig:\n"
"%s"
-#: ../raphodo/rapid.py:2978
+#: ../raphodo/rapid.py:2983
msgid "Download Failure"
msgstr "Fehler beim Übertragen"
-#: ../raphodo/rapid.py:2979
+#: ../raphodo/rapid.py:2984
msgid "The download cannot proceed."
msgstr "Die Übertragung kann nicht fortfahren."
-#: ../raphodo/rapid.py:2997
+#: ../raphodo/rapid.py:3002
msgid ""
"Photos and videos will not be backed up because there is nowhere to back "
"them up. Do you still want to start the download?"
@@ -4141,7 +4148,7 @@ msgstr ""
"Fotos und Videos werden nicht gesichert, weil es keinen Ort zum Sichern "
"gibt. Möchten SIe dennoch mit der Übertragung beginnen?"
-#: ../raphodo/rapid.py:3004 ../raphodo/rapid.py:3014
+#: ../raphodo/rapid.py:3009 ../raphodo/rapid.py:3019
#, python-format
msgid ""
"No backup device exists for backing up %(filetype)s. Do you still want to "
@@ -4150,15 +4157,15 @@ msgstr ""
"Es gibt kein Sicherungsgerät zur Sicherung von %(filetype)s. Möchten SIe "
"dennoch mit der Übertragung beginnen?"
-#: ../raphodo/rapid.py:3006 ../raphodo/rpdfile.py:233
+#: ../raphodo/rapid.py:3011 ../raphodo/rpdfile.py:233
msgid "photos"
msgstr "Fotos"
-#: ../raphodo/rapid.py:3016 ../raphodo/rpdfile.py:228
+#: ../raphodo/rapid.py:3021 ../raphodo/rpdfile.py:228
msgid "videos"
msgstr "Filme"
-#: ../raphodo/rapid.py:3024
+#: ../raphodo/rapid.py:3029
msgid ""
"<b>The photo and video backup destinations do not exist or cannot be written "
"to.</b><br><br>Do you still want to start the download?"
@@ -4167,7 +4174,7 @@ msgstr ""
"können nicht beschrieben werden.</b><br><br>Möchten SIe dennoch mit der "
"Übertragung beginnen?"
-#: ../raphodo/rapid.py:3034 ../raphodo/rapid.py:3043
+#: ../raphodo/rapid.py:3039 ../raphodo/rapid.py:3048
#, python-format
msgid ""
"<b>The %(filetype)s backup destination does not exist or cannot be written "
@@ -4177,96 +4184,96 @@ msgstr ""
"beschrieben werden.</b><br><br>Möchten SIe dennoch mit der Übertragung "
"beginnen?"
-#: ../raphodo/rapid.py:3036 ../raphodo/rpdfile.py:235 ../raphodo/rpdfile.py:843
+#: ../raphodo/rapid.py:3041 ../raphodo/rpdfile.py:235 ../raphodo/rpdfile.py:843
msgid "photo"
msgstr "Foto"
-#: ../raphodo/rapid.py:3045 ../raphodo/rpdfile.py:230 ../raphodo/rpdfile.py:883
+#: ../raphodo/rapid.py:3050 ../raphodo/rpdfile.py:230 ../raphodo/rpdfile.py:883
msgid "video"
msgstr "Film"
-#: ../raphodo/rapid.py:3053
+#: ../raphodo/rapid.py:3058
msgid "Backup problem"
msgstr "Sicherungsproblem"
-#: ../raphodo/rapid.py:3791
+#: ../raphodo/rapid.py:3796
#, python-format
msgid "%(downloading_from)s — %(time_left)s left (%(speed)s)"
msgstr "%(downloading_from)s — %(time_left)s verbleibend (%(speed)s)"
-#: ../raphodo/rapid.py:3863
+#: ../raphodo/rapid.py:3868
#, python-format
msgid "%(noFiles)s %(filetypes)s downloaded"
msgstr "%(noFiles)s %(filetypes)s heruntergeladen"
-#: ../raphodo/rapid.py:3871
+#: ../raphodo/rapid.py:3876
#, python-format
msgid "%(noFiles)s %(filetypes)s failed to download"
msgstr "%(noFiles)s %(filetypes)s konnten nicht heruntergeladen werden"
-#: ../raphodo/rapid.py:3877 ../raphodo/rapid.py:3962
+#: ../raphodo/rapid.py:3882 ../raphodo/rapid.py:3967
msgid "warnings"
msgstr "Warnungen"
-#: ../raphodo/rapid.py:3908
+#: ../raphodo/rapid.py:3913
msgid "All downloads complete"
msgstr "Alle Übertragungen wurden abgeschlossen"
-#: ../raphodo/rapid.py:3916 ../raphodo/rapid.py:3927 ../raphodo/rapid.py:3938
-#: ../raphodo/rapid.py:3949 ../raphodo/rapid.py:3959
+#: ../raphodo/rapid.py:3921 ../raphodo/rapid.py:3932 ../raphodo/rapid.py:3943
+#: ../raphodo/rapid.py:3954 ../raphodo/rapid.py:3964
#, python-format
msgid "%(number)s %(numberdownloaded)s"
msgstr "%(number)s %(numberdownloaded)s"
-#: ../raphodo/rapid.py:3919 ../raphodo/rapid.py:3941
+#: ../raphodo/rapid.py:3924 ../raphodo/rapid.py:3946
#, python-format
msgid "%(filetype)s downloaded"
msgstr "%(filetype)s heruntergeladen"
-#: ../raphodo/rapid.py:3930 ../raphodo/rapid.py:3952
+#: ../raphodo/rapid.py:3935 ../raphodo/rapid.py:3957
#, python-format
msgid "%(filetype)s failed to download"
msgstr "%(filetype)s konnten nicht heruntergeladen werden"
-#: ../raphodo/rapid.py:3985
+#: ../raphodo/rapid.py:3990
msgid "1 failure"
msgstr "1 Fehler"
-#: ../raphodo/rapid.py:3987
+#: ../raphodo/rapid.py:3992
#, python-format
msgid "%d failures"
msgstr "%d Fehler"
-#: ../raphodo/rapid.py:3992
+#: ../raphodo/rapid.py:3997
msgid "1 warning"
msgstr "1 Warnung"
-#: ../raphodo/rapid.py:3994
+#: ../raphodo/rapid.py:3999
#, python-format
msgid "%d warnings"
msgstr "%d Warnungen"
-#: ../raphodo/rapid.py:4016
+#: ../raphodo/rapid.py:4021
#, python-format
msgid "Downloaded %(no_files_and_types)s from %(devices)s"
msgstr "%(no_files_and_types)s von %(devices)s heruntergeladen"
-#: ../raphodo/rapid.py:4020
+#: ../raphodo/rapid.py:4025
#, python-format
msgid "Downloaded %(no_files_and_types)s from %(devices)s — %(failures)s"
msgstr ""
"%(no_files_and_types)s von %(devices)s heruntergeladen — %(failures)s"
-#: ../raphodo/rapid.py:4024
+#: ../raphodo/rapid.py:4029
#, python-format
msgid "No files downloaded — %(failures)s"
msgstr "Keine Dateien heruntergeladen — %(failures)s"
-#: ../raphodo/rapid.py:4026
+#: ../raphodo/rapid.py:4031
msgid "No files downloaded"
msgstr "Keine Dateien heruntergeladen"
-#: ../raphodo/rapid.py:4056
+#: ../raphodo/rapid.py:4061
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4275,7 +4282,7 @@ msgstr ""
"Die Ziel-Unterordner und die Zeitleiste werden neu generiert, nachdem alle "
"Vorschaubilder für %(camera)s erstellt wurden"
-#: ../raphodo/rapid.py:4061
+#: ../raphodo/rapid.py:4066
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
"have been generated for this computer"
@@ -4283,7 +4290,7 @@ msgstr ""
"Die Ziel-Unterordner und die Zeitleiste werden neu generiert, nachdem alle "
"Vorschaubilder für diesen Computer erstellt wurden"
-#: ../raphodo/rapid.py:4066
+#: ../raphodo/rapid.py:4071
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4292,7 +4299,7 @@ msgstr ""
"Die Ziel-Unterordner und die Zeitleiste werden neu generiert, nachdem alle "
"Vorschaubilder für %(device)s erstellt wurden"
-#: ../raphodo/rapid.py:4074
+#: ../raphodo/rapid.py:4079
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4302,7 +4309,7 @@ msgstr ""
"Vorschaubilder für %(number_devices)s Geräte und diesen Computer erzeugt "
"wurden."
-#: ../raphodo/rapid.py:4087
+#: ../raphodo/rapid.py:4092
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4311,7 +4318,7 @@ msgstr ""
"die Zielordner und die Zeitleiste werden neu aufgebaut wenn die Vorschau für "
"dies %(camera)s und diesen Computer neu erstellt wird."
-#: ../raphodo/rapid.py:4091
+#: ../raphodo/rapid.py:4096
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4320,7 +4327,7 @@ msgstr ""
"Die Unterordner des Ziels und die Zeitleiste werden erneuert, nachdem alle "
"Vorschaubilder für %(device)s und diesen Computer erzeugt wurden."
-#: ../raphodo/rapid.py:4095
+#: ../raphodo/rapid.py:4100
#, python-format
msgid ""
"The Destination subfolders and Timeline will be rebuilt after all thumbnails "
@@ -4329,15 +4336,15 @@ msgstr ""
"Die Ziel-Unterordner und die Zeitleiste werden neu generiert, nachdem alle "
"Vorschaubilder für %(number_devices)s Geräte erstellt wurden"
-#: ../raphodo/rapid.py:4122
+#: ../raphodo/rapid.py:4127
msgid "The Destination subfolders and Timeline have been rebuilt"
msgstr "Die Ziel-Unterordner und die Zeitleiste wurden neu generiert"
-#: ../raphodo/rapid.py:4179
+#: ../raphodo/rapid.py:4184
msgid "Program preferences are invalid"
msgstr "Die Benutzervoreinstellungen sind ungültig"
-#: ../raphodo/rapid.py:4263
+#: ../raphodo/rapid.py:4268
#, python-format
msgid ""
"<b>All files on the %(camera)s are inaccessible</b>.<br><br>It may be locked "
@@ -4353,7 +4360,7 @@ msgstr ""
"<i>USB zum Laden</i> auf <i>USB zur Dateiübertragung</i> "
"ändern.<br><br>Alternativ können Sie dieses Gerät ignorieren."
-#: ../raphodo/rapid.py:4274
+#: ../raphodo/rapid.py:4279
#, python-format
msgid ""
"<b>The %(camera)s appears to be in use by another "
@@ -4368,25 +4375,25 @@ msgstr ""
"nicht funktioniert, ziehen Sie die %(camera)s vom Computer ab und stecken "
"Sie sie wieder an."
-#: ../raphodo/rapid.py:4285
+#: ../raphodo/rapid.py:4290
msgid "&Try Again"
msgstr "&Erneut versuchen"
-#: ../raphodo/rapid.py:4286
+#: ../raphodo/rapid.py:4291
msgid "&Ignore This Device"
msgstr "&Dieses Gerät ignorieren"
-#: ../raphodo/rapid.py:4358
+#: ../raphodo/rapid.py:4363
#, python-format
msgid "Sorry, an unexpected problem occurred while scanning %s."
msgstr ""
"Verzeihung, ein unerwartetes Problem ist aufgetreten beim Durchsuchen von %s."
-#: ../raphodo/rapid.py:4359
+#: ../raphodo/rapid.py:4364
msgid "Unfortunately you cannot download from this device."
msgstr "Leider können Sie von diesem Gerät nicht übertragen."
-#: ../raphodo/rapid.py:4363
+#: ../raphodo/rapid.py:4368
msgid ""
"A possible workaround for the problem might be downloading from the camera's "
"memory card using a card reader."
@@ -4394,11 +4401,11 @@ msgstr ""
"Abhilfe kann möglicherweise die direkte Übertragung von der Speicherkarte "
"der Kamera mittels Kartenlesegerät schaffen."
-#: ../raphodo/rapid.py:4368
+#: ../raphodo/rapid.py:4373
msgid "Device scan failed"
msgstr "Gerätesuche fehlgeschlagen"
-#: ../raphodo/rapid.py:4748
+#: ../raphodo/rapid.py:4754
#, python-format
msgid ""
"<b>The %(camera)s cannot be scanned because it cannot be "
@@ -4412,7 +4419,7 @@ msgstr ""
"nicht funktioniert, ziehen Sie die %(camera)s vom Computer ab und stecken "
"Sie sie wieder an."
-#: ../raphodo/rapid.py:4773
+#: ../raphodo/rapid.py:4779
#, python-format
msgid ""
"<b>The download cannot start because the %(camera)s cannot be "
@@ -4428,53 +4435,53 @@ msgstr ""
"Computer und stecken sie erneut ein. Wählen Sie anschließend, welche Dateien "
"Sie übertragen möchten."
-#: ../raphodo/rapid.py:4870
+#: ../raphodo/rapid.py:4876
msgid "Completed Downloads Present"
msgstr "Aktuelle Übertragungen abgeschlossen"
-#: ../raphodo/rapid.py:4872
+#: ../raphodo/rapid.py:4878
#, python-format
msgid "%s whose download have completed are displayed."
msgstr "%s, deren Übertragung abgeschlossen ist, werden angezeigt."
-#: ../raphodo/rapid.py:4874
+#: ../raphodo/rapid.py:4880
msgid "Do you want to clear the completed downloads?"
msgstr "Möchten Sie abgeschlossene Übertragungen bereinigen?"
-#: ../raphodo/rapid.py:4876
+#: ../raphodo/rapid.py:4882
msgid "Completed Download Present"
msgstr "Aktuelle Übertragung abgeschlossen"
-#: ../raphodo/rapid.py:4878
+#: ../raphodo/rapid.py:4884
#, python-format
msgid "%s whose download has completed is displayed."
msgstr "%s, deren Übertragung abgeschlossen ist, wird angezeigt."
-#: ../raphodo/rapid.py:4880
+#: ../raphodo/rapid.py:4886
msgid "Do you want to clear the completed download?"
msgstr "Möchten Sie die abgeschlossene Übertragung bereinigen?"
-#: ../raphodo/rapid.py:4961
+#: ../raphodo/rapid.py:4967
#, python-format
msgid ""
"Do you want to download photos and videos from the device <i>%(device)s</i>?"
msgstr ""
"Möchten Sie Fotos und Videos von dem Gerät <i>%(device)s</i> übertragen?"
-#: ../raphodo/rapid.py:5212
+#: ../raphodo/rapid.py:5218
#, python-format
msgid "<b>Do you want to ignore the %s whenever this program is run?</b>"
msgstr ""
"<b>Möchten Sie %s immer ignorieren, wenn das Programm gestartet wird?</b>"
-#: ../raphodo/rapid.py:5215
+#: ../raphodo/rapid.py:5221
msgid ""
"All cameras, phones and tablets with the same model name will be ignored."
msgstr ""
"Alle Kameras, Mobiltelefone und Tablets mit demselben Modellnamen werden "
"ignoriert."
-#: ../raphodo/rapid.py:5219
+#: ../raphodo/rapid.py:5225
#, python-format
msgid ""
"<b>Do you want to ignore the device %s whenever this program is run?</b>"
@@ -4482,16 +4489,16 @@ msgstr ""
"<b>Möchten Sie das Gerät %s immer ignorieren, wenn das Programm gestartet "
"wird?</b>"
-#: ../raphodo/rapid.py:5221
+#: ../raphodo/rapid.py:5227
msgid "Any device with the same name will be ignored."
msgstr "Jedes Gerät mit dem gleichen Namen wird ignoriert."
-#: ../raphodo/rapid.py:5521
+#: ../raphodo/rapid.py:5527
#, python-format
msgid "Downloading from %(location)s on This Computer."
msgstr "Von %(location)s wird auf diesen Rechner übertragen."
-#: ../raphodo/rapid.py:5525
+#: ../raphodo/rapid.py:5531
msgid ""
"Do you really want to download from here?<br><br>On some systems, scanning "
"this location can take a very long time."
@@ -4499,17 +4506,17 @@ msgstr ""
"Möchten Sie wirklich von hier übertragen?<br><br>Auf manchen Systemen kann "
"das Durchsuchen dieses Ortes sehr lange dauern."
-#: ../raphodo/rapid.py:5566
+#: ../raphodo/rapid.py:5572
#, python-format
msgid "Generating thumbnails for %s"
msgstr "Vorschaubilder für %s werden erstellt"
-#: ../raphodo/rapid.py:5569
+#: ../raphodo/rapid.py:5575
#, python-format
msgid "Scanning %s"
msgstr "%s wird eingelesen"
-#: ../raphodo/rapid.py:5580
+#: ../raphodo/rapid.py:5586
#, python-format
msgid ""
"%(number)s of %(available files)s checked for download (%(hidden)s hidden)"
@@ -4517,77 +4524,77 @@ msgstr ""
"%(number)s von %(available files)s zur Übertragung angehakt (%(hidden)s "
"versteckt)"
-#: ../raphodo/rapid.py:5588
+#: ../raphodo/rapid.py:5594
#, python-format
msgid "%(number)s of %(available files)s checked for download"
msgstr "%(number)s von %(available files)s zur Übertragung angehakt"
-#: ../raphodo/rapid.py:5794
+#: ../raphodo/rapid.py:5812
msgid "Display program information when run from the command line."
msgstr "Zeige Programminformation beim Start via Kommandozeile"
-#: ../raphodo/rapid.py:5796
+#: ../raphodo/rapid.py:5814
msgid "Display debugging information when run from the command line."
msgstr "Zeige Debugging-Informationen beim Start via Kommandozeile"
-#: ../raphodo/rapid.py:5799
+#: ../raphodo/rapid.py:5817
msgid "List photo and video file extensions the program recognizes and exit."
msgstr ""
"Zeige Foto- und Video-Dateinamenserweiterung, die das Programm kennt, und "
"beende."
-#: ../raphodo/rapid.py:5802
+#: ../raphodo/rapid.py:5820
msgid "Turn on or off the the renaming of photos."
msgstr "Schalte das Umbenennen von Fotos an oder aus."
-#: ../raphodo/rapid.py:5804
+#: ../raphodo/rapid.py:5822
msgid "turn on or off the the renaming of videos."
msgstr "Schalte das Umbenennen von Videos an oder aus."
-#: ../raphodo/rapid.py:5806
+#: ../raphodo/rapid.py:5824
msgid ""
"Turn on or off the automatic detection of devices from which to download."
msgstr ""
"Schalte die automatische Erkennung von Geräten, von denen heruntergeladen "
"werden soll, an oder aus."
-#: ../raphodo/rapid.py:5810
+#: ../raphodo/rapid.py:5828
msgid "Turn on or off downloading from this computer."
msgstr "Das Übertragen von diesem Rechner an- oder ausschalten."
-#: ../raphodo/rapid.py:5812 ../raphodo/rapid.py:5815 ../raphodo/rapid.py:5818
-#: ../raphodo/rapid.py:5839 ../raphodo/rapid.py:5843
+#: ../raphodo/rapid.py:5830 ../raphodo/rapid.py:5833 ../raphodo/rapid.py:5836
+#: ../raphodo/rapid.py:5857 ../raphodo/rapid.py:5861
msgid "PATH"
msgstr "PFAD"
-#: ../raphodo/rapid.py:5813
+#: ../raphodo/rapid.py:5831
msgid "The PATH on this computer from which to download."
msgstr "Der PFAD auf diesem Rechner, von dem übertragen wird."
-#: ../raphodo/rapid.py:5816
+#: ../raphodo/rapid.py:5834
msgid "The PATH where photos will be downloaded to."
msgstr "Der PFAD, auf den Fotos übertragen werden."
-#: ../raphodo/rapid.py:5819
+#: ../raphodo/rapid.py:5837
msgid "The PATH where videos will be downloaded to."
msgstr "Der PFAD, auf den Videos übertragen werden."
-#: ../raphodo/rapid.py:5821
+#: ../raphodo/rapid.py:5839
msgid "Turn on or off the backing up of photos and videos while downloading."
msgstr ""
"Schalte die Sicherung von Fotos und Videos während der Übertragung an oder "
"aus."
-#: ../raphodo/rapid.py:5825
+#: ../raphodo/rapid.py:5843
msgid "Turn on or off the automatic detection of backup devices."
msgstr ""
"Schalte die automatische Erkennung von Sicherungsgeräten an oder aus."
-#: ../raphodo/rapid.py:5827 ../raphodo/rapid.py:5833
+#: ../raphodo/rapid.py:5845 ../raphodo/rapid.py:5851
msgid "FOLDER"
msgstr "ORDNER"
-#: ../raphodo/rapid.py:5828
+#: ../raphodo/rapid.py:5846
msgid ""
"The FOLDER in which backups are stored on the automatically detected photo "
"backup device, with the folder's name being used to identify whether or not "
@@ -4595,7 +4602,7 @@ msgid ""
"photos up to, create a folder on it with this name."
msgstr ""
-#: ../raphodo/rapid.py:5834
+#: ../raphodo/rapid.py:5852
msgid ""
"The FOLDER in which backups are stored on the automatically detected video "
"backup device, with the folder's name being used to identify whether or not "
@@ -4603,7 +4610,7 @@ msgid ""
"up videos to, create a folder on it with this name."
msgstr ""
-#: ../raphodo/rapid.py:5840
+#: ../raphodo/rapid.py:5858
msgid ""
"The PATH where photos will be backed up when automatic detection of backup "
"devices is turned off."
@@ -4611,7 +4618,7 @@ msgstr ""
"Der PFAD, auf den Fotos gesichert werden, wenn die automatische Erkennung "
"von Sicherungsgeräten abgeschaltet ist."
-#: ../raphodo/rapid.py:5844
+#: ../raphodo/rapid.py:5862
msgid ""
"The PATH where videos will be backed up when automatic detection of backup "
"devices is turned off."
@@ -4619,28 +4626,28 @@ msgstr ""
"Der PFAD, auf den Videos gesichert werden, wenn die automatische Erkennung "
"von Sicherungsgeräten abgeschaltet ist."
-#: ../raphodo/rapid.py:5847
+#: ../raphodo/rapid.py:5865
#, python-format
msgid "Ignore photos with the following extensions: %s"
msgstr "Fotos mit folgender Erweiterung auslassen: %s"
-#: ../raphodo/rapid.py:5851
+#: ../raphodo/rapid.py:5869
msgid ""
"Turn on or off starting downloads as soon as the program itself starts."
msgstr "Sofortige Übertragung bei Programmstart an- oder ausschalten."
-#: ../raphodo/rapid.py:5854
+#: ../raphodo/rapid.py:5872
msgid "Turn on or off starting downloads as soon as a device is inserted."
msgstr ""
"Sofortige Übertragung beim Einstecken eines Gerätes an- oder ausschalten."
-#: ../raphodo/rapid.py:5857
+#: ../raphodo/rapid.py:5875
msgid ""
"Turn on or off use of the Rapid Photo Downloader Thumbnail Cache. Turning it "
"off does not delete existing cache contents."
msgstr ""
-#: ../raphodo/rapid.py:5861
+#: ../raphodo/rapid.py:5879
msgid ""
"Delete all thumbnails in the Rapid Photo Downloader Thumbnail Cache, and "
"exit."
@@ -4648,11 +4655,11 @@ msgstr ""
"Lösche alle Vorschaubilder des Rapid Photo Downloader-eigenen "
"Zwischenspeichers, und schließe."
-#: ../raphodo/rapid.py:5865
+#: ../raphodo/rapid.py:5883
msgid "Forget which files have been previously downloaded, and exit."
msgstr "Zuvor heruntergeladene Dateien vergessen und beenden."
-#: ../raphodo/rapid.py:5868
+#: ../raphodo/rapid.py:5886
msgid ""
"Import preferences from an old program version and exit. Requires the "
"command line program gconftool-2."
@@ -4660,7 +4667,7 @@ msgstr ""
"Importiere Voreinstellungen einer älteren Programmversion und schließe. "
"Erfordert das Kommandozeilen-Programm gconftool-2."
-#: ../raphodo/rapid.py:5871
+#: ../raphodo/rapid.py:5889
msgid ""
"Reset all program settings to their default values, delete all thumbnails in "
"the Thumbnail cache, forget which files have been previously downloaded, and "
@@ -4670,17 +4677,17 @@ msgstr ""
"alle Vorschaubilder aus dem Zwischenspeicher, vergesse, welche Dateien "
"bereits übertragen wurden, und schließe das Programm."
-#: ../raphodo/rapid.py:5875
+#: ../raphodo/rapid.py:5893
msgid "Include gphoto2 debugging information in log files."
msgstr "gphoto2-Fehlerinformationen in Protokolldateien einschließen."
-#: ../raphodo/rapid.py:5879
+#: ../raphodo/rapid.py:5897
msgid "Print information to the terminal about attached cameras and exit."
msgstr ""
"Informationen über angeschlossene Kameras auf dem Terminal ausgeben und "
"beenden."
-#: ../raphodo/rapid.py:5941
+#: ../raphodo/rapid.py:5959
msgid ""
"To import preferences from the old version of Rapid Photo Downloader, you "
"must install the program gconftool-2."
@@ -4688,36 +4695,36 @@ msgstr ""
"Um Voreinstellungen von der alten Version des Rapid Photo Downloader zu "
"importieren, müssen Sie das Programm gconftool-2 installieren."
-#: ../raphodo/rapid.py:5950
+#: ../raphodo/rapid.py:5968
msgid "No prior program preferences detected: exiting"
msgstr "Keine früheren Programm-Voreinstellungen gefunden: Schließe"
-#: ../raphodo/rapid.py:5953
+#: ../raphodo/rapid.py:5971
#, python-format
msgid "Importing preferences from Rapid Photo Downloader %(version)s"
msgstr "Importiere Voreinstellungen von Rapid Photo Downloader %(version)s"
-#: ../raphodo/rapid.py:6019
+#: ../raphodo/rapid.py:6037
#, python-format
msgid ""
"Do you want to copy the stored sequence number, which has the value %d?"
msgstr "Möchten Sie die gespeicherte Sequenznummer mit dem Wert %d kopieren?"
-#: ../raphodo/rapid.py:6030
+#: ../raphodo/rapid.py:6048
msgid "Program aborting."
msgstr "Programmabbruch."
-#: ../raphodo/rapid.py:6040
+#: ../raphodo/rapid.py:6058
msgid "Never run this program as the sudo / root user."
msgstr "Starten Sie dieses Programm niemals als sudo- oder root-Benutzer."
-#: ../raphodo/rapid.py:6044
+#: ../raphodo/rapid.py:6062
msgid "You must install ExifTool to run Rapid Photo Downloader."
msgstr ""
"Sie müssen ExifTool installieren, um Rapid Photo Downloader ausführen zu "
"können."
-#: ../raphodo/rapid.py:6056
+#: ../raphodo/rapid.py:6074
msgid ""
"Rapid Photo Downloader is installed in multiple locations.\n"
"\n"
@@ -4727,7 +4734,7 @@ msgstr ""
"\n"
"Entfernen Sie alle Kopien mit Ausnahme derjenigen, die Sie verwenden möchten."
-#: ../raphodo/rapid.py:6113
+#: ../raphodo/rapid.py:6131
msgid ""
"When specifying a path on the command line, do not also specify an\n"
"option for device auto detection or a path on \"This Computer\"."
@@ -4736,15 +4743,15 @@ msgstr ""
"bitte nicht die automatische Geräterkennung oder\n"
"einen Pfad auf »Dieser Rechner« aktivieren."
-#: ../raphodo/rapid.py:6273
+#: ../raphodo/rapid.py:6291
msgid "All settings and caches have been reset"
msgstr "Alle Einstellungen und Zwischenspeicher wurden zurückgesetzt"
-#: ../raphodo/rapid.py:6281
+#: ../raphodo/rapid.py:6299
msgid "Thumbnail Cache has been reset"
msgstr "Vorschaubildpuffer wurde zurückgesetzt"
-#: ../raphodo/rapid.py:6287
+#: ../raphodo/rapid.py:6305
msgid "Remembered files have been forgotten"
msgstr "Gemerkte Dateien wurden vergessen"
@@ -4762,15 +4769,15 @@ msgstr ""
"Mich nicht mehr erneut über fehlen&de oder kaputte Programmbibliotheken "
"warnen"
-#: ../raphodo/renameandmovefile.py:556
+#: ../raphodo/renameandmovefile.py:561
msgid "subfolder and filename"
msgstr "Unterordner und Dateiname"
-#: ../raphodo/renameandmovefile.py:558
+#: ../raphodo/renameandmovefile.py:563
msgid "filename"
msgstr "Dateiname"
-#: ../raphodo/renameandmovefile.py:560
+#: ../raphodo/renameandmovefile.py:565
msgid "subfolder"
msgstr "Unterordner"
diff --git a/raphodo/__about__.py b/raphodo/__about__.py
index 8a6a281..20c1a7c 100644
--- a/raphodo/__about__.py
+++ b/raphodo/__about__.py
@@ -29,7 +29,7 @@ __summary__ = 'Downloads, renames and backs up photos and videos from cameras, p
'memory cards and other devices'
__uri__ = 'http://www.damonlynch.net/rapid'
-__version__ = '0.9.9'
+__version__ = '0.9.10'
__author__ = 'Damon Lynch'
__email__ = 'damonlynch@gmail.com'
diff --git a/raphodo/cache.py b/raphodo/cache.py
index 0801762..92e7464 100644
--- a/raphodo/cache.py
+++ b/raphodo/cache.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# Copyright (C) 2015-2017 Damon Lynch <damonlynch@gmail.com>
+# Copyright (C) 2015-2018 Damon Lynch <damonlynch@gmail.com>
# This file is part of Rapid Photo Downloader.
#
@@ -47,7 +47,7 @@ http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html
"""
__author__ = 'Damon Lynch'
-__copyright__ = "Copyright 2015-2017, Damon Lynch"
+__copyright__ = "Copyright 2015-2018, Damon Lynch"
import os
import sys
@@ -69,8 +69,7 @@ from raphodo.rpdsql import CacheSQL
GetThumbnail = namedtuple('GetThumbnail', 'disk_status, thumbnail, path')
-GetThumbnailPath = namedtuple('GetThumbnailPath', 'disk_status, path, mdatatime, '
- 'orientation_unknown')
+GetThumbnailPath = namedtuple('GetThumbnailPath', 'disk_status, path, mdatatime, orientation_unknown')
class MD5Name:
"""Generate MD5 hashes for file names."""
@@ -521,9 +520,13 @@ class ThumbnailCacheSql:
os.remove(thumbnail)
deleted_thumbnails.append(name)
if len(deleted_thumbnails):
- self.thumb_db.delete_thumbnails(deleted_thumbnails)
- logging.debug('Deleted {} thumbnail files that had not been '
- 'accessed for {} or more days'.format(len(deleted_thumbnails), days))
+ if self.thumb_db.cache_exists():
+ self.thumb_db.delete_thumbnails(deleted_thumbnails)
+ logging.debug(
+ 'Deleted {} thumbnail files that had not been accessed for {} or more days'.format(
+ len(deleted_thumbnails), days
+ )
+ )
def purge_cache(self) -> None:
"""
diff --git a/raphodo/devicedisplay.py b/raphodo/devicedisplay.py
index 6219648..edfd717 100644
--- a/raphodo/devicedisplay.py
+++ b/raphodo/devicedisplay.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2015-2017 Damon Lynch <damonlynch@gmail.com>
+# Copyright (C) 2015-2018 Damon Lynch <damonlynch@gmail.com>
# Copyright (c) 2012-2014 Alexander Turkin
# This file is part of Rapid Photo Downloader.
@@ -36,7 +36,7 @@ Copyright notice from QtWaitingSpinner source:
"""
__author__ = 'Damon Lynch'
-__copyright__ = "Copyright 2015-2017, Damon Lynch"
+__copyright__ = "Copyright 2015-2018, Damon Lynch"
import math
from collections import namedtuple, defaultdict
@@ -1051,14 +1051,19 @@ class DeviceDelegate(QStyledItemDelegate):
else:
checked = None
- self.deviceDisplay.paint_header(painter=painter, x=x, y=y, width=width,
- rotation=rotation,
- icon=icon,
- device_state=device_state,
- display_name=display_name,
- checked=checked,
- download_statuses=download_statuses,
- percent_complete=percent_complete)
+ self.deviceDisplay.paint_header(
+ painter=painter,
+ x=x,
+ y=y,
+ width=width,
+ rotation=rotation,
+ icon=icon,
+ device_state=device_state,
+ display_name=display_name,
+ checked=checked,
+ download_statuses=download_statuses,
+ percent_complete=percent_complete
+ )
else:
assert view_type == ViewRowType.content
@@ -1082,39 +1087,52 @@ class DeviceDelegate(QStyledItemDelegate):
'no_videos': thousands(device.file_type_counter[video_key])}
photos_size = format_size_for_user(device.file_size_sum[photo_key])
videos_size = format_size_for_user(device.file_size_sum[video_key])
- other_bytes = storage_space.bytes_total - device.file_size_sum.sum(sum_key) - \
- storage_space.bytes_free
- other_size = format_size_for_user(other_bytes)
- bytes_total_text = format_size_for_user(storage_space.bytes_total, no_decimals=0)
- bytes_used = storage_space.bytes_total-storage_space.bytes_free
-
- percent_used = '{0:.0%}'.format(bytes_used / storage_space.bytes_total)
- # Translators: percentage full e.g. 75% full
- percent_used = _('%s full') % percent_used
-
- details = BodyDetails(bytes_total_text=bytes_total_text,
- bytes_total=storage_space.bytes_total,
- percent_used_text=percent_used,
- bytes_free_of_total='',
- comp1_file_size_sum=device.file_size_sum[photo_key],
- comp2_file_size_sum=device.file_size_sum[video_key],
- comp3_file_size_sum=other_bytes,
- comp4_file_size_sum=0,
- comp1_text = photos,
- comp2_text = videos,
- comp3_text = self.other,
- comp4_text = '',
- comp1_size_text=photos_size,
- comp2_size_text=videos_size,
- comp3_size_text=other_size,
- comp4_size_text='',
- color1=QColor(CustomColors.color1.value),
- color2=QColor(CustomColors.color2.value),
- color3=QColor(CustomColors.color3.value),
- displaying_files_of_type=DisplayingFilesOfType.photos_and_videos
- )
- self.deviceDisplay.paint_body(painter=painter, x=x, y=y, width=width,
- details=details)
+
+ # Some devices do not report how many bytes total they have, e.g. some SMB shares
+ if storage_space.bytes_total:
+ other_bytes = storage_space.bytes_total - device.file_size_sum.sum(sum_key) - \
+ storage_space.bytes_free
+ other_size = format_size_for_user(other_bytes)
+ bytes_total_text = format_size_for_user(
+ storage_space.bytes_total, no_decimals=0
+ )
+ bytes_used = storage_space.bytes_total-storage_space.bytes_free
+ percent_used = '{0:.0%}'.format(bytes_used / storage_space.bytes_total)
+ # Translators: percentage full e.g. 75% full
+ percent_used = _('%s full') % percent_used
+ bytes_total = storage_space.bytes_total
+ else:
+ percent_used = _('Device size unknown')
+ bytes_total = device.file_size_sum.sum(sum_key)
+ other_bytes = 0
+ bytes_total_text = format_size_for_user(bytes_total, no_decimals=0)
+ other_size = '0'
+
+ details = BodyDetails(
+ bytes_total_text=bytes_total_text,
+ bytes_total=bytes_total,
+ percent_used_text=percent_used,
+ bytes_free_of_total='',
+ comp1_file_size_sum=device.file_size_sum[photo_key],
+ comp2_file_size_sum=device.file_size_sum[video_key],
+ comp3_file_size_sum=other_bytes,
+ comp4_file_size_sum=0,
+ comp1_text = photos,
+ comp2_text = videos,
+ comp3_text = self.other,
+ comp4_text = '',
+ comp1_size_text=photos_size,
+ comp2_size_text=videos_size,
+ comp3_size_text=other_size,
+ comp4_size_text='',
+ color1=QColor(CustomColors.color1.value),
+ color2=QColor(CustomColors.color2.value),
+ color3=QColor(CustomColors.color3.value),
+ displaying_files_of_type=DisplayingFilesOfType.photos_and_videos
+ )
+ self.deviceDisplay.paint_body(
+ painter=painter, x=x, y=y, width=width, details=details
+ )
else:
assert len(device.storage_space) == 0
diff --git a/raphodo/jobcodepanel.py b/raphodo/jobcodepanel.py
index 2337691..2aaf980 100644
--- a/raphodo/jobcodepanel.py
+++ b/raphodo/jobcodepanel.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2017 Damon Lynch <damonlynch@gmail.com>
+# Copyright (C) 2017-2018 Damon Lynch <damonlynch@gmail.com>
# This file is part of Rapid Photo Downloader.
#
@@ -21,7 +21,7 @@ Display, edit and apply Job Codes.
"""
__author__ = 'Damon Lynch'
-__copyright__ = "Copyright 2017, Damon Lynch"
+__copyright__ = "Copyright 2017-2018, Damon Lynch"
from typing import Optional, Dict, Tuple, Union, List
import logging
@@ -190,7 +190,8 @@ class JobCodeOptionsWidget(QFramedWidget):
_('Removing a Job Code removes it only from the list of saved Job Codes, '
'not from any photos or videos that it may have been applied to.'),
_('If you want to use Job Codes, configure file renaming or destination subfolder '
- 'names to use them.')))
+ 'names to use them.'))
+ )
self.setDefaultMessage()
@@ -390,15 +391,17 @@ class JobCodeOptionsWidget(QFramedWidget):
def applyButtonClicked(self) -> None:
row = self.jobCodesWidget.currentRow()
if row < 0:
- logging.error("Did not expect Apply Job Code button to be enabled when no Job Code "
- "is selected.")
+ logging.error(
+ "Did not expect Apply Job Code button to be enabled when no Job Code is selected."
+ )
return
try:
job_code = self.jobCodesWidget.item(row).text()
except:
- logging.exception("Job Code did not exist when obtaining its value from the list "
- "widget")
+ logging.exception(
+ "Job Code did not exist when obtaining its value from the list widget"
+ )
return
self.rapidApp.applyJobCode(job_code=job_code)
@@ -406,8 +409,10 @@ class JobCodeOptionsWidget(QFramedWidget):
try:
self.prefs.del_list_value(key='job_codes', value=job_code)
except KeyError:
- logging.exception("Attempted to delete non existent value %s from Job Codes while in "
- "process of moving it to the front of the list", job_code)
+ logging.exception(
+ "Attempted to delete non existent value %s from Job Codes while in process of "
+ "moving it to the front of the list", job_code
+ )
self.prefs.add_list_value(key='job_codes', value=job_code)
if self.sortCombo.currentIndex() != 1:
@@ -420,8 +425,9 @@ class JobCodeOptionsWidget(QFramedWidget):
try:
self.prefs.del_list_value(key='job_codes', value=item.text())
except KeyError:
- logging.exception("Attempted to delete non existent value %s from Job Codes",
- item.text())
+ logging.exception(
+ "Attempted to delete non existent value %s from Job Codes", item.text()
+ )
@pyqtSlot()
def removeAllButtonClicked(self) -> None:
@@ -445,8 +451,9 @@ class JobCodeOptionsWidget(QFramedWidget):
if not self.prompting_for_job_code:
logging.debug("Prompting for job code")
self.prompting_for_job_code = True
- dialog = JobCodeDialog(self.rapidApp, on_download=on_download,
- job_codes=self._jobCodes())
+ dialog = JobCodeDialog(
+ self.rapidApp, on_download=on_download, job_codes=self._jobCodes()
+ )
if dialog.exec():
self.prompting_for_job_code = False
logging.debug("Job code entered / selected")
@@ -465,7 +472,8 @@ class JobCodeOptionsWidget(QFramedWidget):
self.rapidApp.applyJobCode(job_code=job_code)
else:
self.rapidApp.thumbnailModel.assignJobCodesToMarkedFilesWithNoJobCode(
- job_code=job_code)
+ job_code=job_code
+ )
return True
else:
self.prompting_for_job_code = False
@@ -490,12 +498,15 @@ class JobCodePanel(QScrollArea):
self.setFrameShape(QFrame.NoFrame)
- self.jobCodePanel = QPanelView(label=_('Job Codes'),
- headerColor=QColor(ThumbnailBackgroundName),
- headerFontColor=QColor(Qt.white))
+ self.jobCodePanel = QPanelView(
+ label=_('Job Codes'),
+ headerColor=QColor(ThumbnailBackgroundName),
+ headerFontColor=QColor(Qt.white)
+ )
- self.jobCodeOptions = JobCodeOptionsWidget(prefs=self.prefs, rapidApp=self.rapidApp,
- parent=self)
+ self.jobCodeOptions = JobCodeOptionsWidget(
+ prefs=self.prefs, rapidApp=self.rapidApp, parent=self
+ )
self.jobCodePanel.addWidget(self.jobCodeOptions)
widget = QWidget()
@@ -509,7 +520,8 @@ class JobCodePanel(QScrollArea):
if parent is not None:
self.rapidApp.thumbnailView.selectionModel().selectionChanged.connect(
- self.jobCodeOptions.setWidgetStates)
+ self.jobCodeOptions.setWidgetStates
+ )
self.rapidApp.thumbnailModel.selectionReset.connect(self.jobCodeOptions.setWidgetStates)
def needToPromptForJobCode(self) -> bool:
diff --git a/raphodo/rapid.py b/raphodo/rapid.py
index 83e244b..54a3941 100755
--- a/raphodo/rapid.py
+++ b/raphodo/rapid.py
@@ -53,6 +53,7 @@ import subprocess
from urllib.request import pathname2url
import tarfile
import inspect
+from distutils.version import LooseVersion
from gettext import gettext as _
@@ -71,7 +72,6 @@ except (ImportError, ValueError):
import zmq
import psutil
import gphoto2 as gp
-import sip
from PyQt5 import QtCore
from PyQt5.QtCore import (
QThread, Qt, QStorageInfo, QSettings, QPoint, QSize, QTimer, QTextStream, QModelIndex,
@@ -89,6 +89,11 @@ from PyQt5.QtWidgets import (
)
from PyQt5.QtNetwork import QLocalSocket, QLocalServer
+if LooseVersion(QtCore.PYQT_VERSION_STR) >= LooseVersion('5.11'):
+ from PyQt5 import sip
+else:
+ import sip
+
from raphodo.storage import (
ValidMounts, CameraHotplug, UDisks2Monitor, GVolumeMonitor, have_gio,
has_one_or_more_folders, mountPaths, get_desktop_environment, get_desktop,
@@ -763,7 +768,7 @@ class RapidWindow(QMainWindow):
self.prefs.optimize_thumbnail_db = False
else:
# Recreate the cache on the file system
- ThumbnailCacheSql(create_table_if_not_exists=True)
+ t = ThumbnailCacheSql(create_table_if_not_exists=True)
# For meaning of 'Devices', see devices.py
self.devices = DeviceCollection(self.exiftool_process, self)
@@ -2918,7 +2923,7 @@ Do you want to proceed with the download?
if scan_id in self.devices.thumbnailing]
for scan_id in stop_thumbnailing:
device = self.devices[scan_id]
- if not scan_id in self.thumbnailModel.generating_thumbnails:
+ if scan_id not in self.thumbnailModel.generating_thumbnails:
logging.debug(
"Not terminating thumbnailing of %s because it's not in the thumbnail manager",
device.display_name
@@ -4421,6 +4426,7 @@ Do you want to proceed with the download?
elif auto_start:
self.displayMessageInStatusBar()
if self.jobCodePanel.needToPromptForJobCode():
+ self.showMainWindow()
model.setSpinnerState(scan_id, DeviceState.idle)
start_download = self.jobCodePanel.getJobCodeBeforeDownload()
if not start_download:
@@ -5517,6 +5523,7 @@ Do you want to proceed with the download?
Returns True if yes or there was no need to ask the user, False if the
user said no.
"""
+
self.showMainWindow()
path = self.prefs.this_computer_path
if path in (
@@ -5544,6 +5551,7 @@ Do you want to proceed with the download?
:return: True if scans of such partitions should occur, else
False
"""
+
return self.prefs.device_autodetection and not self.prefs.scan_specific_folders
def displayMessageInStatusBar(self) -> None:
diff --git a/raphodo/rpdsql.py b/raphodo/rpdsql.py
index 112aea0..7988158 100755
--- a/raphodo/rpdsql.py
+++ b/raphodo/rpdsql.py
@@ -734,6 +734,15 @@ class CacheSQL:
def db_fs_name(self) -> str:
return 'thumbnail_cache.sqlite'
+ def cache_exists(self) -> bool:
+ conn = sqlite3.connect(self.db)
+ row = conn.execute(
+ """SELECT name FROM sqlite_master WHERE type='table' AND name='{}'""".format(self.table_name)
+ ).fetchone()
+ conn.close()
+ return row is not None
+
+
def update_table(self, reset: bool=False) -> None:
"""
Create or update the database table
diff --git a/rapid_photo_downloader.egg-info/PKG-INFO b/rapid_photo_downloader.egg-info/PKG-INFO
index 4243871..2adc5fa 100644
--- a/rapid_photo_downloader.egg-info/PKG-INFO
+++ b/rapid_photo_downloader.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
Name: rapid-photo-downloader
-Version: 0.9.9
+Version: 0.9.10
Summary: Downloads, renames and backs up photos and videos from cameras, phones, memory cards and other devices
Home-page: http://www.damonlynch.net/rapid
Author: Damon Lynch
@@ -158,8 +158,7 @@ Description: Rapid Photo Downloader
------------
After `satisfying software requirements`_ using your Linux distribution's standard package
- installation tools, you should install Rapid Photo Downloader using the following steps, assuming
- you use sudo to get super-user (root) access.
+ installation tools, you should install Rapid Photo Downloader using the following steps.
First, you may need to update your user's copy of pip and setuptools:
@@ -227,5 +226,8 @@ Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Video
+Provides-Extra: color_ouput
+Provides-Extra: progress_bar
diff --git a/rapid_photo_downloader.egg-info/requires.txt b/rapid_photo_downloader.egg-info/requires.txt
index 845d081..bc209ba 100644
--- a/rapid_photo_downloader.egg-info/requires.txt
+++ b/rapid_photo_downloader.egg-info/requires.txt
@@ -1,11 +1,10 @@
+PyGObject
arrow
colorlog
-colour
easygui
gphoto2
psutil
pymediainfo
-pyprind
python-dateutil
pyxdg
pyzmq
@@ -13,6 +12,12 @@ rawkit
sortedcontainers
tornado
-[:python_version == "3.4"]
+[:python_version < "3.5"]
scandir
typing
+
+[color_ouput]
+colour
+
+[progress_bar]
+pyprind
diff --git a/setup.py b/setup.py
index b65fc23..e056c4f 100644
--- a/setup.py
+++ b/setup.py
@@ -342,15 +342,19 @@ setup(
'arrow',
'python-dateutil',
'colorlog',
- 'pyprind',
'rawkit',
'easygui',
- 'colour',
'pymediainfo',
'sortedcontainers',
- 'tornado'
+ 'tornado',
+ 'scandir;python_version<"3.5"',
+ 'typing;python_version<"3.5"',
+ 'PyGObject'
],
- extras_require={':python_version == "3.4"': ['scandir', 'typing']},
+ extras_require={
+ 'color_ouput': ['colour',],
+ 'progress_bar': ['pyprind',]
+ },
include_package_data = False,
data_files = [
(
@@ -388,6 +392,7 @@ setup(
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
'Topic :: Multimedia :: Graphics',
'Topic :: Multimedia :: Video'
],
diff --git a/upgrade.py b/upgrade.py
index c834648..feefdb4 100644
--- a/upgrade.py
+++ b/upgrade.py
@@ -39,7 +39,7 @@ at the script level i.e. in __name__ == '__main__'
# subfolder, available in the online Rapid Photo Downloader source repository.
__author__ = 'Damon Lynch'
-__copyright__ = "Copyright 2017, Damon Lynch"
+__copyright__ = "Copyright 2017-2018, Damon Lynch"
import sys
import os
@@ -210,7 +210,7 @@ class RunInstallProcesses:
or package in ('pymediainfo')):
requirements = '{}\n{}'.format(requirements, line)
if self.need_pyqt5(pip_list):
- requirements = '{}\nPyQt5\n'.format(requirements)
+ requirements = '{}\n{}\n'.format(requirements, self.pypi_pyqt5_version())
if requirements:
with tempfile.NamedTemporaryFile(delete=False) as temp_requirements:
temp_requirements.write(requirements.encode())
@@ -291,11 +291,39 @@ class RunInstallProcesses:
return StrictVersion(pip.__version__)
- def need_pyqt5(self, pip_list) -> bool:
- if platform.machine() == 'x86_64' and platform.python_version_tuple()[1] in ('5', '6'):
- return not 'PyQt5' in pip_list
+ def package_in_pip_output(self, package: str, output: str) -> bool:
+ """
+ Determine if a package is found in the output of packages installed by pip
+ :param package:
+ :param output:
+ :return: True if found, False otherwise
+ """
+ return re.search('^{}\s'.format(package), output, re.IGNORECASE | re.MULTILINE) is not None
+
+ def need_pyqt5(self, pip_list: str) -> bool:
+ if platform.machine() == 'x86_64' and StrictVersion(platform.python_version()) >= StrictVersion('3.5.0'):
+ return not self.package_in_pip_output('PyQt5', pip_list)
return False
+ def pyqt_511_2_compatible(self) -> bool:
+ """
+ Python 3.5.3 or older fail to run with PyQt 5.11.2
+
+ :return: True if this python version is compatible with PyQt 5.11.2
+ """
+
+ return StrictVersion(platform.python_version()) > StrictVersion('3.5.3')
+
+ def pypi_pyqt5_version(self) -> str:
+ """
+ :return: bytes containing correct version of PyQt5 to install from PyPi
+ """
+
+ if not self.pyqt_511_2_compatible():
+ return 'PyQt5==5.10'
+ else:
+ return 'PyQt5>=5.11'
+
def make_pip_command(self, args: str, split: bool=True):
"""
Construct a call to python's pip
@@ -310,7 +338,6 @@ class RunInstallProcesses:
else:
return cmd_line
-
def python_package_version(self, package: str) -> str:
"""
Determine the version of an installed Python package, according to pip
@@ -327,7 +354,6 @@ class RunInstallProcesses:
except subprocess.CalledProcessError:
return ''
-
def match_pyqt5_and_sip(self) -> bool:
if self.python_package_version('PyQt5') == '5.9' and \
StrictVersion(self.python_package_version('sip')) == StrictVersion('4.19.4'):