Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kitinerary for openSUSE:Factory checked in at 2023-09-15 22:02:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kitinerary (Old) and /work/SRC/openSUSE:Factory/.kitinerary.new.1766 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kitinerary" Fri Sep 15 22:02:05 2023 rev:65 rq:1111189 version:23.08.1 Changes: -------- --- /work/SRC/openSUSE:Factory/kitinerary/kitinerary.changes 2023-08-31 13:44:49.758317461 +0200 +++ /work/SRC/openSUSE:Factory/.kitinerary.new.1766/kitinerary.changes 2023-09-15 22:03:00.823854852 +0200 @@ -1,0 +2,21 @@ +Tue Sep 12 11:56:02 UTC 2023 - Christophe Marin <[email protected]> + +- Update to 23.08.1 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/gear/23.08.1/ +- Changes since 23.08.0: + * Also allow direct extraction from SNCF Secutix barcodes + * Correctly update the search offset in the MAV extractor + * Handle more cases of ZSSK network tickets + * Correctly import buses from DB online tickets + * Add Slovak Lines PDF ticket extractor script + * Add premiumkino Apple Wallet pass extractor script + * Handle more end of validtity variants in RCT2 tickets + * Fall back to the second RCT2 title line if the first one is empty (kde#472916) + * Handle Amtrak tickets with unreserved seats + * Add British Airways boarding pass extractor script + * Add extractor script for Aer Lingus PDF boarding passes + * Increase upper aspect ratio limit for PDF417 barcodes + +------------------------------------------------------------------- Old: ---- kitinerary-23.08.0.tar.xz kitinerary-23.08.0.tar.xz.sig New: ---- kitinerary-23.08.1.tar.xz kitinerary-23.08.1.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kitinerary.spec ++++++ --- /var/tmp/diff_new_pack.sAj0zF/_old 2023-09-15 22:03:02.343909201 +0200 +++ /var/tmp/diff_new_pack.sAj0zF/_new 2023-09-15 22:03:02.343909201 +0200 @@ -19,7 +19,7 @@ %define libname libKPimItinerary5 %bcond_without released Name: kitinerary -Version: 23.08.0 +Version: 23.08.1 Release: 0 Summary: Data model and extraction system for travel reservations License: LGPL-2.1-or-later ++++++ kitinerary-23.08.0.tar.xz -> kitinerary-23.08.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/CMakeLists.txt new/kitinerary-23.08.1/CMakeLists.txt --- old/kitinerary-23.08.0/CMakeLists.txt 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/CMakeLists.txt 2023-09-11 17:49:23.000000000 +0200 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16 FATAL_ERROR) -set(PIM_VERSION "5.24.0") +set(PIM_VERSION "5.24.1") project(KItinerary VERSION ${PIM_VERSION}) set(KF_MIN_VERSION "5.91.0") @@ -48,8 +48,8 @@ find_package(SharedMimeInfo 1.3 REQUIRED) endif() -set(KMIME_VERSION "5.24.0") -set(PIM_PKPASS "5.24.0") +set(KMIME_VERSION "5.24.1") +set(PIM_PKPASS "5.24.1") find_package(KPim${KF_MAJOR_VERSION}Mime ${KMIME_VERSION} CONFIG REQUIRED) find_package(KPimPkPass ${PIM_PKPASS} CONFIG REQUIRED) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/po/zh_CN/kitinerary.po new/kitinerary-23.08.1/po/zh_CN/kitinerary.po --- old/kitinerary-23.08.0/po/zh_CN/kitinerary.po 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/po/zh_CN/kitinerary.po 2023-09-11 17:49:23.000000000 +0200 @@ -3,7 +3,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2022-07-20 00:46+0000\n" -"PO-Revision-Date: 2023-08-02 12:43\n" +"PO-Revision-Date: 2023-09-02 02:59\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-23.08.0/src/cli/org.kde.kitinerary-extractor.appdata.xml new/kitinerary-23.08.1/src/cli/org.kde.kitinerary-extractor.appdata.xml --- old/kitinerary-23.08.0/src/cli/org.kde.kitinerary-extractor.appdata.xml 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/cli/org.kde.kitinerary-extractor.appdata.xml 2023-09-11 17:49:23.000000000 +0200 @@ -119,9 +119,9 @@ <binary>kitinerary-extractor</binary> </provides> <releases> + <release version="5.24.1" date="2023-09-14"/> <release version="5.24.0" date="2023-08-24"/> <release version="5.23.3" date="2023-07-06"/> <release version="5.23.2" date="2023-06-08"/> - <release version="5.23.1" date="2023-05-11"/> </releases> </component> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/cli/org.kde.kitinerary-extractor.desktop new/kitinerary-23.08.1/src/cli/org.kde.kitinerary-extractor.desktop --- old/kitinerary-23.08.0/src/cli/org.kde.kitinerary-extractor.desktop 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/cli/org.kde.kitinerary-extractor.desktop 2023-09-11 17:49:23.000000000 +0200 @@ -61,7 +61,7 @@ GenericName[sk]=Extraktor cez prÃkazový riadok pre KItinerary GenericName[sl]=KItinerary ekstraktor ukazne vrstice GenericName[sv]=Kitinerary extrahering pÃ¥ kommandoraden -GenericName[tr]=K Yol Kılavuzu Komut Satırı Ãıkarıcı +GenericName[tr]=K Yol Kılavuzu Komut Satırı Ãıkarıcısı GenericName[uk]=ÐаÑÑб видобÑÐ²Ð°Ð½Ð½Ñ KItinerary Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ ÑÑдка GenericName[x-test]=xxKItinerary command line extractorxx GenericName[zh_CN]=KItinerary å½ä»¤è¡å¯¼åºå·¥å · diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/barcodedecoder.cpp new/kitinerary-23.08.1/src/lib/barcodedecoder.cpp --- old/kitinerary-23.08.0/src/lib/barcodedecoder.cpp 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/barcodedecoder.cpp 2023-09-11 17:49:23.000000000 +0200 @@ -37,7 +37,7 @@ static constexpr const auto SQUARE_MAX_ASPECT = 1.25f; static constexpr const auto PDF417_MIN_ASPECT = 1.5f; -static constexpr const auto PDF417_MAX_ASPECT = 6.0f; +static constexpr const auto PDF417_MAX_ASPECT = 6.5f; static constexpr const auto ANY1D_MIN_ASPECT = 1.95f; static constexpr const auto ANY1D_MAX_ASPECT = 8.0f; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/aerlingus.js new/kitinerary-23.08.1/src/lib/scripts/aerlingus.js --- old/kitinerary-23.08.0/src/lib/scripts/aerlingus.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/aerlingus.js 2023-09-11 17:49:23.000000000 +0200 @@ -52,3 +52,12 @@ return reservations; } +function extractPdfBoardingPass(pdf, node, barcode) { + let res = barcode.result[0]; + const text = pdf.pages[barcode.location].text; + const times = text.match(/(\d\d:\d\d) +\d+[A-Z] +(\d\d:\d\d)/); + res.reservationFor.departureTime = JsonLd.toDateTime(times[1], 'hh:mm', 'en'); + res.reservationFor.boardingTime = JsonLd.toDateTime(times[2], 'hh:mm', 'en'); + return res; + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/aerlingus.json new/kitinerary-23.08.1/src/lib/scripts/aerlingus.json --- old/kitinerary-23.08.0/src/lib/scripts/aerlingus.json 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/aerlingus.json 2023-09-11 17:49:23.000000000 +0200 @@ -4,4 +4,10 @@ { "field": "From", "match": "aerlingus.com", "mimeType": "message/rfc822", "scope": "Ancestors" } ], "script": "aerlingus.js" +}, +{ + "mimeType": "application/pdf", + "filter": [ { "field": "operatingCarrierDesignator", "match": "EI", "mimeType": "internal/iata-bcbp", "scope": "Descendants" } ], + "script": "aerlingus.js", + "function": "extractPdfBoardingPass" }] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/amtrack.js new/kitinerary-23.08.1/src/lib/scripts/amtrack.js --- old/kitinerary-23.08.0/src/lib/scripts/amtrack.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/amtrack.js 2023-09-11 17:49:23.000000000 +0200 @@ -15,7 +15,7 @@ leg.reservedTicket.ticketToken = 'qrcode:' + triggerNode.content; // format variant 1 - let train = text.substr(idx).match(/TRAIN +\w.*? +(.*?) +DEPARTS\s+ARRIVES \(\w{3} (.*)\)\n\s*(\d+)\s+(\w{3} \d{1,2}), (\d{4})\n\s*(.*)?\n?\s*\d+ (.*) Seats?\n? +(\d{1,2}:\d{2} [AP]M) +(\d{1,2}:\d{2} [AP]M)/); + let train = text.substr(idx).match(/TRAIN +\w.*? +(.*?) +DEPARTS\s+ARRIVES \(\w{3} (.*)\)\n\s*(\d+)\s+(\w{3} \d{1,2}), (\d{4})\n?\s*(.*)?\n?\s*\d+ (?:Unreserved )?(.*) Seats?\n? +(\d{1,2}:\d{2} [AP]M) +(\d{1,2}:\d{2} [AP]M)/); if (train) { leg.reservationFor.trainNumber = train[3]; leg.reservationFor.departureTime = JsonLd.toDateTime(train[4] + ' ' + train[5] + ' ' + train[8], 'MMM d yyyy h:mm AP', 'en'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/british-airways.js new/kitinerary-23.08.1/src/lib/scripts/british-airways.js --- old/kitinerary-23.08.0/src/lib/scripts/british-airways.js 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-23.08.1/src/lib/scripts/british-airways.js 2023-09-11 17:49:23.000000000 +0200 @@ -0,0 +1,13 @@ +/* + SPDX-FileCopyrightText: 2023 Volker Krause <[email protected]> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +function extractBoardingPass(pdf, node, barcode) { + const text = pdf.pages[barcode.location].text; + let res = barcode.result[0]; + const times = text.match(/(\d\d:\d\d) +(\d\d:\d\d)\n/); + res.reservationFor.boardingTime = JsonLd.toDateTime(times[1], "hh:mm", "en"); + res.reservationFor.departureTime = JsonLd.toDateTime(times[2], "hh:mm", "en"); + return res; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/british-airways.json new/kitinerary-23.08.1/src/lib/scripts/british-airways.json --- old/kitinerary-23.08.0/src/lib/scripts/british-airways.json 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-23.08.1/src/lib/scripts/british-airways.json 2023-09-11 17:49:23.000000000 +0200 @@ -0,0 +1,13 @@ +{ + "filter": [ + { + "field": "airlineDesignatorOfBoardingPassIssuer", + "match": "BA", + "mimeType": "internal/iata-bcbp", + "scope": "Descendants" + } + ], + "function": "extractBoardingPass", + "mimeType": "application/pdf", + "script": "british-airways.js" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/deutschebahn-online-ticket.js new/kitinerary-23.08.1/src/lib/scripts/deutschebahn-online-ticket.js --- old/kitinerary-23.08.0/src/lib/scripts/deutschebahn-online-ticket.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/deutschebahn-online-ticket.js 2023-09-11 17:49:23.000000000 +0200 @@ -6,7 +6,6 @@ function parseOnlineTicket(xml) { // TODO handle multi-ticket - // TODO how do buses look in here? const trains = xml.root.eval('//trainlist/train'); let result = []; @@ -75,7 +74,11 @@ ticket.reservedTicket.ticketNumber = tickets[0].eval('mtk/ot_nr_hin')[0].content; let mergedResult = []; for (let train of result) { - mergedResult.push(JsonLd.apply(ticket, train)); + if (train['@type'] == 'BusReservation') { + mergedResult.push(JsonLd.apply(JsonLd.trainToBusReservation(ticket), train)); + } else { + mergedResult.push(JsonLd.apply(ticket, train)); + } } return mergedResult; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/extractors.qrc new/kitinerary-23.08.1/src/lib/scripts/extractors.qrc --- old/kitinerary-23.08.0/src/lib/scripts/extractors.qrc 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/extractors.qrc 2023-09-11 17:49:23.000000000 +0200 @@ -50,6 +50,8 @@ <file>bookingkit.js</file> <file>bremer-baeder.json</file> <file>bremer-baeder.js</file> + <file>british-airways.json</file> + <file>british-airways.js</file> <file>brusselsairlines.json</file> <file>brusselsairlines.js</file> <file>brusselsairlines-receipt.js</file> @@ -185,6 +187,8 @@ <file>pkp.js</file> <file>premier-inn.json</file> <file>premier-inn.js</file> + <file>premiumkino.json</file> + <file>premiumkino.js</file> <file>pretix.json</file> <file>pretix.js</file> <file>qatar-airways.json</file> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/mav.js new/kitinerary-23.08.1/src/lib/scripts/mav.js --- old/kitinerary-23.08.0/src/lib/scripts/mav.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/mav.js 2023-09-11 17:49:23.000000000 +0200 @@ -109,7 +109,7 @@ let leg = text.substr(idx).match(/(\d\d\.\d\d\.) (\d\d:\d\d) (.*) â (\d\d:\d\d) (.*?) (.*)/); if (!leg) break; - idx = leg.index + leg[0].length; + idx += leg.index + leg[0].length; let res = JsonLd.newTrainReservation(); res.reservationFor.departureTime = JsonLd.toDateTime(leg[1] + leg[2], 'dd.MM.hh:mm', 'hu'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/premiumkino.js new/kitinerary-23.08.1/src/lib/scripts/premiumkino.js --- old/kitinerary-23.08.0/src/lib/scripts/premiumkino.js 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-23.08.1/src/lib/scripts/premiumkino.js 2023-09-11 17:49:23.000000000 +0200 @@ -0,0 +1,20 @@ +/* + SPDX-FileCopyrightText: 2023 Volker Krause <[email protected]> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +function extractPass(pass) { + let res = JsonLd.newEventReservation(); + res.reservationFor.startDate = pass.relevantDate; + res.reservationFor.name = pass.field['TicketTitle'].value; + res.reservationFor.location.name = pass.organizationName; + const addr = pass.field['Back8'].value.split('\n'); + res.reservationFor.location.address.streetAddress = addr[1]; + res.reservationFor.location.address.addressLocality = addr[2]; + res.reservationFor.location.geo.latitude = pass.locations[0].latitude; + res.reservationFor.location.geo.longitude = pass.locations[0].longitude; + res.reservedTicket.ticketToken = 'qrCode:' + pass.barcodes[0].message; + res.reservedTicket.ticketedSeat.seatSection = pass.field['Theatre'].value; + res.reservedTicket.ticketedSeat.seatNumber = pass.field['Seats'].value; + return res; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/premiumkino.json new/kitinerary-23.08.1/src/lib/scripts/premiumkino.json --- old/kitinerary-23.08.0/src/lib/scripts/premiumkino.json 1970-01-01 01:00:00.000000000 +0100 +++ new/kitinerary-23.08.1/src/lib/scripts/premiumkino.json 2023-09-11 17:49:23.000000000 +0200 @@ -0,0 +1,13 @@ +{ + "filter": [ + { + "field": "passTypeIdentifier", + "match": "pass.de.premiumkino.ticket", + "mimeType": "application/vnd.apple.pkpass", + "scope": "Current" + } + ], + "function": "extractPass", + "mimeType": "application/vnd.apple.pkpass", + "script": "premiumkino.js" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/slovak-lines.js new/kitinerary-23.08.1/src/lib/scripts/slovak-lines.js --- old/kitinerary-23.08.0/src/lib/scripts/slovak-lines.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/slovak-lines.js 2023-09-11 17:49:23.000000000 +0200 @@ -36,3 +36,21 @@ }; return res; } + +function extractTicket(pdf, node, barcode) { + const text = pdf.pages[barcode.location].text; + let res = JsonLd.newBusReservation(); + res.underName.name = text.match(/^.*?: +(.*?) /)[1]; + res.reservationNumber = barcode.content; + const dep = text.match(/Departure: +(.*) \S+, (\d\d\.\d\d\.\d{4} \d\d:\d\d)/); + res.reservationFor.departureBusStop.name = dep[1]; + res.reservationFor.departureTime = JsonLd.toDateTime(dep[2], 'dd.MM.yyyy hh:mm', 'en'); + const arr = text.match(/Arrival: +(.*) \S+, (\d\d\.\d\d\.\d{4} \d\d:\d\d)/); + res.reservationFor.arrivalBusStop.name = arr[1]; + res.reservationFor.arrivalTime = JsonLd.toDateTime(arr[2], 'dd.MM.yyyy hh:mm', 'en'); + res.reservationFor.departurePlatform = text.match(/Platform: +(\S.*)/)[1]; + res.reservedTicket.ticketedSeat.seatNumber = text.match(/Seat: +(\S.*)/)[1]; + res.reservationFor.busNumber = text.match(/Bus line no: +(.*) /)[1]; + res.reservedTicket.ticketToken = 'qrCode:' + barcode.content; + return res; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/slovak-lines.json new/kitinerary-23.08.1/src/lib/scripts/slovak-lines.json --- old/kitinerary-23.08.0/src/lib/scripts/slovak-lines.json 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/slovak-lines.json 2023-09-11 17:49:23.000000000 +0200 @@ -1,13 +1,27 @@ -{ - "filter": [ - { - "field": "passTypeIdentifier", - "match": "pass.sk.slovaklines", - "mimeType": "application/vnd.apple.pkpass", - "scope": "Current" - } - ], - "function": "extractPass", - "mimeType": "application/vnd.apple.pkpass", - "script": "slovak-lines.js" -} +[ + { + "filter": [ + { + "field": "passTypeIdentifier", + "match": "pass.sk.slovaklines", + "mimeType": "application/vnd.apple.pkpass", + "scope": "Current" + } + ], + "function": "extractPass", + "mimeType": "application/vnd.apple.pkpass", + "script": "slovak-lines.js" + }, + { + "filter": [ + { + "match": "^\\d{12}$", + "mimeType": "text/plain", + "scope": "Descendants" + } + ], + "function": "extractTicket", + "mimeType": "application/pdf", + "script": "slovak-lines.js" + } +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/sncf.js new/kitinerary-23.08.1/src/lib/scripts/sncf.js --- old/kitinerary-23.08.0/src/lib/scripts/sncf.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/sncf.js 2023-09-11 17:49:23.000000000 +0200 @@ -249,11 +249,11 @@ return reservations; } -function parseSecutixPdf(pdf, node, triggerNode) +function parseSecutix(barcode) { // see https://community.kde.org/KDE_PIM/KItinerary/SNCF_Barcodes#SNCF_Secutix_Tickets - var res = JsonLd.newTrainReservation(); - var code = ByteArray.decodeLatin1(triggerNode.content.slice(260)); + let res = JsonLd.newTrainReservation(); + const code = ByteArray.decodeLatin1(barcode.slice(260)); res.reservationFor.provider.identifier = 'uic:' + code.substr(4, 4); res.reservationNumber = code.substr(8, 9); res.reservationFor.departureStation.name = code.substr(17, 5); @@ -263,14 +263,19 @@ res.reservationFor.departureDay = JsonLd.toDateTime(code.substr(83, 8), "ddMMyyyy", "fr"); res.reservedTicket.ticketedSeat.seatingType = code.substr(91, 1); res.reservedTicket.ticketNumber = code.substr(8, 9); - res.reservedTicket.ticketToken = "aztecbin:" + ByteArray.toBase64(triggerNode.content); + res.reservedTicket.ticketToken = "aztecbin:" + ByteArray.toBase64(barcode); res.underName.familyName = code.substr(116, 19); res.underName.givenName = code.substr(135, 19); res.programMembershipUsed.programName = tariffs[code.substr(92, 4)]; + return res; +} - var text = pdf.pages[triggerNode.location].text; - var pnr = text.match(res.reservationNumber + '[^\n]* ([A-Z0-9]{6})\n'); - var layoutVersion = 1; +function parseSecutixPdf(pdf, node, triggerNode) +{ + let res = triggerNode.result[0]; + const text = pdf.pages[triggerNode.location].text; + let pnr = text.match(res.reservationNumber + '[^\n]* ([A-Z0-9]{6})\n'); + let layoutVersion = 1; if (!pnr) { pnr = text.match(/(?:PAO|REF)\s*:\s*([A-Z0-9]{6,8})\n/); layoutVersion = 2; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/sncf.json new/kitinerary-23.08.1/src/lib/scripts/sncf.json --- old/kitinerary-23.08.0/src/lib/scripts/sncf.json 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/sncf.json 2023-09-11 17:49:23.000000000 +0200 @@ -47,6 +47,18 @@ { "match": "^2200", "mimeType": "application/octet-stream", + "scope": "Current" + } + ], + "function": "parseSecutix", + "mimeType": "application/octet-stream", + "script": "sncf.js" + }, + { + "filter": [ + { + "match": "^2200", + "mimeType": "application/octet-stream", "scope": "Descendants" } ], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/zssk.js new/kitinerary-23.08.1/src/lib/scripts/zssk.js --- old/kitinerary-23.08.0/src/lib/scripts/zssk.js 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/zssk.js 2023-09-11 17:49:23.000000000 +0200 @@ -26,8 +26,10 @@ res.reservationFor.departureStation.name = payload[6]; res.reservationFor.arrivalStation.name = payload[7]; const trainNum = payload[8].match(/(\d+)\[(?:(\d)\.tr\.|\*)]/); - res.reservationFor.trainNumber = trainNum[1]; - res.reservedTicket.ticketedSeat.seatingType = trainNum[2]; + if (trainNum) { + res.reservationFor.trainNumber = trainNum[1]; + res.reservedTicket.ticketedSeat.seatingType = trainNum[2]; + } res.reservationFor.departureTime = parseDateTime(payload[9]); res.underName.name = payload[11]; res.programMembershipUsed.membershipNumber = payload[20]; @@ -59,6 +61,10 @@ } function parseDomesticPdf(pdf, node, triggerNode) { + if (triggerNode.result[0]['@type'] == 'Ticket') { + return triggerNode.result; + } + const text = pdf.pages[triggerNode.location].text; // TODO multi-leg support? const leg = text.match(/\d{2}\.\d{2}.\d{2} +\d{2}:\d{2} +.* -> .* +(\d{2}\.\d{2}\.\d{2} +\d{2}:\d{2})/); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/scripts/zssk.json new/kitinerary-23.08.1/src/lib/scripts/zssk.json --- old/kitinerary-23.08.0/src/lib/scripts/zssk.json 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/scripts/zssk.json 2023-09-11 17:49:23.000000000 +0200 @@ -14,7 +14,7 @@ { "filter": [ { - "match": "^\\x04\\x01", + "match": "^\\x04..\\x78\\x9c", "mimeType": "application/octet-stream", "scope": "Descendants" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/uic9183/rct2ticket.cpp new/kitinerary-23.08.1/src/lib/uic9183/rct2ticket.cpp --- old/kitinerary-23.08.0/src/lib/uic9183/rct2ticket.cpp 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/uic9183/rct2ticket.cpp 2023-09-11 17:49:23.000000000 +0200 @@ -193,7 +193,8 @@ // somewhat standard compliant layout if (d->layout.text(0, 15, 3, 1).trimmed().isEmpty()) { - return d->layout.text(0, 18, 33, 1).trimmed(); + const auto s = d->layout.text(0, 18, 33, 1).trimmed(); + return s.isEmpty() ? d->layout.text(1, 18, 33, 1).trimmed() : s; } // "creative" layout diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kitinerary-23.08.0/src/lib/uic9183/uic9183parser.cpp new/kitinerary-23.08.1/src/lib/uic9183/uic9183parser.cpp --- old/kitinerary-23.08.0/src/lib/uic9183/uic9183parser.cpp 2023-08-17 17:51:21.000000000 +0200 +++ new/kitinerary-23.08.1/src/lib/uic9183/uic9183parser.cpp 2023-09-11 17:49:23.000000000 +0200 @@ -354,7 +354,6 @@ // CD vender block if (const auto b = findBlock<Vendor1154UTBlock>(); b.isValid()) { const auto subBlock = b.findSubBlock("DO"); - qDebug() << subBlock.toString(); if (!subBlock.isNull()) { return QDateTime::fromString(subBlock.toString(), QStringLiteral("dd.MM.yyyy hh:mm")); } @@ -362,12 +361,13 @@ // RCT2 RPT according to ERA TAP TSI Annex B.6 - if (const auto rct2 = rct2Ticket(); rct2.isValid() && (rct2.type() == Rct2Ticket::RailPass || rct2.type() == Rct2Ticket::Unknown)) { + if (const auto rct2 = rct2Ticket(); rct2.isValid()) { const auto validityRange = ticketLayout().text(3, 1, 36, 1).trimmed(); const auto idx = std::max(validityRange.lastIndexOf(QLatin1Char(' ')), validityRange.lastIndexOf(QLatin1Char('-'))); if (idx > 0) { return QDateTime(QDate::fromString(validityRange.mid(idx + 1), QStringLiteral("dd.MM.yyyy")), {23, 59, 59}); } + return rct2.outboundArrivalTime(); } return {};
