forked from openlp/openlp
Head r847
This commit is contained in:
commit
37dd8888ca
@ -83,9 +83,9 @@ def str_to_bool(stringvalue):
|
|||||||
``stringvalue``
|
``stringvalue``
|
||||||
The string value to examine and convert to a boolean type.
|
The string value to examine and convert to a boolean type.
|
||||||
"""
|
"""
|
||||||
if stringvalue is True or stringvalue is False:
|
if isinstance(stringvalue, bool):
|
||||||
return stringvalue
|
return stringvalue
|
||||||
return stringvalue.strip().lower() in (u'true', u'yes', u'y')
|
return unicode(stringvalue).strip().lower() in (u'true', u'yes', u'y')
|
||||||
|
|
||||||
def build_icon(icon):
|
def build_icon(icon):
|
||||||
"""
|
"""
|
||||||
|
@ -343,7 +343,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||||||
filelist = []
|
filelist = []
|
||||||
while count < self.ListView.count():
|
while count < self.ListView.count():
|
||||||
bitem = self.ListView.item(count)
|
bitem = self.ListView.item(count)
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
filelist.append(filename)
|
filelist.append(filename)
|
||||||
count += 1
|
count += 1
|
||||||
return filelist
|
return filelist
|
||||||
|
@ -468,7 +468,7 @@ class Renderer(object):
|
|||||||
self._get_extent_and_render(line, footer,
|
self._get_extent_and_render(line, footer,
|
||||||
tlcorner=(x + display_shadow_size,
|
tlcorner=(x + display_shadow_size,
|
||||||
y + display_shadow_size),
|
y + display_shadow_size),
|
||||||
draw=True, color = self._theme.display_shadow_color)
|
draw=True, color=self._theme.display_shadow_color)
|
||||||
self._get_extent_and_render(line, footer, tlcorner=(x, y),
|
self._get_extent_and_render(line, footer, tlcorner=(x, y),
|
||||||
draw=True, outline_size=display_outline_size)
|
draw=True, outline_size=display_outline_size)
|
||||||
y += h
|
y += h
|
||||||
|
@ -44,8 +44,8 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog):
|
|||||||
about_text = about_text.replace(u'<version>',
|
about_text = about_text.replace(u'<version>',
|
||||||
self.applicationVersion[u'version'])
|
self.applicationVersion[u'version'])
|
||||||
if self.applicationVersion[u'build']:
|
if self.applicationVersion[u'build']:
|
||||||
build_text = u' %s %s' % (translate(u'AboutForm', u'build'),
|
build_text = unicode(translate(u'AboutForm', u' build %s')) % \
|
||||||
self.applicationVersion[u'build'])
|
self.applicationVersion[u'build']
|
||||||
else:
|
else:
|
||||||
build_text = u''
|
build_text = u''
|
||||||
about_text = about_text.replace(u'<revision>', build_text)
|
about_text = about_text.replace(u'<revision>', build_text)
|
||||||
|
@ -155,7 +155,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
|
|||||||
self.theme.background_direction)
|
self.theme.background_direction)
|
||||||
else:
|
else:
|
||||||
filename = \
|
filename = \
|
||||||
os.path.split(unicode(self.theme.background_filename))[0]
|
os.path.split(unicode(self.theme.background_filename))[1]
|
||||||
new_theme.add_background_image(filename)
|
new_theme.add_background_image(filename)
|
||||||
save_to = os.path.join(self.path, theme_name, filename)
|
save_to = os.path.join(self.path, theme_name, filename)
|
||||||
save_from = self.theme.background_filename
|
save_from = self.theme.background_filename
|
||||||
|
@ -452,8 +452,8 @@ class Ui_MainWindow(object):
|
|||||||
translate(u'MainWindow', u'Choose System language, if available'))
|
translate(u'MainWindow', u'Choose System language, if available'))
|
||||||
for item in self.LanguageGroup.actions():
|
for item in self.LanguageGroup.actions():
|
||||||
item.setText(item.objectName())
|
item.setText(item.objectName())
|
||||||
item.setStatusTip(translate(u'MainWindow',
|
item.setStatusTip(unicode(translate(u'MainWindow',
|
||||||
u'Set the interface language to %1').arg(item.objectName()))
|
u'Set the interface language to %s')) % item.objectName())
|
||||||
self.ToolsAddToolItem.setText(translate(u'MainWindow', u'Add &Tool...'))
|
self.ToolsAddToolItem.setText(translate(u'MainWindow', u'Add &Tool...'))
|
||||||
self.ToolsAddToolItem.setStatusTip(
|
self.ToolsAddToolItem.setStatusTip(
|
||||||
translate(u'MainWindow',
|
translate(u'MainWindow',
|
||||||
@ -488,7 +488,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
self.displayManager = DisplayManager(screens)
|
self.displayManager = DisplayManager(screens)
|
||||||
self.aboutForm = AboutForm(self, applicationVersion)
|
self.aboutForm = AboutForm(self, applicationVersion)
|
||||||
self.settingsForm = SettingsForm(self.screens, self, self)
|
self.settingsForm = SettingsForm(self.screens, self, self)
|
||||||
self.recentFiles = []
|
self.recentFiles = QtCore.QStringList()
|
||||||
# Set up the path with plugins
|
# Set up the path with plugins
|
||||||
pluginpath = AppLocation.get_directory(AppLocation.PluginsDir)
|
pluginpath = AppLocation.get_directory(AppLocation.PluginsDir)
|
||||||
self.plugin_manager = PluginManager(pluginpath)
|
self.plugin_manager = PluginManager(pluginpath)
|
||||||
@ -849,5 +849,4 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
if filename and filename not in self.recentFiles:
|
if filename and filename not in self.recentFiles:
|
||||||
self.recentFiles.insert(0, QtCore.QString(filename))
|
self.recentFiles.insert(0, QtCore.QString(filename))
|
||||||
while self.recentFiles.count() > recentFileCount:
|
while self.recentFiles.count() > recentFileCount:
|
||||||
self.recentFiles.pop()
|
self.recentFiles.removeLast()
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ import logging
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib.plugin import PluginStatus
|
from openlp.core.lib import PluginStatus, translate
|
||||||
from plugindialog import Ui_PluginViewDialog
|
from plugindialog import Ui_PluginViewDialog
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -63,14 +63,14 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
|||||||
# sometimes when it's loaded from the config, it isn't cast to int.
|
# sometimes when it's loaded from the config, it isn't cast to int.
|
||||||
plugin.status = int(plugin.status)
|
plugin.status = int(plugin.status)
|
||||||
# Set the little status text in brackets next to the plugin name.
|
# Set the little status text in brackets next to the plugin name.
|
||||||
status_text = 'Inactive'
|
status_text = unicode(translate(u'PluginForm', u'%s (Inactive)'))
|
||||||
if plugin.status == PluginStatus.Active:
|
if plugin.status == PluginStatus.Active:
|
||||||
status_text = 'Active'
|
status_text = unicode(translate(u'PluginForm', u'%s (Active)'))
|
||||||
elif plugin.status == PluginStatus.Inactive:
|
elif plugin.status == PluginStatus.Inactive:
|
||||||
status_text = 'Inactive'
|
status_text = unicode(translate(u'PluginForm', u'%s (Inactive)'))
|
||||||
elif plugin.status == PluginStatus.Disabled:
|
elif plugin.status == PluginStatus.Disabled:
|
||||||
status_text = 'Disabled'
|
status_text = unicode(translate(u'PluginForm', u'%s (Disabled)'))
|
||||||
item.setText(u'%s (%s)' % (plugin.name, status_text))
|
item.setText(status_text % plugin.name)
|
||||||
# If the plugin has an icon, set it!
|
# If the plugin has an icon, set it!
|
||||||
if plugin.icon:
|
if plugin.icon:
|
||||||
item.setIcon(plugin.icon)
|
item.setIcon(plugin.icon)
|
||||||
|
@ -599,11 +599,11 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
path_from = unicode(os.path.join(
|
path_from = unicode(os.path.join(
|
||||||
frame[u'path'],
|
frame[u'path'],
|
||||||
frame[u'title']))
|
frame[u'title']))
|
||||||
zip.write(path_from)
|
zip.write(path_from.encode(u'utf-8'))
|
||||||
file = open(servicefile, u'wb')
|
file = open(servicefile, u'wb')
|
||||||
cPickle.dump(service, file)
|
cPickle.dump(service, file)
|
||||||
file.close()
|
file.close()
|
||||||
zip.write(servicefile)
|
zip.write(servicefile.encode(u'utf-8'))
|
||||||
except IOError:
|
except IOError:
|
||||||
log.exception(u'Failed to save service to disk')
|
log.exception(u'Failed to save service to disk')
|
||||||
finally:
|
finally:
|
||||||
@ -669,7 +669,18 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
try:
|
try:
|
||||||
zip = zipfile.ZipFile(unicode(filename))
|
zip = zipfile.ZipFile(unicode(filename))
|
||||||
for file in zip.namelist():
|
for file in zip.namelist():
|
||||||
osfile = unicode(QtCore.QDir.toNativeSeparators(file))
|
try:
|
||||||
|
ucsfile = file.decode(u'utf-8')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
QtGui.QMessageBox.critical(
|
||||||
|
self, translate(u'ServiceManager', u'Error'),
|
||||||
|
translate(u'ServiceManager',
|
||||||
|
u'File is not a valid service.\n'
|
||||||
|
u'The content encoding is not UTF-8.'))
|
||||||
|
log.exception(u'Filename "%s" is not valid UTF-8' % \
|
||||||
|
file.decode(u'utf-8', u'replace'))
|
||||||
|
continue
|
||||||
|
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||||
names = osfile.split(os.path.sep)
|
names = osfile.split(os.path.sep)
|
||||||
file_path = os.path.join(self.servicePath,
|
file_path = os.path.join(self.servicePath,
|
||||||
names[len(names) - 1])
|
names[len(names) - 1])
|
||||||
@ -679,22 +690,29 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
file_to.close()
|
file_to.close()
|
||||||
if file_path.endswith(u'osd'):
|
if file_path.endswith(u'osd'):
|
||||||
p_file = file_path
|
p_file = file_path
|
||||||
file_to = open(p_file, u'r')
|
if 'p_file' in locals():
|
||||||
items = cPickle.load(file_to)
|
file_to = open(p_file, u'r')
|
||||||
file_to.close()
|
items = cPickle.load(file_to)
|
||||||
self.onNewService()
|
file_to.close()
|
||||||
for item in items:
|
self.onNewService()
|
||||||
serviceitem = ServiceItem()
|
for item in items:
|
||||||
serviceitem.RenderManager = self.parent.RenderManager
|
serviceitem = ServiceItem()
|
||||||
serviceitem.set_from_service(item, self.servicePath)
|
serviceitem.RenderManager = self.parent.RenderManager
|
||||||
self.validateItem(serviceitem)
|
serviceitem.set_from_service(item, self.servicePath)
|
||||||
self.addServiceItem(serviceitem)
|
self.validateItem(serviceitem)
|
||||||
try:
|
self.addServiceItem(serviceitem)
|
||||||
if os.path.isfile(p_file):
|
try:
|
||||||
os.remove(p_file)
|
if os.path.isfile(p_file):
|
||||||
except (IOError, OSError):
|
os.remove(p_file)
|
||||||
log.exception(u'Failed to remove osd file')
|
except (IOError, OSError):
|
||||||
except IOError:
|
log.exception(u'Failed to remove osd file')
|
||||||
|
else:
|
||||||
|
QtGui.QMessageBox.critical(
|
||||||
|
self, translate(u'ServiceManager', u'Error'),
|
||||||
|
translate(u'ServiceManager',
|
||||||
|
u'File is not a valid service.'))
|
||||||
|
log.exception(u'File contains no service data')
|
||||||
|
except (IOError, NameError):
|
||||||
log.exception(u'Problem loading a service file')
|
log.exception(u'Problem loading a service file')
|
||||||
finally:
|
finally:
|
||||||
if file_to:
|
if file_to:
|
||||||
|
@ -563,8 +563,7 @@ class SlideController(QtGui.QWidget):
|
|||||||
if self.isLive and frame[u'verseTag'] is not None:
|
if self.isLive and frame[u'verseTag'] is not None:
|
||||||
if tag1 not in self.slideList:
|
if tag1 not in self.slideList:
|
||||||
self.slideList[tag1] = framenumber
|
self.slideList[tag1] = framenumber
|
||||||
self.SongMenu.menu().addAction(
|
self.SongMenu.menu().addAction(tag1,
|
||||||
translate(u'SlideController', u'%s'%tag1),
|
|
||||||
self.onSongBarHandler)
|
self.onSongBarHandler)
|
||||||
item.setText(frame[u'text'])
|
item.setText(frame[u'text'])
|
||||||
else:
|
else:
|
||||||
|
@ -36,7 +36,7 @@ from openlp.core.theme import Theme
|
|||||||
from openlp.core.lib import OpenLPToolbar, context_menu_action, \
|
from openlp.core.lib import OpenLPToolbar, context_menu_action, \
|
||||||
ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \
|
ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \
|
||||||
context_menu_separator, SettingsManager, translate
|
context_menu_separator, SettingsManager, translate
|
||||||
from openlp.core.utils import AppLocation
|
from openlp.core.utils import AppLocation, get_filesystem_encoding
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -136,8 +136,8 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
self.ThemeListWidget.item(count).setText(newName)
|
self.ThemeListWidget.item(count).setText(newName)
|
||||||
#Set the new name
|
#Set the new name
|
||||||
if themeName == newName:
|
if themeName == newName:
|
||||||
name = u'%s (%s)' % (newName,
|
name = unicode(translate(u'ThemeManager', u'%s (default)')) % \
|
||||||
translate(u'ThemeManager', u'default'))
|
newName
|
||||||
self.ThemeListWidget.item(count).setText(name)
|
self.ThemeListWidget.item(count).setText(name)
|
||||||
|
|
||||||
def changeGlobalFromScreen(self, index = -1):
|
def changeGlobalFromScreen(self, index = -1):
|
||||||
@ -158,8 +158,8 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
if count == selected_row:
|
if count == selected_row:
|
||||||
self.global_theme = unicode(
|
self.global_theme = unicode(
|
||||||
self.ThemeListWidget.item(count).text())
|
self.ThemeListWidget.item(count).text())
|
||||||
name = u'%s (%s)' % (self.global_theme,
|
name = unicode(translate(u'ThemeManager', u'%s (default)')) % \
|
||||||
translate(u'ThemeManager', u'default'))
|
self.global_theme
|
||||||
self.ThemeListWidget.item(count).setText(name)
|
self.ThemeListWidget.item(count).setText(name)
|
||||||
QtCore.QSettings().setValue(
|
QtCore.QSettings().setValue(
|
||||||
self.settingsSection + u'/global theme',
|
self.settingsSection + u'/global theme',
|
||||||
@ -231,7 +231,9 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
try:
|
try:
|
||||||
os.remove(os.path.join(self.path, th))
|
os.remove(os.path.join(self.path, th))
|
||||||
os.remove(os.path.join(self.thumbPath, th))
|
os.remove(os.path.join(self.thumbPath, th))
|
||||||
shutil.rmtree(os.path.join(self.path, theme))
|
encoding = get_filesystem_encoding()
|
||||||
|
shutil.rmtree(
|
||||||
|
os.path.join(self.path, theme).encode(encoding))
|
||||||
except OSError:
|
except OSError:
|
||||||
#if not present do not worry
|
#if not present do not worry
|
||||||
pass
|
pass
|
||||||
@ -265,8 +267,8 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
for files in os.walk(source):
|
for files in os.walk(source):
|
||||||
for name in files[2]:
|
for name in files[2]:
|
||||||
zip.write(
|
zip.write(
|
||||||
os.path.join(source, name),
|
os.path.join(source, name).encode(u'utf-8'),
|
||||||
os.path.join(theme, name))
|
os.path.join(theme, name).encode(u'utf-8'))
|
||||||
QtGui.QMessageBox.information(self,
|
QtGui.QMessageBox.information(self,
|
||||||
translate(u'ThemeManager', u'Theme Exported'),
|
translate(u'ThemeManager', u'Theme Exported'),
|
||||||
translate(u'ThemeManager',
|
translate(u'ThemeManager',
|
||||||
@ -316,8 +318,8 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
if os.path.exists(theme):
|
if os.path.exists(theme):
|
||||||
textName = os.path.splitext(name)[0]
|
textName = os.path.splitext(name)[0]
|
||||||
if textName == self.global_theme:
|
if textName == self.global_theme:
|
||||||
name = u'%s (%s)' % (textName,
|
name = unicode(translate(u'ThemeManager',
|
||||||
translate(u'ThemeManager', u'default'))
|
u'%s (default)')) % textName
|
||||||
else:
|
else:
|
||||||
name = textName
|
name = textName
|
||||||
thumb = os.path.join(self.thumbPath, u'%s.png' % textName)
|
thumb = os.path.join(self.thumbPath, u'%s.png' % textName)
|
||||||
@ -388,7 +390,17 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
filexml = None
|
filexml = None
|
||||||
themename = None
|
themename = None
|
||||||
for file in zip.namelist():
|
for file in zip.namelist():
|
||||||
osfile = unicode(QtCore.QDir.toNativeSeparators(file))
|
try:
|
||||||
|
ucsfile = file.decode(u'utf-8')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
QtGui.QMessageBox.critical(
|
||||||
|
self, translate(u'ThemeManager', u'Error'),
|
||||||
|
translate(u'ThemeManager', u'File is not a valid '
|
||||||
|
u'theme.\nThe content encoding is not UTF-8.'))
|
||||||
|
log.exception(u'Filename "%s" is not valid UTF-8' % \
|
||||||
|
file.decode(u'utf-8', u'replace'))
|
||||||
|
continue
|
||||||
|
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||||
theme_dir = None
|
theme_dir = None
|
||||||
if osfile.endswith(os.path.sep):
|
if osfile.endswith(os.path.sep):
|
||||||
theme_dir = os.path.join(dir, osfile)
|
theme_dir = os.path.join(dir, osfile)
|
||||||
@ -406,7 +418,7 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
if not os.path.exists(theme_dir):
|
if not os.path.exists(theme_dir):
|
||||||
os.mkdir(os.path.join(dir, names[0]))
|
os.mkdir(os.path.join(dir, names[0]))
|
||||||
xml_data = zip.read(file)
|
xml_data = zip.read(file)
|
||||||
if os.path.splitext(file)[1].lower() in [u'.xml']:
|
if os.path.splitext(ucsfile)[1].lower() in [u'.xml']:
|
||||||
if self.checkVersion1(xml_data):
|
if self.checkVersion1(xml_data):
|
||||||
# upgrade theme xml
|
# upgrade theme xml
|
||||||
filexml = self.migrateVersion122(xml_data)
|
filexml = self.migrateVersion122(xml_data)
|
||||||
@ -417,8 +429,14 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
else:
|
else:
|
||||||
outfile = open(fullpath, u'wb')
|
outfile = open(fullpath, u'wb')
|
||||||
outfile.write(zip.read(file))
|
outfile.write(zip.read(file))
|
||||||
self.generateAndSaveImage(dir, themename, filexml)
|
if filexml:
|
||||||
except IOError:
|
self.generateAndSaveImage(dir, themename, filexml)
|
||||||
|
else:
|
||||||
|
QtGui.QMessageBox.critical(
|
||||||
|
self, translate(u'ThemeManager', u'Error'),
|
||||||
|
translate(u'ThemeManager', u'File is not a valid theme.'))
|
||||||
|
log.exception(u'Theme file dosen\'t contain XML data %s' % filename)
|
||||||
|
except (IOError, NameError):
|
||||||
QtGui.QMessageBox.critical(
|
QtGui.QMessageBox.critical(
|
||||||
self, translate(u'ThemeManager', u'Error'),
|
self, translate(u'ThemeManager', u'Error'),
|
||||||
translate(u'ThemeManager', u'File is not a valid theme.'))
|
translate(u'ThemeManager', u'File is not a valid theme.'))
|
||||||
@ -527,7 +545,10 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
outfile.close()
|
outfile.close()
|
||||||
if image_from and image_from != image_to:
|
if image_from and image_from != image_to:
|
||||||
try:
|
try:
|
||||||
shutil.copyfile(image_from, image_to)
|
encoding = get_filesystem_encoding()
|
||||||
|
shutil.copyfile(
|
||||||
|
unicode(image_from).encode(encoding),
|
||||||
|
unicode(image_to).encode(encoding))
|
||||||
except IOError:
|
except IOError:
|
||||||
log.exception(u'Failed to save theme image')
|
log.exception(u'Failed to save theme image')
|
||||||
self.generateAndSaveImage(self.path, name, theme_xml)
|
self.generateAndSaveImage(self.path, name, theme_xml)
|
||||||
|
@ -149,27 +149,6 @@ def check_latest_version(current_version):
|
|||||||
log.exception(u'Reason for failure: %s', e.reason)
|
log.exception(u'Reason for failure: %s', e.reason)
|
||||||
return version_string
|
return version_string
|
||||||
|
|
||||||
def string_to_unicode(string):
|
|
||||||
"""
|
|
||||||
Converts a QString to a Python unicode object.
|
|
||||||
"""
|
|
||||||
if isinstance(string, QtCore.QString):
|
|
||||||
string = unicode(string.toUtf8(), u'utf8')
|
|
||||||
return string
|
|
||||||
|
|
||||||
def variant_to_unicode(variant):
|
|
||||||
"""
|
|
||||||
Converts a QVariant to a Python unicode object.
|
|
||||||
|
|
||||||
``variant``
|
|
||||||
The QVariant instance to convert to unicode.
|
|
||||||
"""
|
|
||||||
if isinstance(variant, QtCore.QVariant):
|
|
||||||
string = variant.toString()
|
|
||||||
if not isinstance(string, unicode):
|
|
||||||
string = string_to_unicode(string)
|
|
||||||
return string
|
|
||||||
|
|
||||||
def add_actions(target, actions):
|
def add_actions(target, actions):
|
||||||
"""
|
"""
|
||||||
Adds multiple actions to a menu or toolbar in one command.
|
Adds multiple actions to a menu or toolbar in one command.
|
||||||
@ -187,7 +166,17 @@ def add_actions(target, actions):
|
|||||||
else:
|
else:
|
||||||
target.addAction(action)
|
target.addAction(action)
|
||||||
|
|
||||||
|
def get_filesystem_encoding():
|
||||||
|
"""
|
||||||
|
Returns the name of the encoding used to convert Unicode filenames into
|
||||||
|
system file names.
|
||||||
|
"""
|
||||||
|
encoding = sys.getfilesystemencoding()
|
||||||
|
if encoding is None:
|
||||||
|
encoding = sys.getdefaultencoding()
|
||||||
|
return encoding
|
||||||
|
|
||||||
from languagemanager import LanguageManager
|
from languagemanager import LanguageManager
|
||||||
|
|
||||||
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
|
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
|
||||||
u'LanguageManager']
|
u'get_filesystem_encoding', u'LanguageManager']
|
||||||
|
@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui
|
|||||||
|
|
||||||
from bibleimportwizard import Ui_BibleImportWizard
|
from bibleimportwizard import Ui_BibleImportWizard
|
||||||
from openlp.core.lib import Receiver, SettingsManager, translate
|
from openlp.core.lib import Receiver, SettingsManager, translate
|
||||||
from openlp.core.utils import AppLocation, variant_to_unicode
|
from openlp.core.utils import AppLocation
|
||||||
from openlp.plugins.bibles.lib.manager import BibleFormat
|
from openlp.plugins.bibles.lib.manager import BibleFormat
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -167,9 +167,9 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
return True
|
return True
|
||||||
elif self.currentId() == 2:
|
elif self.currentId() == 2:
|
||||||
# License details
|
# License details
|
||||||
license_version = variant_to_unicode(self.field(u'license_version'))
|
license_version = unicode(self.field(u'license_version').toString())
|
||||||
license_copyright = variant_to_unicode(
|
license_copyright = \
|
||||||
self.field(u'license_copyright'))
|
unicode(self.field(u'license_copyright').toString())
|
||||||
if license_version == u'':
|
if license_version == u'':
|
||||||
QtGui.QMessageBox.critical(self,
|
QtGui.QMessageBox.critical(self,
|
||||||
translate(u'BiblesPlugin.ImportWizardForm',
|
translate(u'BiblesPlugin.ImportWizardForm',
|
||||||
@ -389,37 +389,35 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
|
|
||||||
def performImport(self):
|
def performImport(self):
|
||||||
bible_type = self.field(u'source_format').toInt()[0]
|
bible_type = self.field(u'source_format').toInt()[0]
|
||||||
license_version = variant_to_unicode(self.field(u'license_version'))
|
license_version = unicode(self.field(u'license_version').toString())
|
||||||
license_copyright = variant_to_unicode(self.field(u'license_copyright'))
|
license_copyright = unicode(self.field(u'license_copyright').toString())
|
||||||
license_permission = variant_to_unicode(
|
license_permission = \
|
||||||
self.field(u'license_permission'))
|
unicode(self.field(u'license_permission').toString())
|
||||||
importer = None
|
importer = None
|
||||||
if bible_type == BibleFormat.OSIS:
|
if bible_type == BibleFormat.OSIS:
|
||||||
# Import an OSIS bible
|
# Import an OSIS bible
|
||||||
importer = self.manager.import_bible(BibleFormat.OSIS,
|
importer = self.manager.import_bible(BibleFormat.OSIS,
|
||||||
name=license_version,
|
name=license_version,
|
||||||
filename=variant_to_unicode(self.field(u'osis_location'))
|
filename=unicode(self.field(u'osis_location').toString())
|
||||||
)
|
)
|
||||||
elif bible_type == BibleFormat.CSV:
|
elif bible_type == BibleFormat.CSV:
|
||||||
# Import a CSV bible
|
# Import a CSV bible
|
||||||
importer = self.manager.import_bible(BibleFormat.CSV,
|
importer = self.manager.import_bible(BibleFormat.CSV,
|
||||||
name=license_version,
|
name=license_version,
|
||||||
booksfile=variant_to_unicode(self.field(u'csv_booksfile')),
|
booksfile=unicode(self.field(u'csv_booksfile').toString()),
|
||||||
versefile=variant_to_unicode(self.field(u'csv_versefile'))
|
versefile=unicode(self.field(u'csv_versefile').toString())
|
||||||
)
|
)
|
||||||
elif bible_type == BibleFormat.OpenSong:
|
elif bible_type == BibleFormat.OpenSong:
|
||||||
# Import an OpenSong bible
|
# Import an OpenSong bible
|
||||||
importer = self.manager.import_bible(BibleFormat.OpenSong,
|
importer = self.manager.import_bible(BibleFormat.OpenSong,
|
||||||
name=license_version,
|
name=license_version,
|
||||||
filename=variant_to_unicode(self.field(u'opensong_file'))
|
filename=unicode(self.field(u'opensong_file').toString())
|
||||||
)
|
)
|
||||||
elif bible_type == BibleFormat.WebDownload:
|
elif bible_type == BibleFormat.WebDownload:
|
||||||
# Import a bible from the web
|
# Import a bible from the web
|
||||||
self.ImportProgressBar.setMaximum(1)
|
self.ImportProgressBar.setMaximum(1)
|
||||||
download_location = self.field(u'web_location').toInt()[0]
|
download_location = self.field(u'web_location').toInt()[0]
|
||||||
bible_version = self.BibleComboBox.currentText()
|
bible_version = unicode(self.BibleComboBox.currentText())
|
||||||
if not isinstance(bible_version, unicode):
|
|
||||||
bible_version = unicode(bible_version, u'utf8')
|
|
||||||
if download_location == WebDownload.Crosswalk:
|
if download_location == WebDownload.Crosswalk:
|
||||||
bible = \
|
bible = \
|
||||||
self.web_bible_list[WebDownload.Crosswalk][bible_version]
|
self.web_bible_list[WebDownload.Crosswalk][bible_version]
|
||||||
@ -431,10 +429,10 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
|||||||
name=license_version,
|
name=license_version,
|
||||||
download_source=WebDownload.get_name(download_location),
|
download_source=WebDownload.get_name(download_location),
|
||||||
download_name=bible,
|
download_name=bible,
|
||||||
proxy_server=variant_to_unicode(self.field(u'proxy_server')),
|
proxy_server=unicode(self.field(u'proxy_server').toString()),
|
||||||
proxy_username=variant_to_unicode(
|
proxy_username=\
|
||||||
self.field(u'proxy_username')),
|
unicode(self.field(u'proxy_username').toString()),
|
||||||
proxy_password=variant_to_unicode(self.field(u'proxy_password'))
|
proxy_password=unicode(self.field(u'proxy_password').toString())
|
||||||
)
|
)
|
||||||
success = importer.do_import()
|
success = importer.do_import()
|
||||||
if success:
|
if success:
|
||||||
|
@ -454,7 +454,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
def onQuickSearchButton(self):
|
def onQuickSearchButton(self):
|
||||||
log.debug(u'Quick Search Button pressed')
|
log.debug(u'Quick Search Button pressed')
|
||||||
bible = unicode(self.QuickVersionComboBox.currentText())
|
bible = unicode(self.QuickVersionComboBox.currentText())
|
||||||
text = unicode(self.QuickSearchEdit.displayText())
|
text = unicode(self.QuickSearchEdit.text())
|
||||||
if self.ClearQuickSearchComboBox.currentIndex() == 0:
|
if self.ClearQuickSearchComboBox.currentIndex() == 0:
|
||||||
self.ListView.clear()
|
self.ListView.clear()
|
||||||
self.lastReference = []
|
self.lastReference = []
|
||||||
|
@ -120,12 +120,13 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
if items:
|
if items:
|
||||||
for item in items:
|
for item in items:
|
||||||
text = self.ListView.item(item.row())
|
text = self.ListView.item(item.row())
|
||||||
try:
|
if text:
|
||||||
os.remove(
|
try:
|
||||||
os.path.join(self.servicePath, unicode(text.text())))
|
os.remove(
|
||||||
except OSError:
|
os.path.join(self.servicePath, unicode(text.text())))
|
||||||
#if not present do not worry
|
except OSError:
|
||||||
pass
|
#if not present do not worry
|
||||||
|
pass
|
||||||
self.ListView.takeItem(item.row())
|
self.ListView.takeItem(item.row())
|
||||||
SettingsManager.set_list(self.settingsSection,
|
SettingsManager.set_list(self.settingsSection,
|
||||||
self.settingsSection, self.getFileList())
|
self.settingsSection, self.getFileList())
|
||||||
@ -157,7 +158,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
service_item.add_capability(ItemCapabilities.AllowsAdditions)
|
service_item.add_capability(ItemCapabilities.AllowsAdditions)
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
frame = QtGui.QImage(unicode(filename))
|
frame = QtGui.QImage(unicode(filename))
|
||||||
(path, name) = os.path.split(filename)
|
(path, name) = os.path.split(filename)
|
||||||
service_item.add_from_image(path, name, frame)
|
service_item.add_from_image(path, name, frame)
|
||||||
@ -174,7 +175,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
items = self.ListView.selectedIndexes()
|
items = self.ListView.selectedIndexes()
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
frame = QtGui.QImage(unicode(filename))
|
frame = QtGui.QImage(unicode(filename))
|
||||||
self.parent.maindisplay.addImageWithText(frame)
|
self.parent.maindisplay.addImageWithText(frame)
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ class MediaMediaItem(MediaManagerItem):
|
|||||||
items = self.ListView.selectedIndexes()
|
items = self.ListView.selectedIndexes()
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
Receiver.send_message(u'videodisplay_background', filename)
|
Receiver.send_message(u'videodisplay_background', filename)
|
||||||
|
|
||||||
def generateSlideData(self, service_item, item=None):
|
def generateSlideData(self, service_item, item=None):
|
||||||
@ -120,7 +120,7 @@ class MediaMediaItem(MediaManagerItem):
|
|||||||
item = self.ListView.currentItem()
|
item = self.ListView.currentItem()
|
||||||
if item is None:
|
if item is None:
|
||||||
return False
|
return False
|
||||||
filename = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
service_item.title = unicode(
|
service_item.title = unicode(
|
||||||
translate(u'MediaPlugin.MediaItem', u'Media'))
|
translate(u'MediaPlugin.MediaItem', u'Media'))
|
||||||
service_item.add_capability(ItemCapabilities.RequiresMedia)
|
service_item.add_capability(ItemCapabilities.RequiresMedia)
|
||||||
|
@ -180,7 +180,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
self.ListView.takeItem(row)
|
self.ListView.takeItem(row)
|
||||||
SettingsManager.set_list(self.settingsSection,
|
SettingsManager.set_list(self.settingsSection,
|
||||||
self.settingsSection, self.getFileList())
|
self.settingsSection, self.getFileList())
|
||||||
filepath = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
filepath = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
#not sure of this has errors
|
#not sure of this has errors
|
||||||
#John please can you look at .
|
#John please can you look at .
|
||||||
for cidx in self.controllers:
|
for cidx in self.controllers:
|
||||||
@ -198,7 +198,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
if shortname:
|
if shortname:
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
if shortname == self.Automatic:
|
if shortname == self.Automatic:
|
||||||
service_item.shortname = self.findControllerByType(filename)
|
service_item.shortname = self.findControllerByType(filename)
|
||||||
if not service_item.shortname:
|
if not service_item.shortname:
|
||||||
|
@ -292,7 +292,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||||||
rowLabel = []
|
rowLabel = []
|
||||||
for row in range(0, self.VerseListWidget.rowCount()):
|
for row in range(0, self.VerseListWidget.rowCount()):
|
||||||
item = self.VerseListWidget.item(row, 0)
|
item = self.VerseListWidget.item(row, 0)
|
||||||
data = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
data = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
bit = data.split(u':')
|
bit = data.split(u':')
|
||||||
rowTag = u'%s\n%s' % (bit[0][0:1], bit[1])
|
rowTag = u'%s\n%s' % (bit[0][0:1], bit[1])
|
||||||
rowLabel.append(rowTag)
|
rowLabel.append(rowTag)
|
||||||
@ -383,7 +383,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||||||
item = self.VerseListWidget.currentItem()
|
item = self.VerseListWidget.currentItem()
|
||||||
if item:
|
if item:
|
||||||
tempText = item.text()
|
tempText = item.text()
|
||||||
verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
self.verse_form.setVerse(tempText, True, verseId)
|
self.verse_form.setVerse(tempText, True, verseId)
|
||||||
if self.verse_form.exec_():
|
if self.verse_form.exec_():
|
||||||
afterText, verse, subVerse = self.verse_form.getVerse()
|
afterText, verse, subVerse = self.verse_form.getVerse()
|
||||||
@ -414,7 +414,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||||||
if self.VerseListWidget.rowCount() > 0:
|
if self.VerseListWidget.rowCount() > 0:
|
||||||
for row in range(0, self.VerseListWidget.rowCount()):
|
for row in range(0, self.VerseListWidget.rowCount()):
|
||||||
item = self.VerseListWidget.item(row, 0)
|
item = self.VerseListWidget.item(row, 0)
|
||||||
field = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
field = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
verse_list += u'---[%s]---\n' % field
|
verse_list += u'---[%s]---\n' % field
|
||||||
verse_list += item.text()
|
verse_list += item.text()
|
||||||
verse_list += u'\n'
|
verse_list += u'\n'
|
||||||
@ -505,7 +505,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||||||
def onCopyrightInsertButtonTriggered(self):
|
def onCopyrightInsertButtonTriggered(self):
|
||||||
text = self.CopyrightEditItem.text()
|
text = self.CopyrightEditItem.text()
|
||||||
pos = self.CopyrightEditItem.cursorPosition()
|
pos = self.CopyrightEditItem.cursorPosition()
|
||||||
text = text[:pos] + u'©' + text[pos:]
|
text = text[:pos] + u'\xa9' + text[pos:]
|
||||||
self.CopyrightEditItem.setText(text)
|
self.CopyrightEditItem.setText(text)
|
||||||
self.CopyrightEditItem.setFocus()
|
self.CopyrightEditItem.setFocus()
|
||||||
self.CopyrightEditItem.setCursorPosition(pos + 1)
|
self.CopyrightEditItem.setCursorPosition(pos + 1)
|
||||||
@ -563,7 +563,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||||||
text = u' '
|
text = u' '
|
||||||
for i in range (0, self.VerseListWidget.rowCount()):
|
for i in range (0, self.VerseListWidget.rowCount()):
|
||||||
item = self.VerseListWidget.item(i, 0)
|
item = self.VerseListWidget.item(i, 0)
|
||||||
verseId = unicode((item.data(QtCore.Qt.UserRole)).toString())
|
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||||
bits = verseId.split(u':')
|
bits = verseId.split(u':')
|
||||||
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
|
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
|
||||||
text = text + unicode(self.VerseListWidget.item(i, 0).text()) \
|
text = text + unicode(self.VerseListWidget.item(i, 0).text()) \
|
||||||
|
@ -104,7 +104,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
|||||||
verse_type = match.group(1)
|
verse_type = match.group(1)
|
||||||
verse_number = int(match.group(2))
|
verse_number = int(match.group(2))
|
||||||
verse_type_index = VerseType.from_string(verse_type)
|
verse_type_index = VerseType.from_string(verse_type)
|
||||||
if verse_type_index:
|
if verse_type_index is not None:
|
||||||
self.VerseTypeComboBox.setCurrentIndex(verse_type_index)
|
self.VerseTypeComboBox.setCurrentIndex(verse_type_index)
|
||||||
self.VerseNumberBox.setValue(verse_number)
|
self.VerseNumberBox.setValue(verse_number)
|
||||||
|
|
||||||
@ -112,8 +112,9 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
|||||||
tag=u'%s:1' % VerseType.to_string(VerseType.Verse)):
|
tag=u'%s:1' % VerseType.to_string(VerseType.Verse)):
|
||||||
if single:
|
if single:
|
||||||
verse_type, verse_number = tag.split(u':')
|
verse_type, verse_number = tag.split(u':')
|
||||||
self.VerseTypeComboBox.setCurrentIndex(
|
verse_type_index = VerseType.from_string(verse_type)
|
||||||
VerseType.from_string(verse_type))
|
if verse_type_index is not None:
|
||||||
|
self.VerseTypeComboBox.setCurrentIndex(verse_type_index)
|
||||||
self.VerseNumberBox.setValue(int(verse_number))
|
self.VerseNumberBox.setValue(int(verse_number))
|
||||||
self.InsertButton.setVisible(False)
|
self.InsertButton.setVisible(False)
|
||||||
else:
|
else:
|
||||||
|
@ -29,7 +29,7 @@ from PyQt4 import QtCore, QtGui
|
|||||||
|
|
||||||
from songimportwizard import Ui_SongImportWizard
|
from songimportwizard import Ui_SongImportWizard
|
||||||
from openlp.core.lib import Receiver, SettingsManager, translate
|
from openlp.core.lib import Receiver, SettingsManager, translate
|
||||||
#from openlp.core.utils import AppLocation, variant_to_unicode
|
#from openlp.core.utils import AppLocation
|
||||||
from openlp.plugins.songs.lib.manager import SongFormat
|
from openlp.plugins.songs.lib.manager import SongFormat
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -203,20 +203,20 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
# # Import an OSIS bible
|
# # Import an OSIS bible
|
||||||
# importer = self.manager.import_bible(BibleFormat.OSIS,
|
# importer = self.manager.import_bible(BibleFormat.OSIS,
|
||||||
# name=license_version,
|
# name=license_version,
|
||||||
# filename=variant_to_unicode(self.field(u'osis_location'))
|
# filename=unicode(self.field(u'osis_location').toString())
|
||||||
# )
|
# )
|
||||||
# elif bible_type == BibleFormat.CSV:
|
# elif bible_type == BibleFormat.CSV:
|
||||||
# # Import a CSV bible
|
# # Import a CSV bible
|
||||||
# importer = self.manager.import_bible(BibleFormat.CSV,
|
# importer = self.manager.import_bible(BibleFormat.CSV,
|
||||||
# name=license_version,
|
# name=license_version,
|
||||||
# booksfile=variant_to_unicode(self.field(u'csv_booksfile')),
|
# booksfile=unicode(self.field(u'csv_booksfile').toString()),
|
||||||
# versefile=variant_to_unicode(self.field(u'csv_versefile'))
|
# versefile=unicode(self.field(u'csv_versefile').toString())
|
||||||
# )
|
# )
|
||||||
# elif bible_type == BibleFormat.OpenSong:
|
# elif bible_type == BibleFormat.OpenSong:
|
||||||
# # Import an OpenSong bible
|
# # Import an OpenSong bible
|
||||||
# importer = self.manager.import_bible(BibleFormat.OpenSong,
|
# importer = self.manager.import_bible(BibleFormat.OpenSong,
|
||||||
# name=license_version,
|
# name=license_version,
|
||||||
# filename=variant_to_unicode(self.field(u'opensong_file'))
|
# filename=unicode(self.field(u'opensong_file').toString())
|
||||||
# )
|
# )
|
||||||
# elif bible_type == BibleFormat.WebDownload:
|
# elif bible_type == BibleFormat.WebDownload:
|
||||||
# # Import a bible from the web
|
# # Import a bible from the web
|
||||||
@ -234,9 +234,9 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
# name=license_version,
|
# name=license_version,
|
||||||
# download_source=WebDownload.get_name(download_location),
|
# download_source=WebDownload.get_name(download_location),
|
||||||
# download_name=bible,
|
# download_name=bible,
|
||||||
# proxy_server=variant_to_unicode(self.field(u'proxy_server')),
|
# proxy_server=unicode(self.field(u'proxy_server').toString()),
|
||||||
# proxy_username=variant_to_unicode(self.field(u'proxy_username')),
|
# proxy_username=unicode(self.field(u'proxy_username').toString()),
|
||||||
# proxy_password=variant_to_unicode(self.field(u'proxy_password'))
|
# proxy_password=unicode(self.field(u'proxy_password').toString())
|
||||||
# )
|
# )
|
||||||
# success = importer.do_import()
|
# success = importer.do_import()
|
||||||
# if success:
|
# if success:
|
||||||
|
@ -66,7 +66,7 @@ class SongImport(object):
|
|||||||
self.copyright_string = unicode(QtGui.QApplication.translate( \
|
self.copyright_string = unicode(QtGui.QApplication.translate( \
|
||||||
u'SongsPlugin.SongImport', u'copyright'))
|
u'SongsPlugin.SongImport', u'copyright'))
|
||||||
self.copyright_symbol = unicode(QtGui.QApplication.translate( \
|
self.copyright_symbol = unicode(QtGui.QApplication.translate( \
|
||||||
u'SongsPlugin.SongImport', u'©'))
|
u'SongsPlugin.SongImport', u'\xa9'))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def process_songs_text(manager, text):
|
def process_songs_text(manager, text):
|
||||||
|
Loading…
Reference in New Issue
Block a user