openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #07525
[Merge] lp:~googol-hush/openlp/songs into lp:openlp
Andreas Preikschat has proposed merging lp:~googol-hush/openlp/songs into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
For more details, see:
https://code.launchpad.net/~googol-hush/openlp/songs/+merge/54985
Hello,
- import topics from usr files (txt files seem not to support topics)
- clean ups
--
https://code.launchpad.net/~googol-hush/openlp/songs/+merge/54985
Your team OpenLP Core is requested to review the proposed merge of lp:~googol-hush/openlp/songs into lp:openlp.
=== modified file 'openlp/plugins/songs/lib/cclifileimport.py'
--- openlp/plugins/songs/lib/cclifileimport.py 2011-03-24 19:04:02 +0000
+++ openlp/plugins/songs/lib/cclifileimport.py 2011-03-26 21:06:34 +0000
@@ -30,15 +30,16 @@
import codecs
from openlp.core.lib import translate
+from openlp.plugins.songs.lib import VerseType
from songimport import SongImport
log = logging.getLogger(__name__)
class CCLIFileImport(SongImport):
"""
- The :class:`CCLIFileImport` class provides OpenLP with the ability to
- import CCLI SongSelect song files in both .txt and .usr formats.
- See http://www.ccli.com/ for more details.
+ The :class:`CCLIFileImport` class provides OpenLP with the ability to import
+ CCLI SongSelect song files in both .txt and .usr formats. See
+ `<http://www.ccli.com/>`_ for more details.
"""
def __init__(self, manager, **kwargs):
@@ -55,7 +56,7 @@
def do_import(self):
"""
- Import either a .usr or a .txt SongSelect file
+ Import either a ``.usr`` or a ``.txt`` SongSelect file.
"""
log.debug(u'Starting CCLI File Import')
song_total = len(self.import_source)
@@ -67,6 +68,7 @@
(song_count, song_total))
filename = unicode(filename)
log.debug(u'Importing CCLI File: %s', filename)
+ self.set_defaults()
lines = []
if os.path.isfile(filename):
detect_file = open(filename, u'r')
@@ -81,12 +83,10 @@
lines = infile.readlines()
ext = os.path.splitext(filename)[1]
if ext.lower() == u'.usr':
- log.info(u'SongSelect .usr format file found %s: ',
- filename)
+ log.info(u'SongSelect .usr format file found: %s', filename)
self.do_import_usr_file(lines)
elif ext.lower() == u'.txt':
- log.info(u'SongSelect .txt format file found %s: ',
- filename)
+ log.info(u'SongSelect .txt format file found: %s', filename)
self.do_import_txt_file(lines)
else:
log.info(u'Extension %s is not valid', filename)
@@ -97,9 +97,8 @@
def do_import_usr_file(self, textList):
"""
- The :func:`do_import_usr_file` method provides OpenLP
- with the ability to import CCLI SongSelect songs in
- *USR* file format
+ The :func:`do_import_usr_file` method provides OpenLP with the ability
+ to import CCLI SongSelect songs in *USR* file format.
``textList``
An array of strings containing the usr file content.
@@ -108,35 +107,46 @@
``[File]``
USR file format first line
+
``Type=``
Indicates the file type
e.g. *Type=SongSelect Import File*
+
``Version=3.0``
File format version
+
``[S A2672885]``
Contains the CCLI Song number e.g. *2672885*
+
``Title=``
Contains the song title (e.g. *Title=Above All*)
+
``Author=``
Contains a | delimited list of the song authors
e.g. *Author=LeBlanc, Lenny | Baloche, Paul*
+
``Copyright=``
Contains a | delimited list of the song copyrights
e.g. Copyright=1999 Integrity's Hosanna! Music |
LenSongs Publishing (Verwaltet von Gerth Medien
Musikverlag)
+
``Admin=``
Contains the song administrator
e.g. *Admin=Gerth Medien Musikverlag*
+
``Themes=``
Contains a /t delimited list of the song themes
e.g. *Themes=Cross/tKingship/tMajesty/tRedeemer*
+
``Keys=``
Contains the keys in which the music is played??
e.g. *Keys=A*
+
``Fields=``
Contains a list of the songs fields in order /t delimited
e.g. *Fields=Vers 1/tVers 2/tChorus 1/tAndere 1*
+
``Words=``
Contains the songs various lyrics in order as shown by the
*Fields* description
@@ -144,57 +154,60 @@
"""
log.debug(u'USR file text: %s', textList)
- self.set_defaults()
+ song_author = u''
+ song_topics = u''
for line in textList:
if line.startswith(u'Title='):
- song_name = line[6:].strip()
+ self.title = line[6:].strip()
elif line.startswith(u'Author='):
song_author = line[7:].strip()
elif line.startswith(u'Copyright='):
- song_copyright = line[10:].strip()
+ self.copyright = line[10:].strip()
+ elif line.startswith(u'Themes='):
+ song_topics = line[7:].strip()
elif line.startswith(u'[S A'):
- song_ccli = line[4:-3].strip()
+ self.ccli_number = line[4:-3].strip()
elif line.startswith(u'Fields='):
- #Fields contain single line indicating verse, chorus, etc,
- #/t delimited, same as with words field. store seperately
- #and process at end.
+ # Fields contain single line indicating verse, chorus, etc,
+ # /t delimited, same as with words field. store seperately
+ # and process at end.
song_fields = line[7:].strip()
elif line.startswith(u'Words='):
song_words = line[6:].strip()
- #Unhandled usr keywords:Type,Version,Admin,Themes,Keys
- #Process Fields and words sections
+ # Unhandled usr keywords: Type, Version, Admin, Keys
+ # Process Fields and words sections.
check_first_verse_line = False
field_list = song_fields.split(u'/t')
words_list = song_words.split(u'/t')
for counter in range(0, len(field_list)):
if field_list[counter].startswith(u'Ver'):
- verse_type = u'V'
+ verse_type = VerseType.Tags[VerseType.Verse]
elif field_list[counter].startswith(u'Ch'):
- verse_type = u'C'
+ verse_type = VerseType.Tags[VerseType.Chorus]
elif field_list[counter].startswith(u'Br'):
- verse_type = u'B'
- else: #Other
- verse_type = u'O'
+ verse_type = VerseType.Tags[VerseType.Bridge]
+ else:
+ verse_type = VerseType.Tags[VerseType.Other]
check_first_verse_line = True
verse_text = unicode(words_list[counter])
verse_text = verse_text.replace(u'/n', u'\n')
verse_lines = verse_text.split(u'\n', 1)
if check_first_verse_line:
if verse_lines[0].startswith(u'(PRE-CHORUS'):
- verse_type = u'P'
+ verse_type = VerseType.Tags[VerseType.PreChorus]
log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0])
verse_text = verse_lines[1]
elif verse_lines[0].startswith(u'(BRIDGE'):
- verse_type = u'B'
+ verse_type = VerseType.Tags[VerseType.Bridge]
log.debug(u'USR verse BRIDGE')
verse_text = verse_lines[1]
elif verse_lines[0].startswith(u'('):
- verse_type = u'O'
+ verse_type = VerseType.Tags[VerseType.Other]
verse_text = verse_lines[1]
if len(verse_text) > 0:
self.add_verse(verse_text, verse_type)
check_first_verse_line = False
- #Handle multiple authors
+ # Handle multiple authors
author_list = song_author.split(u'/')
if len(author_list) < 2:
author_list = song_author.split(u'|')
@@ -204,16 +217,13 @@
self.add_author(u' '.join(reversed(separated)))
else:
self.add_author(author)
- self.title = song_name
- self.copyright = song_copyright
- self.ccli_number = song_ccli
+ self.topics = [topic.strip() for topic in song_topics.split(u'/t')]
self.finish()
def do_import_txt_file(self, textList):
"""
- The :func:`do_import_txt_file` method provides OpenLP
- with the ability to import CCLI SongSelect songs in
- *TXT* file format
+ The :func:`do_import_txt_file` method provides OpenLP with the ability
+ to import CCLI SongSelect songs in *TXT* file format.
``textList``
An array of strings containing the txt file content.
@@ -243,12 +253,10 @@
"""
log.debug(u'TXT file text: %s', textList)
- self.set_defaults()
line_number = 0
check_first_verse_line = False
verse_text = u''
- song_comments = u''
- song_copyright = u''
+ song_author = u''
verse_start = False
for line in textList:
clean_line = line.strip()
@@ -258,12 +266,12 @@
elif verse_start:
if verse_text:
self.add_verse(verse_text, verse_type)
- verse_text = ''
+ verse_text = u''
verse_start = False
else:
#line_number=0, song title
if line_number == 0:
- song_name = clean_line
+ self.title = clean_line
line_number += 1
#line_number=1, verses
elif line_number == 1:
@@ -271,37 +279,37 @@
if clean_line.startswith(u'CCLI'):
line_number += 1
ccli_parts = clean_line.split(' ')
- song_ccli = ccli_parts[len(ccli_parts)-1]
+ self.ccli_number = ccli_parts[len(ccli_parts) - 1]
elif not verse_start:
# We have the verse descriptor
- verse_desc_parts = clean_line.split(' ')
+ verse_desc_parts = clean_line.split(u' ')
if len(verse_desc_parts) == 2:
if verse_desc_parts[0].startswith(u'Ver'):
- verse_type = u'V'
+ verse_type = VerseType.Tags[VerseType.Verse]
elif verse_desc_parts[0].startswith(u'Ch'):
- verse_type = u'C'
+ verse_type = VerseType.Tags[VerseType.Chorus]
elif verse_desc_parts[0].startswith(u'Br'):
- verse_type = u'B'
+ verse_type = VerseType.Tags[VerseType.Bridge]
else:
- #we need to analyse the next line for
- #verse type, so set flag
- verse_type = u'O'
+ # we need to analyse the next line for
+ # verse type, so set flag
+ verse_type = VerseType.Tags[VerseType.Other]
check_first_verse_line = True
verse_number = verse_desc_parts[1]
else:
- verse_type = u'O'
+ verse_type = VerseType.Tags[VerseType.Other]
verse_number = 1
verse_start = True
else:
- #check first line for verse type
+ # check first line for verse type
if check_first_verse_line:
if line.startswith(u'(PRE-CHORUS'):
- verse_type = u'P'
+ verse_type = VerseType.Tags[VerseType.PreChorus]
elif line.startswith(u'(BRIDGE'):
- verse_type = u'B'
+ verse_type = VerseType.Tags[VerseType.Bridge]
# Handle all other misc types
elif line.startswith(u'('):
- verse_type = u'O'
+ verse_type = VerseType.Tags[VerseType.Other]
else:
verse_text = verse_text + line
check_first_verse_line = False
@@ -313,24 +321,19 @@
#line_number=2, copyright
if line_number == 2:
line_number += 1
- song_copyright = clean_line
+ self.copyright = clean_line
#n=3, authors
elif line_number == 3:
line_number += 1
song_author = clean_line
#line_number=4, comments lines before last line
- elif (line_number == 4) and \
- (not clean_line.startswith(u'CCL')):
- song_comments = song_comments + clean_line
+ elif line_number == 4 and not clean_line.startswith(u'CCL'):
+ self.comments += clean_line
# split on known separators
author_list = song_author.split(u'/')
if len(author_list) < 2:
author_list = song_author.split(u'|')
- #Clean spaces before and after author names
+ # Clean spaces before and after author names.
for author_name in author_list:
self.add_author(author_name.strip())
- self.title = song_name
- self.copyright = song_copyright
- self.ccli_number = song_ccli
- self.comments = song_comments
self.finish()
Follow ups