import topics from usr files, clean ups

This commit is contained in:
Andreas Preikschat 2011-03-26 21:07:19 +01:00
parent 125e9e29c5
commit d83f14f8fb

View File

@ -30,6 +30,7 @@ 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__)
@ -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')
@ -108,35 +110,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,16 +157,19 @@ 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
@ -161,40 +177,40 @@ class CCLIFileImport(SongImport):
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,9 +220,7 @@ 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):
@ -243,12 +257,11 @@ 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'' song_topics = 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 +271,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 +284,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 +326,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()