Some cleanup and comments

This commit is contained in:
Tomas Groth 2014-04-04 22:28:55 +02:00
parent 7be9613bf0
commit 232ff2b73f
2 changed files with 48 additions and 5 deletions

View File

@ -110,6 +110,15 @@ class EasyWorshipSongImport(SongImport):
log.debug('No encoding set.') log.debug('No encoding set.')
return return
self.ews_file = open(self.import_source, 'rb') self.ews_file = open(self.import_source, 'rb')
# EWS header, version '1.6'/' 3'/' 5':
# Offset Field Data type Length Details
# --------------------------------------------------------------------------------------------------
# 0 Filetype string 38 Specifies the file type and version.
# "EasyWorship Schedule File Version 1.6" or
# "EasyWorship Schedule File Version 3" or
# "EasyWorship Schedule File Version 5"
# 40/48/56 Entry count int32le 4 Number of items in the schedule
# 44/52/60 Entry length int16le 2 Length of schedule entries: 0x0718 = 1816
# Get file version # Get file version
type, = struct.unpack('<38s', self.ews_file.read(38)) type, = struct.unpack('<38s', self.ews_file.read(38))
version = type.decode()[-3:] version = type.decode()[-3:]
@ -130,22 +139,39 @@ class EasyWorshipSongImport(SongImport):
self.import_wizard.progress_bar.setMaximum(entry_count) self.import_wizard.progress_bar.setMaximum(entry_count)
# Loop over songs # Loop over songs
for i in range(entry_count): for i in range(entry_count):
# Load entry metadata # Load EWS entry metadata:
# Offset Field Data type Length Details
# ------------------------------------------------------------------------------------------------
# 0 Title cstring 50
# 307 Author cstring 50
# 358 Copyright cstring 100
# 459 Administrator cstring 50
# 800 Content pointer int32le 4 Position of the content for this entry.
# 820 Content type int32le 4 0x01 = Song, 0x02 = Scripture, 0x03 = Presentation,
# 0x04 = Video, 0x05 = Live video, 0x07 = Image,
# 0x08 = Audio, 0x09 = Web
# 1410 Song number cstring 10
self.set_defaults() self.set_defaults()
self.title = self.get_string(file_pos, 50) self.title = self.get_string(file_pos + 0, 50)
resource = self.get_string(file_pos + 51, 255)
authors = self.get_string(file_pos + 307, 50) authors = self.get_string(file_pos + 307, 50)
copyright = self.get_string(file_pos + 358, 100) copyright = self.get_string(file_pos + 358, 100)
admin = self.get_string(file_pos + 459, 50) admin = self.get_string(file_pos + 459, 50)
cont_ptr = self.get_i32(file_pos + 800) cont_ptr = self.get_i32(file_pos + 800)
cont_type = self.get_i32(file_pos + 820) cont_type = self.get_i32(file_pos + 820)
notes = self.get_string(file_pos + 1155, 160)
self.ccli_number = self.get_string(file_pos + 1410, 10) self.ccli_number = self.get_string(file_pos + 1410, 10)
# Only handle content type 1 (songs) # Only handle content type 1 (songs)
if cont_type != 1: if cont_type != 1:
file_pos += entry_length file_pos += entry_length
continue continue
# Load song content # Load song content
# Offset Field Data type Length Details
# ------------------------------------------------------------------------------------------------
# 0 Length int32le 4 Length (L) of the content, including the compressed content
# and the following fields (14 bytes total).
# 4 Content string L-14 Content compressed with deflate.
# Checksum int32be 4 Alder-32 checksum.
# (unknown) 4 0x51 0x4b 0x03 0x04
# Content length int32le 4 Length of content after decompression
content_length = self.get_i32(cont_ptr) content_length = self.get_i32(cont_ptr)
deflated_content = self.get_bytes(cont_ptr + 4, content_length - 10) deflated_content = self.get_bytes(cont_ptr + 4, content_length - 10)
deflated_length = self.get_i32(cont_ptr + 4 + content_length - 6) deflated_length = self.get_i32(cont_ptr + 4 + content_length - 6)
@ -293,6 +319,10 @@ class EasyWorshipSongImport(SongImport):
def set_song_import_object(self, authors, words): def set_song_import_object(self, authors, words):
""" """
Set the SongImport object members. Set the SongImport object members.
:param authors: String with authons
:param words: Bytes with rtf-encoding
:return:
""" """
if authors: if authors:
# Split up the authors # Split up the authors
@ -429,6 +459,10 @@ class EasyWorshipSongImport(SongImport):
def get_bytes(self, pos, length): def get_bytes(self, pos, length):
""" """
Get bytes from ews_file Get bytes from ews_file
:param pos: Position to read from
:param length: Bytes to read
:return: Bytes read
""" """
self.ews_file.seek(pos) self.ews_file.seek(pos)
return self.ews_file.read(length) return self.ews_file.read(length)
@ -436,6 +470,10 @@ class EasyWorshipSongImport(SongImport):
def get_string(self, pos, length): def get_string(self, pos, length):
""" """
Get string from ews_file Get string from ews_file
:param pos: Position to read from
:param length: Characters to read
:return: String read
""" """
bytes = self.get_bytes(pos, length) bytes = self.get_bytes(pos, length)
mask = '<' + str(length) + 's' mask = '<' + str(length) + 's'
@ -445,6 +483,9 @@ class EasyWorshipSongImport(SongImport):
def get_i16(self, pos): def get_i16(self, pos):
""" """
Get short int from ews_file Get short int from ews_file
:param pos: Position to read from
:return: Short integer read
""" """
bytes = self.get_bytes(pos, 2) bytes = self.get_bytes(pos, 2)
@ -455,6 +496,9 @@ class EasyWorshipSongImport(SongImport):
def get_i32(self, pos): def get_i32(self, pos):
""" """
Get long int from ews_file Get long int from ews_file
:param pos: Position to read from
:return: Long integer read
""" """
bytes = self.get_bytes(pos, 4) bytes = self.get_bytes(pos, 4)
mask = '<i' mask = '<i'

View File

@ -456,4 +456,3 @@ class TestEasyWorshipSongImport(TestCase):
for verse_text, verse_tag in EWS_SONG_TEST_DATA['verses']: for verse_text, verse_tag in EWS_SONG_TEST_DATA['verses']:
mocked_add_verse.assert_any_call(verse_text, verse_tag) mocked_add_verse.assert_any_call(verse_text, verse_tag)
mocked_finish.assert_called_with() mocked_finish.assert_called_with()