diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index e3bb4ae0f..ceaad2d46 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -349,11 +349,11 @@ class MediaManagerItem(QtGui.QWidget): Validates whether an image still exists and, if it does, is the thumbnail representation of the image up to date. """ - if not os.path.exists(image): + if not os.path.exists(unicode(image)): return False if os.path.exists(thumb): - imageDate = os.stat(image).st_mtime - thumbDate = os.stat(thumb).st_mtime + imageDate = os.stat(unicode(image)).st_mtime + thumbDate = os.stat(unicode(thumb)).st_mtime # If image has been updated rebuild icon if imageDate > thumbDate: self.iconFromFile(image, thumb) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 3cdf25c7a..fa2bc50f5 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -415,47 +415,75 @@ class ServiceManager(QtGui.QWidget): """ if not self.fileName(): return self.saveFileAs() - else: - fileName = self.fileName() - log.debug(u'ServiceManager.saveFile - %s' % fileName) - SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, - split_filename(fileName)[0]) - service = [] - serviceFileName = fileName.replace(u'.osz', u'.osd') - zip = None - file = None - try: - write_list = [] - zip = zipfile.ZipFile(unicode(fileName), 'w') - for item in self.serviceItems: - service.append({u'serviceitem': \ - item[u'service_item'].get_service_repr()}) - if item[u'service_item'].uses_file(): - for frame in item[u'service_item'].get_frames(): - if item[u'service_item'].is_image(): - path_from = frame[u'path'] - else: - path_from = unicode(os.path.join( - frame[u'path'], - frame[u'title'])) - # On write a file once - if not path_from in write_list: - write_list.append(path_from) - zip.write(path_from.encode(u'utf-8')) - file = open(serviceFileName, u'wb') - cPickle.dump(service, file) - file.close() - zip.write(serviceFileName.encode(u'utf-8')) - except IOError: - log.exception(u'Failed to save service to disk') - finally: - if file: - file.close() - if zip: - zip.close() - delete_file(serviceFileName) - self.mainwindow.addRecentFile(fileName) - self.setModified(False) + path_file_name = unicode(self.fileName()) + (path, file_name) = os.path.split(path_file_name) + (basename, extension) = os.path.splitext(file_name) + service_file_name = basename + '.osd' + log.debug(u'ServiceManager.saveFile - %s' % path_file_name) + SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, + path) + service = [] + write_list = [] + total_size = 0 + for item in self.serviceItems: + service.append({u'serviceitem': + item[u'service_item'].get_service_repr()}) + if not item[u'service_item'].uses_file(): + continue + for frame in item[u'service_item'].get_frames(): + if item[u'service_item'].is_image(): + path_from = frame[u'path'] + else: + path_from = os.path.join(frame[u'path'], frame[u'title']) + # Only write a file once + if path_from in write_list: + continue + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + #if file_size > size_limit: + # # File exeeds size_limit bytes, ask user + # message = unicode(translate('OpenLP.ServiceManager', + # 'Do you want to include \n%.1f MB file "%s"\n' + # 'into the service file?\nThis may take some time.\n\n' + # 'Please note that you need to\ntake care of that file' + # ' yourself,\nif you leave it out.')) % \ + # (file_size/1048576, os.path.split(path_from)[1]) + # ans = QtGui.QMessageBox.question(self.mainwindow, + # translate('OpenLP.ServiceManager', 'Including Large ' + # 'File'), message, QtGui.QMessageBox.StandardButtons( + # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + # QtGui.QMessageBox.Ok) + # if ans == QtGui.QMessageBox.Cancel: + # continue + write_list.append(path_from) + total_size += file_size + log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % + total_size) + service_content = cPickle.dumps(service) + # Usual Zip file cannot exceed 2GiB, file with Zip64 cannot be + # extracted using unzip in UNIX. + allow_zip_64 = (total_size > 2147483648 + len(service_content)) + log.debug(u'ServiceManager.saveFile - allowZip64 is %s' % + allow_zip_64) + zip = None + try: + zip = zipfile.ZipFile(path_file_name, 'w', zipfile.ZIP_STORED, + allow_zip_64) + # First we add service contents. + # We save ALL filenames into ZIP using UTF-8. + zip.writestr(service_file_name.encode(u'utf-8'), + service_content) + # Finally add all the listed media files. + for path_from in write_list: + zip.write(path_from, path_from.encode(u'utf-8')) + except IOError: + log.exception(u'Failed to save service to disk') + return False + finally: + if zip: + zip.close() + self.mainwindow.addRecentFile(path_file_name) + self.setModified(False) return True def saveFileAs(self):