forked from openlp/openlp
- import topics from usr files (txt files seem not to support topics)
- clean ups bzr-revno: 1435
This commit is contained in:
commit
5cae56ebb3
@ -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,16 +154,19 @@ 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
|
||||
@ -161,35 +174,35 @@ class CCLIFileImport(SongImport):
|
||||
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)
|
||||
@ -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'
|
||||
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
|
||||
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()
|
||||
|
Loading…
Reference in New Issue
Block a user