gremlin/gremlin.in: Add function to iterate over a bin's children.
[autoys] / gremlin / gremlin.in
index af4da27..4992599 100644 (file)
@@ -41,7 +41,7 @@ import shutil as SH
 import optparse as OP
 import threading as TH
 import shlex as L
-from math import sqrt
+from math import sqrt, ceil
 from contextlib import contextmanager
 
 ## eyeD3 tag fettling.
@@ -247,7 +247,7 @@ class ProgressEyecandy (object):
     ## Work out -- well, guess -- the time remaining.
     if cur:
       t = T.time()
-      eta = me._fmt_time((t - me._start)*(max - cur)/cur)
+      eta = me._fmt_time(ceil((t - me._start)*(max - cur)/cur))
     else:
       eta = '???'
 
@@ -411,6 +411,8 @@ class FormatParser (P.ParserElement):
   named format and its superclasses.
   """
 
+  name = 'format-spec'
+
   ## We cache the parser elements we generate to avoid enormous consing.
   CACHE = {}
 
@@ -712,6 +714,14 @@ def make_element(factory, name = None, **props):
   elt.set_properties(**props)
   return elt
 
+def link_elements(elts):
+  "Link the elements ELTS together, in order."
+  GS.element_link_many(*elts)
+
+def bin_children(bin):
+  "Iterate over the (direct) children of a BIN."
+  for elt in bin.elements(): yield elt
+
 class GStreamerProgressEyecandy (ProgressEyecandy):
   """
   Provide amusement while GStreamer is busy doing something.
@@ -825,7 +835,7 @@ class AudioIdentifier (object):
         elt.link_pads(pad.get_name(), sink, 'sink')
     dpaid = decoder.connect('pad-added', decoder_pad_arrived)
     me._pipe.add(source, decoder, sink)
-    GS.element_link_many(source, decoder)
+    link_elements([source, decoder])
 
     ## Arrange to collect tags from the pipeline's bus as they're reported.
     ## If we reuse the pipeline later, we'll want different bus-message
@@ -853,7 +863,7 @@ class AudioIdentifier (object):
     ## things from being too awful.)
     me.cap = None
     me.dcap = None
-    for e in decoder.elements():
+    for e in bin_children(decoder):
       if e.get_factory().get_name() == 'typefind':
         tfelt = e
         break
@@ -989,7 +999,7 @@ class AudioFormat (BaseFormat):
     elts = me.encoder_chain()
     bin = GS.Bin()
     bin.add(*elts)
-    GS.element_link_many(*elts)
+    link_elements(elts)
     bin.add_pad(GS.GhostPad('sink', elts[0].get_pad('sink')))
     bin.add_pad(GS.GhostPad('src', elts[-1].get_pad('src')))
     return bin
@@ -1026,8 +1036,8 @@ class AudioFormat (BaseFormat):
     encoder = me.encoder()
     sink = make_element('filesink', 'sink', location = new)
     pipe.add(source, decoder, convert, encoder, sink)
-    GS.element_link_many(source, decoder)
-    GS.element_link_many(convert, encoder, sink)
+    link_elements([source, decoder])
+    link_elements([convert, encoder, sink])
 
     ## Some decoders (e.g., the AC3 decoder) include channel-position
     ## indicators in their output caps.  The Vorbis encoder interferes with