Skip to content

Commit 7286d85

Browse files
authored
Merge pull request #45 from orchetect/dev
Dev merge
2 parents 5650a9f + 7ce781a commit 7286d85

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ let package = Package(
2727

2828
dependencies: [
2929
// boilerplate:
30-
.package(url: "https://github.com/orchetect/OTCore", from: "1.1.21")
30+
.package(url: "https://github.com/orchetect/OTCore", from: "1.1.26")
3131

3232
// used only for Dev tests, not part of regular unit test
3333
//.package(url: "https://github.com/orchetect/SegmentedProgress", from: "1.0.1")

Sources/TimecodeKit/Data Interchange/Timecode String.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,20 +262,26 @@ extension Timecode {
262262
///
263263
/// Valid formats for 24-hour:
264264
///
265-
/// "00:00:00:00" "00:00:00;00"
265+
/// "00:00:00:00" "00:00:00;00"
266266
/// "00:00:00:00.00" "00:00:00;00.00"
267+
/// "00;00;00;00" "00;00;00;00"
268+
/// "00;00;00;00.00" "00;00;00;00.00"
267269
///
268270
/// Valid formats for 100-day: All of the above, as well as:
269271
///
270272
/// "0 00:00:00:00" "0 00:00:00;00"
271273
/// "0:00:00:00:00" "0:00:00:00;00"
272274
/// "0 00:00:00:00.00" "0 00:00:00;00.00"
273275
/// "0:00:00:00:00.00" "0:00:00:00;00.00"
276+
/// "0 00;00;00;00" "0 00;00;00;00"
277+
/// "0;00;00;00;00" "0;00;00;00;00"
278+
/// "0 00;00;00;00.00" "0 00;00;00;00.00"
279+
/// "0;00;00;00;00.00" "0;00;00;00;00.00"
274280
///
275281
/// - Throws: `Timecode.StringParseError`
276282
public static func decode(timecode string: String) throws -> Components {
277283

278-
let pattern = #"^(\d+)??[\:\s]??(\d+)[\:](\d+)[\:](\d+)[\:\;](\d+)[\.]??(\d+)??$"#
284+
let pattern = #"^(\d+)??[\:;\s]??(\d+)[\:;](\d+)[\:;](\d+)[\:\;](\d+)[\.]??(\d+)??$"#
279285

280286
let matches = string
281287
.regexMatches(captureGroupsFromPattern: pattern)

Tests/TimecodeKit-Unit-Tests/Unit Tests/Data Interchange/Timecode String Tests.swift

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,57 @@ class Timecode_UT_DI_String_Tests: XCTestCase {
285285
XCTAssertEqual(try Timecode.decode(timecode: "12:01:56:45;23"),
286286
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 0))
287287

288+
// all semicolons (such as from Adobe Premiere in its XMP format)
289+
290+
XCTAssertEqual(try Timecode.decode(timecode: "0;0;0;0"),
291+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
292+
293+
XCTAssertEqual(try Timecode.decode(timecode: "0;00;00;00"),
294+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
295+
296+
XCTAssertEqual(try Timecode.decode(timecode: "00;00;00;00"),
297+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
298+
299+
XCTAssertEqual(try Timecode.decode(timecode: "1;56;45;23"),
300+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 00))
301+
302+
XCTAssertEqual(try Timecode.decode(timecode: "01;56;45;23"),
303+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 00))
304+
305+
XCTAssertEqual(try Timecode.decode(timecode: "3 01;56;45;23"),
306+
TCC(d: 3, h: 01, m: 56, s: 45, f: 23, sf: 00))
307+
308+
XCTAssertEqual(try Timecode.decode(timecode: "12 01;56;45;23"),
309+
TCC(d: 12, h: 1, m: 56, s: 45, f: 23, sf: 00))
310+
311+
XCTAssertEqual(try Timecode.decode(timecode: "12;01;56;45;23"),
312+
TCC(d: 12, h: 1, m: 56, s: 45, f: 23, sf: 00))
313+
314+
// drop frame
315+
316+
XCTAssertEqual(try Timecode.decode(timecode: "0:0:0;0"),
317+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
318+
319+
XCTAssertEqual(try Timecode.decode(timecode: "0:00:00;00"),
320+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
321+
322+
XCTAssertEqual(try Timecode.decode(timecode: "00:00:00;00"),
323+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 00))
324+
325+
XCTAssertEqual(try Timecode.decode(timecode: "1:56:45;23"),
326+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 0))
327+
328+
XCTAssertEqual(try Timecode.decode(timecode: "01:56:45;23"),
329+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 0))
330+
331+
XCTAssertEqual(try Timecode.decode(timecode: "3 01:56:45;23"),
332+
TCC(d: 3, h: 01, m: 56, s: 45, f: 23, sf: 0))
333+
334+
XCTAssertEqual(try Timecode.decode(timecode: "12 01:56:45;23"),
335+
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 0))
336+
337+
XCTAssertEqual(try Timecode.decode(timecode: "12:01:56:45;23"),
338+
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 0))
288339

289340
// all periods - not supporting this.
290341

@@ -320,6 +371,30 @@ class Timecode_UT_DI_String_Tests: XCTestCase {
320371
XCTAssertEqual(try Timecode.decode(timecode: "12:01:56:45:23.05"),
321372
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 05))
322373

374+
// subframes
375+
// all semicolons (such as from Adobe Premiere in its XMP format)
376+
377+
XCTAssertEqual(try Timecode.decode(timecode: "0;00;00;00.05"),
378+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 05))
379+
380+
XCTAssertEqual(try Timecode.decode(timecode: "00;00;00;00.05"),
381+
TCC(d: 0, h: 00, m: 00, s: 00, f: 00, sf: 05))
382+
383+
XCTAssertEqual(try Timecode.decode(timecode: "1;56;45;23.05"),
384+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 05))
385+
386+
XCTAssertEqual(try Timecode.decode(timecode: "01;56;45;23.05"),
387+
TCC(d: 0, h: 01, m: 56, s: 45, f: 23, sf: 05))
388+
389+
XCTAssertEqual(try Timecode.decode(timecode: "3 01;56;45;23.05"),
390+
TCC(d: 3, h: 01, m: 56, s: 45, f: 23, sf: 05))
391+
392+
XCTAssertEqual(try Timecode.decode(timecode: "12 01;56;45;23.05"),
393+
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 05))
394+
395+
XCTAssertEqual(try Timecode.decode(timecode: "12;01;56;45;23.05"),
396+
TCC(d: 12, h: 01, m: 56, s: 45, f: 23, sf: 05))
397+
323398
}
324399

325400
// MARK: - .toTimecode()

0 commit comments

Comments
 (0)