- import topics from usr files (txt files seem not to support topics)

- clean ups

bzr-revno: 1435
This commit is contained in:
Andreas Preikschat 2011-03-28 16:42:38 +02:00
commit 5cae56ebb3

View File

@ -30,15 +30,16 @@ import chardet
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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
(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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
``[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 @@ class CCLIFileImport(SongImport):
"""
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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
"""
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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
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 @@ class CCLIFileImport(SongImport):
#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()