@@ -360,6 +360,10 @@ def parse_edl(self, edl_string, rate=24):
360
360
361
361
362
362
class ClipHandler (object ):
363
+ # /path/filename.[1001-1020].ext
364
+ image_sequence_pattern = re .compile (
365
+ r'.*\.(?P<range>\[(?P<start>[0-9]+)-(?P<end>[0-9]+)\])\.\w+$'
366
+ )
363
367
364
368
def __init__ (self , line , comment_data , rate = 24 ):
365
369
self .clip_num = None
@@ -376,6 +380,33 @@ def __init__(self, line, comment_data, rate=24):
376
380
self .parse (line )
377
381
self .clip = self .make_clip (comment_data )
378
382
383
+ def is_image_sequence (self , comment_data ):
384
+ return self .image_sequence_pattern .search (
385
+ comment_data ['media_reference' ]
386
+ ) is not None
387
+
388
+ def create_imagesequence_reference (self , comment_data ):
389
+ regex_obj = self .image_sequence_pattern .search (
390
+ comment_data ['media_reference' ]
391
+ )
392
+
393
+ path , basename = os .path .split (comment_data ['media_reference' ])
394
+ prefix , suffix = basename .split (regex_obj .group ('range' ))
395
+ ref = schema .ImageSequenceReference (
396
+ target_url_base = path ,
397
+ name_prefix = prefix ,
398
+ name_suffix = suffix ,
399
+ rate = self .edl_rate ,
400
+ start_frame = int (regex_obj .group ('start' )),
401
+ frame_zero_padding = len (regex_obj .group ('start' )),
402
+ available_range = opentime .range_from_start_end_time (
403
+ opentime .from_timecode (self .source_tc_in , self .edl_rate ),
404
+ opentime .from_timecode (self .source_tc_out , self .edl_rate )
405
+ )
406
+ )
407
+
408
+ return ref
409
+
379
410
def make_clip (self , comment_data ):
380
411
clip = schema .Clip ()
381
412
clip .name = str (self .clip_num )
@@ -392,10 +423,15 @@ def make_clip(self, comment_data):
392
423
# TODO: Replace with enum, once one exists
393
424
clip .media_reference .generator_kind = 'SMPTEBars'
394
425
elif 'media_reference' in comment_data :
395
- clip .media_reference = schema .ExternalReference ()
396
- clip .media_reference .target_url = comment_data [
397
- 'media_reference'
398
- ]
426
+ if self .is_image_sequence (comment_data ):
427
+ clip .media_reference = self .create_imagesequence_reference (
428
+ comment_data
429
+ )
430
+ else :
431
+ clip .media_reference = schema .ExternalReference ()
432
+ clip .media_reference .target_url = comment_data [
433
+ 'media_reference'
434
+ ]
399
435
else :
400
436
clip .media_reference = schema .MissingReference ()
401
437
@@ -413,6 +449,15 @@ def make_clip(self, comment_data):
413
449
os .path .basename (clip .media_reference .target_url )
414
450
)[0 ]
415
451
452
+ elif (
453
+ clip .media_reference and
454
+ hasattr (clip .media_reference , 'target_url_base' ) and
455
+ clip .media_reference .target_url_base is not None
456
+ ):
457
+ clip .name = os .path .splitext (
458
+ os .path .basename (_get_image_sequence_url (clip ))
459
+ )[0 ]
460
+
416
461
asc_sop = comment_data .get ('asc_sop' , None )
417
462
asc_sat = comment_data .get ('asc_sat' , None )
418
463
if asc_sop or asc_sat :
@@ -1295,6 +1340,9 @@ def _generate_comment_lines(
1295
1340
if hasattr (clip .media_reference , 'target_url' ):
1296
1341
url = clip .media_reference .target_url
1297
1342
1343
+ elif hasattr (clip .media_reference , 'abstract_target_url' ):
1344
+ url = _get_image_sequence_url (clip )
1345
+
1298
1346
else :
1299
1347
url = clip .name
1300
1348
@@ -1390,6 +1438,22 @@ def _generate_comment_lines(
1390
1438
return lines
1391
1439
1392
1440
1441
+ def _get_image_sequence_url (clip ):
1442
+ ref = clip .media_reference
1443
+ start_frame , end_frame = ref .frame_range_for_time_range (
1444
+ clip .trimmed_range ()
1445
+ )
1446
+
1447
+ frame_range_str = '[{start}-{end}]' .format (
1448
+ start = start_frame ,
1449
+ end = end_frame
1450
+ )
1451
+
1452
+ url = clip .media_reference .abstract_target_url (frame_range_str )
1453
+
1454
+ return url
1455
+
1456
+
1393
1457
def _flip_windows_slashes (path ):
1394
1458
return re .sub (r'\\' , '/' , path )
1395
1459
@@ -1403,10 +1467,18 @@ def _reel_from_clip(clip, reelname_len):
1403
1467
1404
1468
_reel = clip .name or 'AX'
1405
1469
1406
- if isinstance (clip .media_reference , schema .ExternalReference ):
1407
- _reel = clip .media_reference .name or os .path .basename (
1408
- clip .media_reference .target_url
1409
- )
1470
+ valid_refs = (schema .ExternalReference , schema .ImageSequenceReference )
1471
+ if isinstance (clip .media_reference , valid_refs ):
1472
+ if clip .media_reference .name :
1473
+ _reel = clip .media_reference .name
1474
+
1475
+ elif hasattr (clip .media_reference , 'target_url' ):
1476
+ _reel = os .path .basename (
1477
+ clip .media_reference .target_url
1478
+ )
1479
+
1480
+ else :
1481
+ _reel = _get_image_sequence_url (clip )
1410
1482
1411
1483
# Flip Windows slashes
1412
1484
_reel = os .path .basename (_flip_windows_slashes (_reel ))
0 commit comments