Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kitinerary for openSUSE:Factory 
checked in at 2022-05-14 22:53:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kitinerary (Old)
 and      /work/SRC/openSUSE:Factory/.kitinerary.new.1538 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kitinerary"

Sat May 14 22:53:01 2022 rev:48 rq:976798 version:22.04.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/kitinerary/kitinerary.changes    2022-04-24 
00:19:43.184267555 +0200
+++ /work/SRC/openSUSE:Factory/.kitinerary.new.1538/kitinerary.changes  
2022-05-14 22:53:32.795094717 +0200
@@ -1,0 +2,8 @@
+Tue May 10 16:30:10 UTC 2022 - Christophe Giboudeaux <[email protected]>
+
+- Update to 22.04.1
+  * New bugfix release
+  * For more details please see:
+  * https://kde.org/announcements/gear/22.04.1/
+
+-------------------------------------------------------------------

Old:
----
  kitinerary-22.04.0.tar.xz
  kitinerary-22.04.0.tar.xz.sig

New:
----
  kitinerary-22.04.1.tar.xz
  kitinerary-22.04.1.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kitinerary.spec ++++++
--- /var/tmp/diff_new_pack.M1GvkY/_old  2022-05-14 22:53:33.323095377 +0200
+++ /var/tmp/diff_new_pack.M1GvkY/_new  2022-05-14 22:53:33.327095382 +0200
@@ -18,7 +18,7 @@
 
 %bcond_without released
 Name:           kitinerary
-Version:        22.04.0
+Version:        22.04.1
 Release:        0
 Summary:        Data model and extraction system for travel reservations
 License:        LGPL-2.1-or-later


++++++ kitinerary-22.04.0.tar.xz -> kitinerary-22.04.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/.gitlab-ci.yml 
new/kitinerary-22.04.1/.gitlab-ci.yml
--- old/kitinerary-22.04.0/.gitlab-ci.yml       2022-04-13 00:01:51.000000000 
+0200
+++ new/kitinerary-22.04.1/.gitlab-ci.yml       2022-05-07 12:07:42.000000000 
+0200
@@ -6,3 +6,4 @@
   - 
https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml
   - 
https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml
   - 
https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android.yml
+  - 
https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/CMakeLists.txt 
new/kitinerary-22.04.1/CMakeLists.txt
--- old/kitinerary-22.04.0/CMakeLists.txt       2022-04-13 00:01:51.000000000 
+0200
+++ new/kitinerary-22.04.1/CMakeLists.txt       2022-05-07 12:07:42.000000000 
+0200
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: BSD-3-Clause
 
 cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
-set(PIM_VERSION "5.20.0")
+set(PIM_VERSION "5.20.1")
 project(KItinerary VERSION ${PIM_VERSION})
 
 set(KF5_MIN_VERSION "5.91.0")
@@ -41,8 +41,8 @@
     find_package(SharedMimeInfo 1.3 REQUIRED)
 endif()
 
-set(KMIME_VERSION "5.20.0")
-set(PIM_PKPASS "5.20.0")
+set(KMIME_VERSION "5.20.1")
+set(PIM_PKPASS "5.20.1")
 
 find_package(KF5Mime ${KMIME_VERSION} CONFIG REQUIRED)
 find_package(KF5CalendarCore ${KF5_MIN_VERSION} CONFIG)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kitinerary-22.04.0/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json
 
new/kitinerary-22.04.1/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json
--- 
old/kitinerary-22.04.0/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json
      2022-04-13 00:01:51.000000000 +0200
+++ 
new/kitinerary-22.04.1/autotests/extractordata/sncf/ticket-barcode-single-leg.txt.json
      2022-05-07 12:07:42.000000000 +0200
@@ -3,6 +3,10 @@
         "@context": "http://schema.org";,
         "@type": "TrainReservation",
         "modifiedTime": "2017-12-29T18:46:02+01:00",
+        "programMembershipUsed": {
+            "@type": "ProgramMembership",
+            "programName": "Ayant Droit Avec Fichet"
+        },
         "reservationFor": {
             "@type": "TrainTrip",
             "arrivalStation": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/po/zh_CN/kitinerary.po 
new/kitinerary-22.04.1/po/zh_CN/kitinerary.po
--- old/kitinerary-22.04.0/po/zh_CN/kitinerary.po       2022-04-15 
02:23:39.000000000 +0200
+++ new/kitinerary-22.04.1/po/zh_CN/kitinerary.po       2022-05-10 
07:57:47.000000000 +0200
@@ -8,7 +8,7 @@
 "Project-Id-Version: kdeorg\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2022-03-13 03:06+0000\n"
-"PO-Revision-Date: 2022-04-14 15:36\n"
+"PO-Revision-Date: 2022-05-08 08:17\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Simplified\n"
 "Language: zh_CN\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kitinerary-22.04.0/src/cli/org.kde.kitinerary-extractor.appdata.xml 
new/kitinerary-22.04.1/src/cli/org.kde.kitinerary-extractor.appdata.xml
--- old/kitinerary-22.04.0/src/cli/org.kde.kitinerary-extractor.appdata.xml     
2022-04-13 00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/cli/org.kde.kitinerary-extractor.appdata.xml     
2022-05-07 12:07:42.000000000 +0200
@@ -104,9 +104,9 @@
     <binary>kitinerary-extractor</binary>
   </provides>
   <releases>
+    <release version="5.20.1" date="2022-05-12"/>
     <release version="5.20.0" date="2022-04-21"/>
     <release version="5.19.3" date="2022-03-03"/>
     <release version="5.19.2" date="2022-02-03"/>
-    <release version="5.19.1" date="2022-01-06"/>
   </releases>
 </component>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kitinerary-22.04.0/src/lib/extractorpostprocessor.cpp 
new/kitinerary-22.04.1/src/lib/extractorpostprocessor.cpp
--- old/kitinerary-22.04.0/src/lib/extractorpostprocessor.cpp   2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/extractorpostprocessor.cpp   2022-05-07 
12:07:42.000000000 +0200
@@ -117,6 +117,11 @@
             elem = d->processEvent(elem.value<Event>());
         }
 
+        // non-reservation types
+        else if (JsonLd::isA<ProgramMembership>(elem)) {
+            elem = 
d->processProgramMembership(elem.value<ProgramMembership>());
+        }
+
         d->mergeOrAppend(elem);
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/booking.js 
new/kitinerary-22.04.1/src/lib/scripts/booking.js
--- old/kitinerary-22.04.0/src/lib/scripts/booking.js   2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/booking.js   2022-05-07 
12:07:42.000000000 +0200
@@ -87,6 +87,36 @@
     }
 }
 
+function parseHtmlCommon(doc, node, res)
+{
+    const aElems = doc.eval('//a');
+    for (aElem of aElems) {
+        const href = aElem.attribute('href');
+        if (href.startsWith('tel:')) {
+            res.reservationFor.telephone = aElem.content;
+        } else if (href.startsWith('mailto:')) {
+            res.reservationFor.email = href.substr(7);
+            // reservation id is the prefix in the mailto link, unlike other 
occurrences this seems most reliably present
+            res.reservationNumber = href.match(/mailto:(\d+)-/)[1];
+        } else if (aElem.attribute('universal') == 'true') {
+            res.reservationFor.name = aElem.content;
+        } else if (aElem.content.match(/modify/) && href.startsWith("https:")) 
{
+            res.modifyReservationUrl = href;
+        }
+    }
+
+    const times = doc.eval('//time');
+    res.checkinTime = times[0].attribute("datetime");
+    res.checkoutTime = times[1].attribute("datetime");
+
+    const guest = doc.root.recursiveContent.match(/(?:Guest name|Nombre del 
hu??sped|Name des Gastes)[\n\s]+?(\S.*)\n/);
+    if (guest) {
+        res.underName.name = guest[1];
+    }
+
+    return res;
+}
+
 function parseHtml(doc, node)
 {
     if (node.result.length > 0)
@@ -125,19 +155,20 @@
             res.reservationStatus = "ReservationCancelled"
         }
     }
-
     res.reservationFor.telephone = 
elem.eval(".//*[@class=\"u-phone\"]")[0].content;
+    return parseHtmlCommon(doc, node, res);
+}
 
-    // reservation id is the prefix in the mailto link, unlike other 
occurrences this seems most reliably present
-    var email = 
elem.eval(".//tr/td/a")[1].attribute("href").match(/mailto:(\d+)-/);
-    if (email) {
-        res.reservationNumber = email[1]
-    }
-
-    elem = doc.eval("//table[@class=\"mg_conf_booking_summary\"]")[0];
-    var times = elem.eval(".//time");
-    res.checkinTime = times[0].attribute("datetime");
-    res.checkoutTime = times[1].attribute("datetime");
+function parseHtmlAlternative(doc, node)
+{
+    if (node.result.length > 0)
+        return null; // this is just backup if we have no structured data
+    var res = JsonLd.newLodgingReservation();
 
-    return res;
+    const addrElems = doc.eval('//address')[0].content.split(',\n');
+    res.reservationFor.address.streetAddress = addrElems[0];
+    res.reservationFor.address.addressLocality = addrElems[1];
+    res.reservationFor.address.postalCode = addrElems[2];
+    res.reservationFor.address.addressCountry = addrElems[3];
+    return parseHtmlCommon(doc, node, res);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/booking.json 
new/kitinerary-22.04.1/src/lib/scripts/booking.json
--- old/kitinerary-22.04.0/src/lib/scripts/booking.json 2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/booking.json 2022-05-07 
12:07:42.000000000 +0200
@@ -9,5 +9,11 @@
         "filter": [ { "field": "From", "match": "@booking.com", "mimeType": 
"message/rfc822", "scope": "Ancestors" } ],
         "script": "booking.js",
         "function": "parseHtml"
+    },
+    {
+        "mimeType": "text/html",
+        "filter": [ { "field": "From", "match": "@booking.com", "mimeType": 
"message/rfc822", "scope": "Ancestors" } ],
+        "script": "booking.js",
+        "function": "parseHtmlAlternative"
     }
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/eurowings.js 
new/kitinerary-22.04.1/src/lib/scripts/eurowings.js
--- old/kitinerary-22.04.0/src/lib/scripts/eurowings.js 2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/eurowings.js 2022-05-07 
12:07:42.000000000 +0200
@@ -6,11 +6,11 @@
 
 function main(text) {
     var reservations = new Array();
-    var bookingRef = text.match(/(?:Individual reservation code|Individueller 
Buchungscode):\s*\*\* ([A-Z0-9]{6})/);
+    var bookingRef = text.match(/(?:Individual reservation code|Individueller 
Buchungscode):?\s*(?:\(beim Check-In angeben\))?\s*\*\* ([A-Z0-9]{6})/);
 
     var pos = 0;
     while (true) {
-        var flightLine = text.substr(pos).match(/(?:Flight|Flug): 
([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*([A-Z0-9]{2}) ([0-9]{3,4}).*\n/);
+        var flightLine = text.substr(pos).match(/(?:Flight|Flug): 
([0-9]{2}\.[0-9]{2}\.[0-9]{4})\s*\|\s*(?:Flugnummer\:)?\s*([A-Z0-9]{2}) 
([0-9]{3,4}).*\n/);
         if (!flightLine)
             break;
         var idx = flightLine.index + flightLine[0].length;
@@ -21,20 +21,20 @@
 
         res.reservationFor.airline.iataCode = flightLine[2];
 
-        var opByLine = text.substr(pos + idx).match(/^\s*\* (?:operated 
by|durchgef??hrt von) (.*)\n/);
+        var opByLine = text.substr(pos + idx).match(/^\s*\* (?:[Oo]perated 
by|durchgef??hrt von) (.*)\n/);
         if (opByLine) {
             idx += opByLine.index + opByLine[0].length;
             res.reservationFor.airline.name = opByLine[1];
         }
 
-        var depLine = text.substr(pos + 
idx).match(/(?:Departure|Abflug):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/);
+        var depLine = text.substr(pos + 
idx).match(/(?:Departure|Abflug):?\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/);
         if (!depLine)
             break;
         idx += depLine.index + depLine[0].length;
         res.reservationFor.departureTime = JsonLd.toDateTime(flightLine[1] + ' 
' + depLine[1], "dd.MM.yyyy hh:mm", "en");
         res.reservationFor.departureAirport.name = depLine[2];
 
-        var arrLine = text.substr(pos + 
idx).match(/(?:Arrival|Ankunft):\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/);
+        var arrLine = text.substr(pos + 
idx).match(/(?:Arrival|Ankunft):?\s*([0-9]{2}:[0-9]{2})\s+(.*)\n/);
         if (!arrLine)
             break;
         idx += arrLine.index + arrLine[0].length;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.js 
new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.js
--- old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.js    2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.js    2022-05-07 
12:07:42.000000000 +0200
@@ -6,12 +6,12 @@
 
 function main(content) {
 
-    const resId = content.match(/Buchungsnummer:(.+)/)[1]
+    const resId = content.match(/Buchungsnummer:\n?\s*(.+)/)[1]
 
-    const arrivalDate = content.match(/Anreisetag: (.+)/)[1]
-    const departureDate = content.match(/Abreisetag: (.+)/)[1]
+    const arrivalDate = content.match(/Anreisetag:\n? (.+)/)[1]
+    const departureDate = content.match(/Abreisetag:\n? (.+)/)[1]
 
-    const guestName = content.match(/Gastname: (Herr|Frau) (.+)/)[2]
+    const guestName = content.match(/Gastname:\n? (?:Herr|Frau)? ?(.+)/)[1]
 
     const addressBlock = content.match(/Ihr\n(.*)\n(.*)\n(.*)/)
 
@@ -30,11 +30,11 @@
     const telephone = content.match(/Tel.: (.*)/)[1]
     const email = content.match(/E-Mail:  (.*)/)[1]
 
-    const price = content.match(/Gesamtpreis: (.*) EUR/)[1].replace(',', '.')
+    const price = content.match(/Gesamtpreis:\n? (.*) EUR/)[1].replace(',', 
'.')
 
-    const numberAdults = content.match(/Anzahl der Erwachsene[rn]: 
([0-9]+)/)[1]
+    const numberAdults = content.match(/Anzahl der Erwachsene[rn]:\n? 
([0-9]+)/)[1]
 
-    const numberChildren = content.match(/Anzahl der Kinder: ([0-9]+)/)[1]
+    const numberChildren = content.match(/Anzahl der Kinder:\n? ([0-9]+)/)[1]
 
     var res = JsonLd.newLodgingReservation()
 
@@ -59,3 +59,18 @@
 
     return res
 }
+
+function parsePkPass(pass)
+{
+    var res = JsonLd.newLodgingReservation();
+    res.reservationFor.name = pass.organizationName;
+    res.checkinTime = 
JsonLd.toDateTime(pass.field['BGcheckin'].value.substr(0, 18), 'dd.MM.yyyy - 
hh:mm', 'de');
+    res.checkoutTime = 
JsonLd.toDateTime(pass.field['BGcheckout'].value.substr(0, 18), 'dd.MM.yyyy - 
hh:mm', 'de');
+    res.reservationFor.geo.latitude = pass.locations[0].latitude;
+    res.reservationFor.geo.longitude = pass.locations[0].longitude;
+    res.reservationFor.address.streetAddress = pass.field['address'].value;
+    res.reservationFor.telephone = pass.field['phone'].value;
+    res.reservationNumber = pass.field['bookId'].value;
+    res.underName.name = pass.field['guestname'].value;
+    return res;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.json 
new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.json
--- old/kitinerary-22.04.0/src/lib/scripts/onepagebooking.json  2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/onepagebooking.json  2022-05-07 
12:07:42.000000000 +0200
@@ -1,4 +1,4 @@
-{
+[{
     "filter": [
         {
             "field": "From",
@@ -10,4 +10,17 @@
     "function": "main",
     "mimeType": "text/plain",
     "script": "onepagebooking.js"
-}
+},
+{
+    "filter": [
+        {
+            "field": "passTypeIdentifier",
+            "match": "pass.onepagebooking.com",
+            "mimeType": "application/vnd.apple.pkpass",
+            "scope": "Current"
+        }
+    ],
+    "function": "parsePkPass",
+    "mimeType": "application/vnd.apple.pkpass",
+    "script": "onepagebooking.js"
+}]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/simplebooking.js 
new/kitinerary-22.04.1/src/lib/scripts/simplebooking.js
--- old/kitinerary-22.04.0/src/lib/scripts/simplebooking.js     2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/simplebooking.js     2022-05-07 
12:07:42.000000000 +0200
@@ -18,12 +18,15 @@
     res.reservationFor.geo.latitude = text.match(/Latitude:\s(-?\d+.\d+)/)[1] 
* 1.0;
     res.reservationFor.geo.longitude = 
text.match(/Longitude:\s(-?\d+.\d+)/)[1] * 1.0;
 
-    var addr = text.match(/Lodging 
information[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+Telephone: 
(.*?)\n.*\n*\s+Email:\s+(.*?)\n\s+Internet:\s+(.*?)\n/);
+    var addr = text.match(/Lodging 
information[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(.*?)\n[\n\s]+(?:Telep|P)hone: 
(.*?)\n.*\n*\s+Email:\s+(.*?)\n\s+Internet:\s+(.*?)\n/);
     res.reservationFor.address.streetAddress = addr[2];
     res.reservationFor.address.addressLocality = addr[3];
     res.reservationFor.telephone = addr[4];
     res.reservationFor.email = addr[5];
     res.reservationFor.url = addr[6];
 
+    const guest = text.match(/Guest data[\n\s]+Name: (.*)/);
+    res.underName.name = guest[1];
+
     return res;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/sncf.js 
new/kitinerary-22.04.1/src/lib/scripts/sncf.js
--- old/kitinerary-22.04.0/src/lib/scripts/sncf.js      2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/sncf.js      2022-05-07 
12:07:42.000000000 +0200
@@ -1,9 +1,25 @@
 /*
-   SPDX-FileCopyrightText: 2017-2019 Volker Krause <[email protected]>
-
+   SPDX-FileCopyrightText: 2017-2022 Volker Krause <[email protected]>
    SPDX-License-Identifier: LGPL-2.0-or-later
 */
 
+// see https://community.kde.org/KDE_PIM/KItinerary/SNCF_Barcodes#Tariff_Codes
+const tariffs = {
+    'CF00': 'Ayant Droit Avec Fichet',
+    'CF90': 'Ayant Droit Sans Fichet',
+    'CJ11': 'Carte Jeune',
+    'CW00': 'Carte Advantage Adulte',
+    'CW11': 'Carte Advantage Adulte',
+    'CW12': 'Carte Advantage Adulte',
+    'CW25': 'Carte Advantage Adulte',
+    'EF11': 'Carte Enfant+',
+    'EF99': 'Carte Enfant+',
+    'IR00': 'Interrail',
+    'IR01': 'Interrail',
+    'SE11': 'Carte Advantage Senior',
+    'SR50': 'Carte Senior'
+};
+
 function parseSncfPdfText(text) {
     var reservations = new Array();
     var bookingRef = text.match(/(?:DOSSIER VOYAGE|BOOKING FILE 
REFERENCE|REFERENCE NUMBER) ?: +([A-Z0-9]{6})/);
@@ -115,6 +131,7 @@
     res1.reservationFor.trainNumber = barcode.substr(43, 5);
     res1.reservedTicket.ticketToken = "aztecCode:" + barcode;
     res1.reservedTicket.ticketedSeat.seatingType = barcode.substr(110, 1);
+    res1.programMembershipUsed.programName = tariffs[barcode.substr(111, 4)];
     reservations.push(res1);
 
     if (barcode.substr(115, 1) != '0') {
@@ -164,6 +181,8 @@
                     legs[j].reservationFor.departureStation.identifier = 
barcodeRes[j].reservationFor.departureStation.identifier;
                     legs[j].reservationFor.arrivalStation.identifier = 
barcodeRes[j].reservationFor.arrivalStation.identifier;
                     legs[j].reservedTicket.ticketedSeat.seatingType = 
barcodeRes[j].reservedTicket.ticketedSeat.seatingType;
+                    legs[j].reservationNumber = 
barcodeRes[j].reservationNumber;
+                    legs[j].programMembershipUsed = 
barcodeRes[j].programMembershipUsed;
                 }
                 reservations.push(legs[j]);
             }
@@ -198,6 +217,7 @@
         leg.underName = res.underName;
         leg.reservationNumber = res.reservationNumber;
         leg.reservedTicket = res.reservedTicket;
+        leg.programMembershipUsed = res.programMembershipUsed;
 
         reservations.push(leg);
     }
@@ -224,6 +244,7 @@
         leg.underName = res.underName;
         leg.reservationNumber = res.reservationNumber;
         leg.reservedTicket = res.reservedTicket;
+        leg.programMembershipUsed = res.programMembershipUsed;
 
         reservations.push(leg);
     }
@@ -246,6 +267,7 @@
     res.reservedTicket.ticketToken = "aztecbin:" + 
ByteArray.toBase64(triggerNode.content);
     res.underName.familyName = code.substr(116, 19);
     res.underName.givenName = code.substr(135, 19);
+    res.programMembershipUsed.programName = tariffs[code.substr(92, 4)];
 
     var text = pdf.pages[triggerNode.location].text;
     var pnr = text.match(res.reservationNumber + '[^\n]* ([A-Z0-9]{6})\n');
@@ -469,3 +491,22 @@
     }
     return reservations;
 }
+
+// see 
https://community.kde.org/KDE_PIM/KItinerary/SNCF_Barcodes#Carte_Advantage
+function parseSncfCarte(code) {
+    var carte = JsonLd.newObject("ProgramMembership");
+    carte.programName = tariffs[code.substr(111, 4)];
+    carte.membershipNumber = code.substr(53, 17);
+    carte.token = 'aztec:' + code;
+    return carte.programName != undefined ? carte : undefined;
+}
+
+function parseSncfCartePdf(pdf, node, barcode) {
+    const text = pdf.pages[barcode.location].text;
+    var carte = node.result[0];
+    carte.member = JsonLd.newObject("Person");
+    carte.member.familyName = text.match(/Nom\s*:\s*(.*)/)[1];
+    carte.member.givenName = text.match(/Pr??nom\s*:\s*(.*)/)[1];
+    // TODO validity period, once the data model supports that
+    return carte;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kitinerary-22.04.0/src/lib/scripts/sncf.json 
new/kitinerary-22.04.1/src/lib/scripts/sncf.json
--- old/kitinerary-22.04.0/src/lib/scripts/sncf.json    2022-04-13 
00:01:51.000000000 +0200
+++ new/kitinerary-22.04.1/src/lib/scripts/sncf.json    2022-05-07 
12:07:42.000000000 +0200
@@ -111,5 +111,29 @@
         "function": "parseOuigoConfirmation",
         "mimeType": "text/html",
         "script": "sncf.js"
+    },
+    {
+        "filter": [
+            {
+                "match": "^h0FV",
+                "mimeType": "text/plain",
+                "scope": "Current"
+            }
+        ],
+        "function": "parseSncfCarte",
+        "mimeType": "text/plain",
+        "script": "sncf.js"
+    },
+    {
+        "filter": [
+            {
+                "match": "^h0FV",
+                "mimeType": "text/plain",
+                "scope": "Descendants"
+            }
+        ],
+        "function": "parseSncfCartePdf",
+        "mimeType": "application/pdf",
+        "script": "sncf.js"
     }
 ]

Reply via email to