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