← Back to team overview

openlp-core team mailing list archive

Re: [Merge] lp:~john+ubuntu-g/openlp/singingthefaith into lp:openlp

 

A few in-line comments. Also you don't need to use parenthesis around the expressions in the if statements.

Diff comments:

> 
> === added file 'openlp/plugins/songs/lib/importers/singingthefaith.py'
> --- openlp/plugins/songs/lib/importers/singingthefaith.py	1970-01-01 00:00:00 +0000
> +++ openlp/plugins/songs/lib/importers/singingthefaith.py	2019-06-27 12:35:49 +0000
> @@ -0,0 +1,389 @@
> +# -*- coding: utf-8 -*-
> +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
> +
> +###############################################################################
> +# OpenLP - Open Source Lyrics Projection                                      #
> +# --------------------------------------------------------------------------- #
> +# Copyright (c) 2008-2019 OpenLP Developers                                   #
> +# --------------------------------------------------------------------------- #
> +# This program is free software; you can redistribute it and/or modify it     #
> +# under the terms of the GNU General Public License as published by the Free  #
> +# Software Foundation; version 2 of the License.                              #
> +#                                                                             #
> +# This program is distributed in the hope that it will be useful, but WITHOUT #
> +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
> +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
> +# more details.                                                               #
> +#                                                                             #
> +# You should have received a copy of the GNU General Public License along     #
> +# with this program; if not, write to the Free Software Foundation, Inc., 59  #
> +# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
> +###############################################################################
> +"""
> +The :mod:`singingthefaith` module provides the functionality for importing songs which are
> +exported from Singing The Faith - an Authorised songbook for the Methodist Church of
> +Great Britain."""
> +
> +
> +import logging
> +import re
> +
> +import os
> +
> +from openlp.core.common.i18n import translate
> +from openlp.plugins.songs.lib.importers.songimport import SongImport
> +
> +log = logging.getLogger(__name__)
> +
> +
> +class SingingTheFaithImport(SongImport):
> +    """
> +    Import songs exported from SingingTheFaith
> +    """
> +
> +    hints_available = False
> +    checks_needed = True
> +    hintline = {}
> +    hintfile_version = '0'
> +    hint_verseOrder = ''
> +    hint_songtitle = ''
> +    hint_comments = ''
> +    hint_ignoreIndent = False
> +
> +    def __init__(self, manager, **kwargs):

No need to re implement __init__ here as its not doing anything

> +        """
> +        Initialise the class.
> +        """
> +        super(SingingTheFaithImport, self).__init__(manager, **kwargs)
> +
> +    def do_import(self):
> +        """
> +        Receive a single file or a list of files to import.
> +        """
> +        if not isinstance(self.import_source, list):
> +            return
> +        self.import_wizard.progress_bar.setMaximum(len(self.import_source))
> +        for filename in self.import_source:

file_path would be more descriptive, as it should be a Path object here...

> +            if self.stop_import_flag:
> +                return
> +            song_file = open(filename, 'rt', encoding='cp1251')

a context manager here would be better as it would close the file even if an exception were raised. Also the Path object has the open method built (https://docs.python.org/3/library/pathlib.html#pathlib.Path.open) in Ex.:

with file_path.open('rt', encoding='cp1251'):

> +            self.do_import_file(song_file)
> +            song_file.close()
> +
> +    def do_import_file(self, file):
> +        """
> +        Process the SingingTheFaith file - pass in a file-like object, not a file path.
> +        """
> +        singingTheFaithVersion = 1
> +        self.set_defaults()
> +        # Setup variables
> +        line_number = 0
> +        old_indent = 0
> +        chorus_indent = 5           # It might be 6, but we test for >=
> +        song_title = 'STF000 -'
> +        song_number = '0'
> +        ccli = '0'
> +        current_verse = ''
> +        current_verse_type = 'v'
> +        current_verse_number = 1
> +        has_chorus = False
> +        chorus_written = False
> +        verses = []
> +        author = ''
> +        copyright = ''
> +        check_flag = 'z'            # Prepended to title, remove if we think import should be OK
> +
> +
> +        self.add_comment("Imported with Singing The Faith Importer v "+str(singingTheFaithVersion))
> +
> +# Get the file_song_number - so we can use it for hints
> +        filename = file.name
> +        song_number_file = os.path.splitext(os.path.basename(filename))[0]

make file name a Path object, then you can use filename.stem (https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem) here

> +        song_number_match = re.search('\d+',song_number_file)
> +        if song_number_match:
> +            song_number_file=song_number_match.group()
> +
> +# See if there are hints available at all
> +            # See if there is a hints file in the same location as the file
> +        dir_path = os.path.dirname(os.path.realpath(filename))

also if filename is a Path object then you can do:
dir_path = filename.parent
https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.parent

> +##            print("Pathname is ",dir_path)
> +        hints_file_name = os.path.join(dir_path,"hints.tag")

and using Path objects you could do:
hints_file_path = dir_path / 'hints.tag'

> +        try:
> +            hints_file=open(hints_file_name,"r")
> +            hints_available = self.read_hints(hints_file,song_number_file)
> +        except FileNotFoundError:
> +            hints_available = False
> +
> +
> +        try:
> +            # Read the file
> +            for line in file:
> +                line_number += 1
> +
> +##                print("Read line",line_number,"-",line)
> +
> +                if (hints_available and (str(line_number) in self.hintline)):
> +##                    print("Found hint for line ",line_number)
> +                    hint = self.hintline[str(line_number)]
> +##                    print("Hint is ",hint)
> +                    if (hint == "Comment"):
> +                        line.strip()
> +##                        print("Comment hint for line ",line_number," line is ",line)
> +                        self.add_comment(line)
> +                        line_number += 1
> +                        next(file)
> +                        continue
> +                    elif (hint == "Ignore"):
> +                        line_number += 1
> +                        next(file)
> +                        continue
> +                    elif (hint == "Author"):
> +                        # add as a raw author - do not split and make them a words author
> +                        line.strip()
> +                        self.add_author(line,'words')
> +                        line_number += 1
> +                        next(file)
> +                        continue
> +                    elif (hint.startswith("VariantVerse")):
> + ##                       print("VariantVerse found - hint is ",hint)
> +                        (vv,hintverse,replace)=hint.split(" ",2)
> +                        this_verse = self.verses[int(hintverse)-1]
> +                        this_verse_str = this_verse[1]
> +                        new_verse = this_verse_str
> +                        # There might be multiple replace pairs separated by |
> +                        replaces=replace.split("|")
> +                        for rep in replaces:
> +                            (source_str,dest_str)=rep.split("/")
> +                            new_verse = new_verse.replace(source_str,dest_str)
> +                        self.add_verse(new_verse,'v')
> +                        self.verse_order_list.append('v'+str(current_verse_number))
> +                        current_verse_number += 1
> +                        line_number += 1
> +                        next(file)
> +                        continue
> +                    else:
> +                        self.log_error(translate('SongsPlugin.SingingTheFaithImport', 'File %s' % file.name),
> +                            translate('SongsPlugin.SingingTheFaithImport', 'Unknown hint %s' % hint))
> +                    return
> +                        
> +
> +                # STF exported lines have a leading verse number at the start of each verse.
> +                #  remove them - note that we want to track the indent as that shows a chorus
> +                # so will deal with that before stipping all leading spaces.                
> +                indent = 0
> +                if line.strip():
> +##                    print("Dealing non empty line ",line)
> +                    verse_num_match = re.search('^\d+',line)
> +                    if verse_num_match:
> +                        verse_num = verse_num_match.group()
> +##                        print("Verse num is ",verse_num)
> +                        line = line.lstrip("0123456789")
> +                    indent_match = re.search('^\s+',line)
> +                    if indent_match:
> +                       indent=len(indent_match.group())
> +##                       print("indent is ",indent)
> +
> +                # Assuming we have sorted out what is verse and what is chorus, strip lines, unless ignoreIndent
> +                if not self.hint_ignoreIndent:
> +                    line = line.strip()
> +                else:
> +                    line = line.rstrip()
> +##                print("Read line",line_number,"(",indent,")",line)
> +                if line_number == 2:
> +                    # note that songs seem to start with a blank line
> +                    song_title = line
> +##                    print("Set song title to "+song_title)
> +                # Detect the 'Reproduced from Singing the Faith Electronic Words Edition' line
> +                if line.startswith('Reproduced from Singing the Faith Electronic Words Edition'):
> +                    song_number_match = re.search('\d+',line)
> +                    if song_number_match:
> +                        song_number=song_number_match.group()
> +##                        print("Found Reproduced - song is ",song_number)
> +                        continue
> +                # If the indent is 0 and it contains '(c)' then it is a Copyright line
> +                elif (indent == 0) and ( "(c)" in line):
> +                    copyright = line
> +                    continue
> +                elif (indent == 0) and (line.startswith('Liturgical ')):
> +                    self.add_comment(line)
> +                    continue
> +                elif (indent == 0) and (line.startswith('From The ')):
> +                    self.add_comment(line)
> +                    continue
> +                elif (indent == 0) and (line.startswith('From Common ')):
> +                    self.add_comment(line)
> +                    continue
> +                # If indent is 0 it may be the author, unless it was one of the cases covered above
> +                elif (indent == 0) and len(line)>0 :
> +##                    print ("Possible author ",line)
> +#                   May have more than one author, separated by ' and '
> +                    authors = line.split(' and ')
> +                    for a in authors:
> +                        self.parse_author(a)
> +                    continue
> +                if line == '':
> +##                    print("Starting a new verse")
> +                    if current_verse != '':
> +##                        print("About to add a verse - type ",current_verse_type," ** ",current_verse)
> +                        self.add_verse(current_verse, current_verse_type)
> +                        self.verse_order_list.append(current_verse_type+str(current_verse_number))
> +                        if (current_verse_type == 'c'):
> +                            chorus_written = True
> +                        else:
> +                            current_verse_number += 1
> +                    current_verse = ''
> +                    if chorus_written:
> +##                        print("Setting current_verse_type to v")
> +                        current_verse_type = 'v'
> +                else:
> +                    # If the line is indented more than or equal chorus_indent then assume it is a chorus
> +                    # If then indent has just changed then start a new verse just like hitting a blank line
> +
> +                    if not self.hint_ignoreIndent and ((indent >= chorus_indent) and (old_indent < indent)):
> +##                        print("Change of indent - close off old verse")
> +                        if current_verse != '':
> +##                            print("About to add a verse (indent change) - type ",current_verse_type," ** ",current_verse)
> +                            self.add_verse(current_verse, current_verse_type)
> +                            self.verse_order_list.append(current_verse_type+str(current_verse_number))
> +                            if current_verse_type == 'v':
> +                                current_verse_number += 1
> +                        current_verse = line
> +##                        print("Setting current_verse_type to c");
> +                        current_verse_type = 'c'
> +                        old_indent=indent
> +                        chorus_written = False
> +                        has_chorus = True
> +                        continue
> +                    if current_verse == '':
> +                        current_verse += line
> +                    else:
> +                        current_verse += '\n' + line
> +                old_indent = indent
> +        except Exception as e:
> +            self.log_error(translate('SongsPlugin.SingingTheFaithImport', 'File %s' % file.name),
> +                           translate('SongsPlugin.SingingTheFaithImport', 'Error: %s') % e)
> +            return
> +
> +        if self.hint_songtitle:
> +            song_title = self.hint_songtitle
> +        self.title = check_flag+"STF"+song_number.zfill(3)+" - "+song_title
> +        self.song_book_name="Singing The Faith"
> +        self.song_number = song_number
> +        self.ccli_number = ccli
> +        self.add_copyright(copyright)
> +# If we have a chorus then the generated Verse order can not be used directly, but we can generate
> +#  one for two special cases - Verse followed by one chorus (to be repeated after every verse)
> +#  of Chorus, followed by verses. If hints for ManualCheck or VerseOrder are supplied ignore this
> +        if has_chorus and not self.hint_verseOrder and not self.checks_needed:
> +##            print ("Has chorus - verse order list is ",self.verse_order_list)
> +            auto_verse_order_ok = False
> +            # Popular case V1 C2 V2 ...
> +            if len(self.verse_order_list) >= 1:         # protect against odd cases
> +                if (self.verse_order_list[0] == "v1") and (self.verse_order_list[1] == "c2"):
> +                    new_verse_order_list = ['v1','c1']
> +                    i = 2
> +                    auto_verse_order_ok = True
> +                elif (self.verse_order_list[0] == "c1") and (self.verse_order_list[1] == "v1"):
> +                    new_verse_order_list = ['c1','v1','c1']
> +                    i = 2
> +                    auto_verse_order_ok = True
> +                # if we are in a case we can deal with
> +                if auto_verse_order_ok:
> +                   while i < len(self.verse_order_list):
> +                        if self.verse_order_list[i].startswith('v'):
> +                            new_verse_order_list.append(self.verse_order_list[i])
> +                            new_verse_order_list.append("c1")
> +                        else:
> +                            self.log_error(translate('SongsPlugin.SingingTheFaithImport', 'File %s' % file.name),
> +                                'Error: Strange verse order entry '+self.verse_order_list[i])
> +##                            print("Found strange verseorder entry ",self.verse_order_list[i]," in ",file.name)
> +                            auto_verse_order_ok = False
> +                        i += 1
> +##                    print(" new verse_order_list (Chorus first is ",new_verse_order_list)
> +                   self.verse_order_list = new_verse_order_list 
> +            else:
> +                if not auto_verse_order_ok:
> +                    print ("setting verse_order_list to empty")
> +                    self.verse_order_list = []
> +            # If it is a simple case, 
> +        if self.hint_verseOrder:
> +            self.verse_order_list = self.hint_verseOrder.split(',')
> +        if self.hint_comments:
> +            self.add_comment(self.hint_comments)
> +# Write the title last as by now we will know if we need checks
> +        if ( hints_available and not self.checks_needed):
> +            check_flag=''
> +        elif ( not hints_available and not has_chorus):
> +            check_flag=''
> +        elif ( not hints_available and has_chorus and auto_verse_order_ok):
> +            check_flag=''
> +        self.title = check_flag+"STF"+song_number.zfill(3)+" - "+song_title
> +        if not self.finish():
> +            self.log_error(file.name)
> +
> +
> +    def read_hints(self, file, song_number ):
> +        hintfound = False
> +#   clear hints
> +        self.hint_verseOrder = ''
> +        self.hintline.clear()
> +        self.hint_comments = ''
> +        self.hint_songtitle = ''
> +        self.hint_ignoreIndent = False
> +
> +##        print("Reading the hints file for ",song_number)
> +        for tl in file:
> +#   if the line is empty then return
> +            if not tl.strip():
> +                return hintfound
> +            tagval = tl.split(':')
> +            tag = tagval[0].strip()
> +            val = tagval[1].strip()
> +            if (tag == "Version") :
> +                self.hintfile_version = val
> +                continue
> +            if (tag == "Hymn") and (val == song_number):
> +##                print ("Found song ",song_number," in hints")
> +                self.add_comment("Using hints version "+str(self.hintfile_version))
> +                hintfound = True
> +#   Assume, unless the hints has ManualCheck that if hinted all will be OK
> +                self.checks_needed = False
> +                for tl in file:
> +                    tagval = tl.split(':')
> +                    tag = tagval[0].strip()
> +                    val = tagval[1].strip()
> +                    if (tag == "End"):
> +                        return hintfound
> +                    elif (tag == "CommentsLine"):
> +                        vals = val.split(',')
> +                        for v in vals:
> +                            self.hintline[v] = "Comment"
> +                    elif (tag == "IgnoreLine"):
> +                        vals = val.split(',')
> +                        for v in vals:
> +                            self.hintline[v] = "Ignore"
> +                    elif (tag == "AuthorLine"):
> +                        vals = val.split(',')
> +                        for v in vals:
> +                            self.hintline[v] = "Author"  
> +                    elif (tag == "VerseOrder"):
> +                        self.hint_verseOrder = val
> +                    elif (tag == "ManualCheck"):
> +                        self.checks_needed = True
> +                    elif (tag == "IgnoreIndent"):
> +                        self.hint_ignoreIndent = True
> +                    elif (tag == "VariantVerse"):
> +                        vvline = val.split(' ',1)
> +                        self.hintline[vvline[0].strip()] = "VariantVerse "+vvline[1].strip()
> +                    elif (tag == "SongTitle"):
> +                        self.hint_songtitle = val
> +                    elif (tag == "AddComment"):
> +                        self.hint_comments += '\n' + val
> +                    else:
> +                        print("Unknown tag ",tag," value ",val)
> +
> +
> +
> +        return hintfound        
> + 
> +      


-- 
https://code.launchpad.net/~john+ubuntu-g/openlp/singingthefaith/+merge/369398
Your team OpenLP Core is subscribed to branch lp:openlp.


Follow ups

References