From 5d63820b174157c8c7714c39dc0e250557810d9f Mon Sep 17 00:00:00 2001 From: Tomas Groth Date: Fri, 2 May 2014 23:07:56 +0200 Subject: [PATCH] Added support for importing EW songs even if RTF is not escaped as espected, also fixed importing og songs with unicode in metadata. Fixes: https://launchpad.net/bugs/1299837 --- openlp/plugins/songs/lib/ewimport.py | 25 +++++++++++++----- .../openlp_plugins/songs/test_ewimport.py | 24 ++++++++++++++++- tests/resources/easyworshipsongs/Songs.DB | Bin 6144 -> 6144 bytes tests/resources/easyworshipsongs/Songs.MB | Bin 12288 -> 20480 bytes 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py index faa4122c8..604a70d81 100644 --- a/openlp/plugins/songs/lib/ewimport.py +++ b/openlp/plugins/songs/lib/ewimport.py @@ -281,7 +281,7 @@ class EasyWorshipSongImport(SongImport): raw_record = db_file.read(record_size) self.fields = self.record_structure.unpack(raw_record) self.set_defaults() - self.title = self.get_field(fi_title).decode() + self.title = self.get_field(fi_title).decode('unicode-escape') # Get remaining fields. copy = self.get_field(fi_copy) admin = self.get_field(fi_admin) @@ -289,16 +289,16 @@ class EasyWorshipSongImport(SongImport): authors = self.get_field(fi_author) words = self.get_field(fi_words) if copy: - self.copyright = copy.decode() + self.copyright = copy.decode('unicode-escape') if admin: if copy: self.copyright += ', ' self.copyright += translate('SongsPlugin.EasyWorshipSongImport', - 'Administered by %s') % admin.decode() + 'Administered by %s') % admin.decode('unicode-escape') if ccli: - self.ccli_number = ccli.decode() + self.ccli_number = ccli.decode('unicode-escape') if authors: - authors = authors.decode() + authors = authors.decode('unicode-escape') else: authors = '' # Set the SongImport object members. @@ -328,7 +328,20 @@ class EasyWorshipSongImport(SongImport): self.add_author(author_name.strip()) if words: # Format the lyrics - result = strip_rtf(words.decode(), self.encoding) + result = None + decoded_words = None + try: + decoded_words = words.decode() + except UnicodeDecodeError: + log.debug('The unicode chars in the rtf was not escaped in the expected manor, doing it manually.') + newbytes = bytearray() + for b in words: + if b > 127: + newbytes += bytearray(b'\\\'') + bytearray(str(hex(b))[-2:].encode()) + else: + newbytes.append(b) + decoded_words = newbytes.decode() + result = strip_rtf(decoded_words, self.encoding) if result is None: return words, self.encoding = result diff --git a/tests/functional/openlp_plugins/songs/test_ewimport.py b/tests/functional/openlp_plugins/songs/test_ewimport.py index 49bc367cd..e93ce9517 100644 --- a/tests/functional/openlp_plugins/songs/test_ewimport.py +++ b/tests/functional/openlp_plugins/songs/test_ewimport.py @@ -67,7 +67,21 @@ SONG_TEST_DATA = [ 'Just to learn from His lips, words of comfort,\nIn the beautiful garden of prayer.', 'v2'), ('There\'s a garden where Jesus is waiting,\nAnd He bids you to come meet Him there,\n' 'Just to bow and receive a new blessing,\nIn the beautiful garden of prayer.', 'v3')], - 'verse_order_list': []}] + 'verse_order_list': []}, + {'title': 'Vi pløjed og vi så\'de', + 'authors': ['Matthias Claudius'], + 'copyright': 'Public Domain', + 'ccli_number': 0, + 'verses': + [('Vi pløjed og vi så\'de\nvor sæd i sorten jord,\nså bad vi ham os hjælpe,\nsom højt i Himlen bor,\n' + 'og han lod snefald hegne\nmod frosten barsk og hård,\nhan lod det tø og regne\nog varme mildt i vår.', + 'v1'), + ('Alle gode gaver\nde kommer ovenned,\nså tak da Gud, ja, pris dog Gud\nfor al hans kærlighed!', 'c1'), + ('Han er jo den, hvis vilje\nopholder alle ting,\nhan klæder markens lilje\nog runder himlens ring,\n' + 'ham lyder vind og vove,\nham rører ravnes nød,\nhvi skulle ej hans småbørn\nda og få dagligt brød?', 'v2'), + ('Ja, tak, du kære Fader,\nså mild, så rig, så rund,\nfor korn i hæs og lader,\nfor godt i allen stund!\n' + 'Vi kan jo intet give,\nsom nogen ting er værd,\nmen tag vort stakkels hjerte,\nså ringe som det er!', 'v3')], + 'verse_order_list': []}] EWS_SONG_TEST_DATA =\ {'title': 'Vi pløjed og vi så\'de', @@ -139,6 +153,14 @@ class TestEasyWorshipSongImport(TestCase): """ Test the functions in the :mod:`ewimport` module. """ + def setUp(self): + self.songimport_patcher = patch('openlp.plugins.songs.lib.ewimport.EasyWorshipSongImport.__init__') + self.mocked_songimport = self.songimport_patcher.start() + self.mocked_songimport.return_value = None + + def tearDown(self): + self.songimport_patcher.stop() + def create_field_desc_entry_test(self): """ Test creating an instance of the :class`FieldDescEntry` class. diff --git a/tests/resources/easyworshipsongs/Songs.DB b/tests/resources/easyworshipsongs/Songs.DB index 8c9679b86a8bacecdd559011139959ccbd0c155a..b6a13abc5b28bd7fbf670ba370ad6517fc2e7cb9 100644 GIT binary patch delta 492 zcmXZYKS/zXg?^7pjlLZH2RANuvX#*#CoOYx>+ z=~6ie-PEo7(T)xdF6y95?b2|dE)Ip#p@Nb=P~V3i@54L3zUiB#r37>&;sCVUq}biP zrkb;UD%JvGK#SqzbI2by)yY9~v-BXjecD?tZ;Dsze}*G

>7rSg&Lpd1xwil%9v zDkSJFeWWc4X_t=ZJ6+H(x}kI-Qdu&{qQ|sIit4mMK_M!uFDzf_fPT<9{ibWui;=oV zgY<}=lBD%w6n@Ye@sSwfn7}v^NFvQ=w4oh$(1A{Lp&LEOpoCsz(T9h@LNb>rViYDU zjA0VCwnYN7SnzY^Ed0Qh_6QXKXUbuB(jg_Y=HQ{hqmj9nyCeWV^ npLGpt*}cQFflF%`{;a4Pvv$=}BK+Jvu7!#Ael7fz{HFZ_Ud61z delta 356 zcmXZYJ4gdj5Czb?n|*O(;@{Qy0Sg;Nl!(Y$tjVSmI}uw!R*UdRWg)2yf&r@-6+uv} z)D(8Funh?5M69(?rxL703qjCZIKzQEOf^%^lrw(hz=dN2u>L#69K65kpemYi5?ubW zS=lg5i5cTF%Y`Z{#UVC6KO}7Yw*iEuo*`ZO! z0wS>@+er#5gx*O~Rg0ZNIyBhZYag6{uRl1r@y%No&UYIhdWG0X+&nZ<|MUHYetG-wSn_jQLpD zX@4---I}eN(ql*72b-@bDhk})6%G^{4&wMGE zGqujPx?`V~+%v}~B4eCQt?t_$b$79?kfE3K%($tonuv}W_Svt4( zBlr@Tyt6M$Yv4RqaedBEXcUO=EjUmr#^D2}xfL$JkteJ~JTk7V;MqAFnxIhJJe7-y zS5oLSwqxQUb?{uko$zb^o+jQ@D#aA6CioI|e*{P3UE0-=?@FQBRBVFm6m=oxQwv6# z5vDsi^PJ+S`yGC^lA_#|5(P`az<-moYaK8>-Zchm1EL*5lAiWB-rVbh)t6?%HGj ze^Uaww`;#vlRj1d|4V5sitGRZ;Mb;XOa;^gnb(RHP$Gmz&w&PNHfAQLy6;?sbddMo z<{ElCq^6|O8jb01d?Jlye9EOq*F-h;v0!E_^sF{6xEBEh_o=y;svFPn;bnpVN1sv$ zf)buD+=?KLlmJ8?rIW*PFP`PPC)FXHKmOv z=7!KH0(|_YhFXKJ6TQCGEVrg={Ho*_F+DXlbL0jn7daMR0=#_EH07Vx$3aTbhYn}* zG4f|B!T7nU$tR>2L4Schd@L)9JsT2d3s0vc-r{DE0)-@XifJ*05DN_=EFmp-anu|h za32>SvLfdy!%};p1Nf`}gloyY(U<~z&?(2e_(XYSpKK!>)42b%aVK|vTwRWcE57AeQ9;2qs96$q7amy z8Pq&f?TL^Cdp$^gn~YOE)Twd|w#8zK23PXZC!6h|aRsz3`7!r12oz_LkZ z*o?DQpL~y%6;tN~IKk$p<{g1a9FWQ>ds|937MPY#v~Wz*-yu-}=Q1~{$t&V)Hi2D5 zsV8mjq`OZ;L>a;=CoDuXUkq