Advertisement
NoxDeleo

Audio tags import

Dec 19th, 2012
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.15 KB | None | 0 0
  1. import gi
  2. gi.require_version('GObject', '2.0')
  3. gi.require_version('Gst', '1.0')
  4. gi.require_version('GstApp', '1.0')
  5. gi.require_version('GstPbutils', '1.0')
  6. from gi.repository import GObject, Gst, GstApp, GstPbutils
  7. from os import walk
  8. from os.path import abspath
  9. from datetime import timedelta
  10.  
  11. from os import putenv
  12. putenv('GST_DEBUG', '2')
  13.  
  14. GObject.threads_init()
  15. Gst.init(None)
  16.  
  17.  
  18. class Importer:
  19.     def __init__(self, tracks, album_covers, path_list):
  20.         self.tracks = tracks
  21.         self.album_covers = album_covers
  22.         self.path_list = path_list
  23.         self.file_list = []
  24.        
  25.         self.mainloop = GObject.MainLoop()
  26.        
  27.         self.discoverer = GstPbutils.Discoverer()
  28.         self.discoverer.set_property('timeout', 5 * Gst.SECOND)
  29.         self.discoverer.connect('discovered', self.parse_results)
  30.         self.discoverer.connect('finished', self.on_finished)
  31.        
  32.         self.image_pipeline = Gst.Pipeline()
  33.         self.appsrc = Gst.ElementFactory.make('appsrc', None)
  34.         encoder = Gst.ElementFactory.make('pngenc', None)
  35.         filesink = Gst.ElementFactory.make('filesink', None)
  36.         self.image_pipeline.add(self.appsrc)
  37.         self.image_pipeline.add(encoder)
  38.         self.image_pipeline.add(filesink)
  39.         self.appsrc.set_property('stream-type', GstApp.AppStreamType.RANDOM_ACCESS)
  40.         self.appsrc.connect('seek-data', self.image_pipeline_seek)
  41.         filesink.set_property('location', '/tmp/test.png')
  42.         self.appsrc.link(encoder)
  43.         encoder.link(filesink)
  44.    
  45.     def get_file_list(self):
  46.         for top in self.path_list:
  47.             for root, dirs, files in walk(top):
  48.                 for f in files:
  49.                     self.file_list.append(abspath(root + '/' + f))
  50.    
  51.     def on_finished(self, discoverer, *user_data):
  52.         self.stop()
  53.    
  54.     def parse_results(self, discoverer, info, error, *user_data):
  55.         result = info.get_result()
  56.         uri = info.get_uri()
  57.         tags = info.get_tags()
  58.         duration = info.get_duration()
  59.        
  60.         if result == GstPbutils.DiscovererResult.OK:
  61.             track = {}
  62.             track['uri'] = uri
  63.             track['duration'] = duration
  64.            
  65.             for tag in ['title', 'artist', 'album', 'genre']:
  66.                 exists, value = tags.get_string(tag)
  67.                
  68.                 if exists:
  69.                     track[tag] = value
  70.            
  71.             exists, sample = tags.get_sample('image')
  72.             if exists:
  73.                 source_buffer = sample.get_buffer()
  74.                 self.appsrc.set_property('caps', sample.get_caps())
  75.                 self.appsrc.set_property('size', source_buffer.get_size())
  76.                 self.appsrc.connect('need-data', self.push_image, source_buffer)
  77.                 self.image_pipeline.set_state(Gst.State.PLAYING)
  78.            
  79.             self.tracks.insert(track)
  80.         else:
  81.             # TODO: Do something about the various cases here.
  82.             pass
  83.    
  84.     def push_image(self, appsrc, size, source_buffer):
  85.         print('pushing image...')
  86.         self.appsrc.emit('push-buffer', source_buffer)
  87.         self.appsrc.disconnect('need-data')
  88.         self.appsrc.emit('end-of-stream')
  89.         self.image_pipeline.set_state(Gst.State.NULL)
  90.         print('...done')
  91.    
  92.     def image_pipeline_seek(self, appsrc, offset):
  93.         if offset == 0:
  94.             return True
  95.         else:
  96.             return False
  97.    
  98.     def start(self):
  99.         self.discoverer.start()
  100.        
  101.         for f in self.file_list:
  102.             self.discoverer.discover_uri_async(Gst.filename_to_uri(f))
  103.             print(f)
  104.        
  105.         self.mainloop.run()
  106.    
  107.     def stop(self):
  108.         self.discoverer.stop()
  109.         self.mainloop.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement