diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 59443100a..5a1b142e5 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -575,6 +575,7 @@ class ImageMediaItem(MediaManagerItem): service_item.theme = -1 missing_items_file_names = [] images = [] + existing_images = [] # Expand groups to images for bitem in items: if isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageGroups) or bitem.data(0, QtCore.Qt.UserRole) is None: @@ -590,8 +591,10 @@ class ImageMediaItem(MediaManagerItem): for image in images: if not image.file_path.exists(): missing_items_file_names.append(str(image.file_path)) + else: + existing_images.append(image) # We cannot continue, as all images do not exist. - if not images: + if not existing_images: if not remote: critical_error_message_box( translate('ImagePlugin.MediaItem', 'Missing Image(s)'), @@ -607,7 +610,7 @@ class ImageMediaItem(MediaManagerItem): QtWidgets.QMessageBox.No: return False # Continue with the existing images. - for image in images: + for image in existing_images: name = image.file_path.name thumbnail_path = self.generate_thumbnail_path(image) service_item.add_from_image(image.file_path, name, thumbnail_path) diff --git a/openlp/plugins/images/lib/upgrade.py b/openlp/plugins/images/lib/upgrade.py index 89cd6e019..addd41f20 100644 --- a/openlp/plugins/images/lib/upgrade.py +++ b/openlp/plugins/images/lib/upgrade.py @@ -85,7 +85,12 @@ def upgrade_3(session, metadata): thumb_path = AppLocation.get_data_path() / 'images' / 'thumbnails' for row in results.fetchall(): file_path = json.loads(row.file_path, cls=OpenLPJSONDecoder) - hash = sha256_file_hash(file_path) + if file_path.exists(): + hash = sha256_file_hash(file_path) + else: + log.warning('{image} does not exists, so no sha256 hash added.'.format(image=str(file_path))) + # set a fake "hash" to allow for the upgrade to go through. The image will be marked as invalid + hash = 'NONE' sql = 'UPDATE image_filenames SET file_hash = \'{hash}\' WHERE id = {id}'.format(hash=hash, id=row.id) conn.execute(sql) # rename thumbnail to use file hash diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index b3499db7f..133dc23d7 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -234,7 +234,10 @@ class PresentationMediaItem(MediaManagerItem): self.application.set_busy_cursor() self.main_window.display_progress_bar(len(row_list)) for item in items: - self.clean_up_thumbnails(item.data(QtCore.Qt.UserRole)) + file_path = item.data(QtCore.Qt.UserRole) + # cleaning thumbnails depends on being able to calculate sha256 hash of the actual file + if file_path.exists(): + self.clean_up_thumbnails(file_path) self.main_window.increment_progress_bar() self.main_window.finished_progress_bar() for row in row_list: diff --git a/tests/functional/openlp_core/lib/test_serviceitem.py b/tests/functional/openlp_core/lib/test_serviceitem.py index 90e2761e2..31253df10 100644 --- a/tests/functional/openlp_core/lib/test_serviceitem.py +++ b/tests/functional/openlp_core/lib/test_serviceitem.py @@ -26,7 +26,7 @@ import pytest from pathlib import Path from unittest.mock import Mock, MagicMock, patch -from openlp.core.common import ThemeLevel +from openlp.core.common import ThemeLevel, is_win from openlp.core.common.enum import ServiceItemType from openlp.core.common.registry import Registry from openlp.core.lib.formattingtags import FormattingTags @@ -563,16 +563,21 @@ def test_to_dict_text_item(state_media, settings, service_item_env): service_item.add_icon = MagicMock() FormattingTags.load_tags() line = convert_file_service_item(TEST_PATH, 'serviceitem-song-linked-audio.osj') - service_item.set_from_service(line, Path('/test/')) + if is_win(): + fake_path = Path('c:\\test\\') + else: + fake_path = Path('/test/') + service_item.set_from_service(line, fake_path) # WHEN: to_dict() is called result = service_item.to_dict() # THEN: The correct dictionary should be returned + expected_fake_path = str(fake_path / 'amazing_grace.mp3') expected_dict = { 'audit': ['Amazing Grace', ['John Newton'], '', ''], - 'backgroundAudio': ['/test/amazing_grace.mp3'], + 'backgroundAudio': [expected_fake_path], 'capabilities': [2, 1, 5, 8, 9, 13, 15], 'footer': ['Amazing Grace', 'Written by: John Newton'], 'fromPlugin': False,