From baec34cc51c5822c002b22072a9e99d662dce465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Mon, 30 Jul 2018 10:50:17 -0400 Subject: New upstream version 0.9.10 --- CHANGES.rst | 22 + PKG-INFO | 10 +- README.rst | 3 +- RELEASE_NOTES.rst | 4 +- ...amonlynch.rapid-photo-downloader.appdata.xml.in | 8 +- install.py | 70 ++- po/de.po | 649 +++++++++++---------- raphodo/__about__.py | 2 +- raphodo/cache.py | 17 +- raphodo/devicedisplay.py | 104 ++-- raphodo/jobcodepanel.py | 52 +- raphodo/rapid.py | 14 +- raphodo/rpdsql.py | 9 + rapid_photo_downloader.egg-info/PKG-INFO | 10 +- rapid_photo_downloader.egg-info/requires.txt | 11 +- setup.py | 13 +- upgrade.py | 40 +- 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 @@ - - - net.damonlynch.rapid-photo-downloader + + + net.damonlynch.rapid-photo-downloader rapid-photo-downloader.desktop rapid-photo-downloader @@ -67,4 +67,4 @@ damonlynch@gmail.com - + 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 \n" +"POT-Creation-Date: 2018-03-09 00:05+0000\n" +"PO-Revision-Date: 2018-05-05 17:47+0000\n" +"Last-Translator: Spheniscus \n" "Language-Team: German \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 regula" @@ -2742,7 +2742,7 @@ msgstr "" "href=\"http://damonlynch.net/rapid/documentation/#regularexpressions\">regula" "r expressions 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 Herunterladen überspringen und Eine eindeutige " "Identifizierung hinzufügen:" -#: ../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 " "Überschreiben oder Überspringen:" -#: ../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 %s is recognized by Rapid Photo Downloader, so it " @@ -3311,7 +3318,7 @@ msgstr "" "Die Dateinamenserweiterung %s 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 "" "ExifTool has a problem

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 wärmstens 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 "" "The library libmediainfo appears to be missing

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 {website}.

\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 "" "Changing This Computer source path

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 "" "Confirm Download Destination

Are you sure you want to set the " @@ -4086,7 +4093,7 @@ msgstr "" "Ziel zum Herunterladen bestätigen

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" "Downloading all files

\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 "" "The photo and video backup destinations do not exist or cannot be written " "to.

Do you still want to start the download?" @@ -4167,7 +4174,7 @@ msgstr "" "können nicht beschrieben werden.

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 "" "The %(filetype)s backup destination does not exist or cannot be written " @@ -4177,96 +4184,96 @@ msgstr "" "beschrieben werden.

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 "" "All files on the %(camera)s are inaccessible.

It may be locked " @@ -4353,7 +4360,7 @@ msgstr "" "USB zum Laden auf USB zur Dateiübertragung " "ändern.

Alternativ können Sie dieses Gerät ignorieren." -#: ../raphodo/rapid.py:4274 +#: ../raphodo/rapid.py:4279 #, python-format msgid "" "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 "" "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 "" "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 %(device)s?" msgstr "" "Möchten Sie Fotos und Videos von dem Gerät %(device)s übertragen?" -#: ../raphodo/rapid.py:5212 +#: ../raphodo/rapid.py:5218 #, python-format msgid "Do you want to ignore the %s whenever this program is run?" msgstr "" "Möchten Sie %s immer ignorieren, wenn das Programm gestartet wird?" -#: ../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 "" "Do you want to ignore the device %s whenever this program is run?" @@ -4482,16 +4489,16 @@ msgstr "" "Möchten Sie das Gerät %s immer ignorieren, wenn das Programm gestartet " "wird?" -#: ../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?

On some systems, scanning " "this location can take a very long time." @@ -4499,17 +4506,17 @@ msgstr "" "Möchten Sie wirklich von hier übertragen?

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 +# Copyright (C) 2015-2018 Damon Lynch # 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 +# Copyright (C) 2015-2018 Damon Lynch # 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 +# Copyright (C) 2017-2018 Damon Lynch # 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'): -- cgit v1.2.3