home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / serpentine / converting.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  13.7 KB  |  410 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''"
  5. This module is used to convert audio data to local WAV files. These files
  6. are cached in the local filesystem and can be used by the recording module.
  7. '''
  8. import tempfile
  9. import os
  10. import gst
  11. from types import StringType
  12. import urlutil
  13. import operations
  14. import audio
  15.  
  16. class GetMusic(operations.MeasurableOperation, operations.OperationListener):
  17.     '''"
  18.     A Measurable Operation that finishes when the filename is available in the 
  19.     music pool.
  20.     '''
  21.     
  22.     def __init__(self, pool, music):
  23.         operations.MeasurableOperation.__init__(self)
  24.         self._GetMusic__music = music
  25.         self._GetMusic__pool = pool
  26.         self._GetMusic__oper = None
  27.  
  28.     
  29.     def getProgress(self):
  30.         if self._GetMusic__oper is not None:
  31.             return self._GetMusic__oper.progress
  32.         
  33.         return 0.0
  34.  
  35.     progress = property(getProgress)
  36.     running = property((lambda self: if self._GetMusic__oper:
  37. passself._GetMusic__oper.running))
  38.     can_stop = property((lambda self: if self._GetMusic__oper:
  39. passself._GetMusic__oper.can_stop))
  40.     music = property((lambda self: self._GetMusic__music))
  41.     pool = property((lambda self: self._GetMusic__pool))
  42.     
  43.     def start(self):
  44.         if self._GetMusic__pool.is_available(self._GetMusic__music):
  45.             self._send_finished_event(operations.SUCCESSFUL)
  46.             self._GetMusic__oper = None
  47.         else:
  48.             
  49.             try:
  50.                 self._GetMusic__oper = self._GetMusic__pool.fetch_music(self._GetMusic__music)
  51.                 self._GetMusic__oper.listeners.append(self)
  52.                 self._GetMusic__oper.start()
  53.             except Exception:
  54.                 e = None
  55.                 import traceback
  56.                 traceback.print_exc()
  57.                 self._send_finished_event(operations.ERROR, error = e)
  58.  
  59.  
  60.     
  61.     def on_finished(self, event):
  62.         self._send_finished_event(event.id, event.error)
  63.         self._GetMusic__oper = None
  64.  
  65.     
  66.     def stop(self):
  67.         if not self._GetMusic__oper:
  68.             raise AssertionError
  69.         self._GetMusic__oper.stop()
  70.  
  71.  
  72.  
  73. class MusicPool:
  74.     '''
  75.     A music pool is basically a place where you put your music to convert it
  76.     to local WAV files which will then be used to create audio CDs.
  77.     '''
  78.     
  79.     def __init__(self):
  80.         raise NotImplementedError
  81.  
  82.     
  83.     def fetch_music(self, music):
  84.         """
  85.         Returns a operations.MeasurableOperation that correspondes the user
  86.         can use to monitor it's progress.
  87.         """
  88.         raise NotImplementedError
  89.  
  90.     
  91.     def is_available(self, music):
  92.         '''
  93.         Returns if a certain music is on cache.
  94.         '''
  95.         raise NotImplementedError
  96.  
  97.     
  98.     def get_filename(self, music):
  99.         '''
  100.         Returns the filename associated with a certain music in cache. The user
  101.         must be sure that the file is in cache.
  102.         '''
  103.         raise NotImplementedError
  104.  
  105.     
  106.     def clear(self):
  107.         """
  108.         Clears the pool of it's elements.
  109.         """
  110.         raise NotImplementedError
  111.  
  112.  
  113.  
  114. class GstCacheEntry:
  115.     
  116.     def __init__(self, filename, is_temp):
  117.         self.is_temp = is_temp
  118.         self.filename = filename
  119.  
  120.  
  121.  
  122. class GstSourceToWavListener(operations.OperationListener):
  123.     
  124.     def __init__(self, parent, filename, music):
  125.         self._GstSourceToWavListener__filename = filename
  126.         self._GstSourceToWavListener__music = music
  127.         self._GstSourceToWavListener__parent = parent
  128.  
  129.     
  130.     def on_finished(self, event):
  131.         if event.id == operations.SUCCESSFUL:
  132.             self._GstSourceToWavListener__parent.cache[self._GstSourceToWavListener__parent.unique_music_id(self._GstSourceToWavListener__music)] = GstCacheEntry(self._GstSourceToWavListener__filename, True)
  133.         else:
  134.             os.unlink(self._GstSourceToWavListener__filename)
  135.  
  136.  
  137.  
  138. class GstMusicPool(MusicPool):
  139.     
  140.     def __init__(self):
  141.         self._GstMusicPool__cache = { }
  142.         self._GstMusicPool__temp_dir = None
  143.  
  144.     cache = property((lambda self: self._GstMusicPool__cache))
  145.     
  146.     def setTemporaryDir(self, temp_dir):
  147.         if not temp_dir == None and isinstance(temp_dir, StringType):
  148.             raise AssertionError, 'Directory must be a string. Or None for default.'
  149.         self._GstMusicPool__temp_dir = temp_dir
  150.  
  151.     
  152.     def getTemporaryDir(self):
  153.         return self._GstMusicPool__temp_dir
  154.  
  155.     temporaryDir = property(getTemporaryDir, setTemporaryDir)
  156.     
  157.     def is_available(self, music):
  158.         return self.cache.has_key(self.unique_music_id(music))
  159.  
  160.     
  161.     def get_filename(self, music):
  162.         if not self.is_available(music):
  163.             raise AssertionError
  164.         return self.cache[self.unique_music_id(music)].filename
  165.  
  166.     
  167.     def get_source(self, music):
  168.         raise NotImplementedError
  169.  
  170.     
  171.     def fetch_music(self, music):
  172.         '''
  173.         Can throw a OSError exception in case of the provided temporary dir being
  174.         invalid.
  175.         '''
  176.         if not not self.is_available(music):
  177.             raise AssertionError
  178.         source = self.get_source()
  179.         (handle, filename) = tempfile.mkstemp(suffix = '.wav', dir = self.temporaryDir)
  180.         os.close(handle)
  181.         our_listener = GstSourceToWavListener(self, filename, music)
  182.         oper = audio.convert_to_wav(source, music, filename)
  183.         oper.listeners.append(our_listener)
  184.         return oper
  185.  
  186.     
  187.     def clear(self):
  188.         for key in self.cache:
  189.             entry = self.cache[key]
  190.             if entry.is_temp:
  191.                 os.unlink(entry.filename)
  192.                 continue
  193.         
  194.         self._GstMusicPool__cache = { }
  195.  
  196.     
  197.     def __del__(self):
  198.         self.clear()
  199.  
  200.     
  201.     def unique_music_id(self, music):
  202.         pass
  203.  
  204.  
  205.  
  206. class GvfsMusicPool(GstMusicPool):
  207.     use_gnomevfs = True
  208.     
  209.     def unique_music_id(self, uri):
  210.         """
  211.         Provides a way of uniquely identifying URI's, in case of user sends:
  212.         file:///foo%20bar
  213.         file:///foo bar
  214.         /foo bar
  215.         Returns always a URL, even if the string was a file path.
  216.         """
  217.         return urlutil.normalize(uri)
  218.  
  219.     
  220.     def is_wav(self, filename):
  221.         is_pcm = audio.is_wav_pcm(self.get_source(), filename)
  222.         return operations.syncOperation(is_pcm).id == operations.SUCCESSFUL
  223.  
  224.     
  225.     def is_local(self, filename):
  226.         return urlutil.is_local(filename)
  227.  
  228.     
  229.     def is_available(self, music):
  230.         on_cache = GstMusicPool.is_available(self, music)
  231.         unique_id = self.unique_music_id(music)
  232.         if not on_cache and self.is_local(music) and self.is_wav(unique_id):
  233.             filename = urlutil.get_path(unique_id)
  234.             self.cache[unique_id] = GstCacheEntry(filename, False)
  235.             on_cache = True
  236.         
  237.         return on_cache
  238.  
  239.     
  240.     def get_source(self):
  241.         if self.use_gnomevfs:
  242.             return audio.GVFS_SRC
  243.         else:
  244.             return audio.FILE_SRC
  245.  
  246.  
  247.  
  248. class FetchMusicListPriv(operations.OperationListener):
  249.     
  250.     def __init__(self, parent, music_list):
  251.         self.music_list = music_list
  252.         self.parent = parent
  253.  
  254.     
  255.     def get_music_from_uri(self, uri):
  256.         for m in self.music_list:
  257.             if m['location'] == uri:
  258.                 return m
  259.                 continue
  260.         
  261.  
  262.     
  263.     def on_finished(self, evt):
  264.         if isinstance(evt.source, operations.OperationsQueue):
  265.             self.parent._propagate(evt)
  266.             return None
  267.         
  268.         if not isinstance(evt.source, GetMusic):
  269.             raise AssertionError
  270.         if evt.id != operations.SUCCESSFUL:
  271.             return None
  272.         
  273.         uri = evt.source.music
  274.         pool = evt.source.pool
  275.         filename = pool.get_filename(uri)
  276.         m = self.get_music_from_uri(uri)
  277.         if m:
  278.             m['cache_location'] = filename
  279.         elif not False:
  280.             raise AssertionError, "uri '%s' was not found in music list." % uri
  281.  
  282.     
  283.     def before_operation_starts(self, event, operation):
  284.         e = operations.Event(self.parent)
  285.         m = self.get_music_from_uri(operation.music)
  286.         if not m:
  287.             raise AssertionError
  288.         for l in self.parent.listeners:
  289.             if isinstance(l, FetchMusicListListener):
  290.                 l.before_music_fetched(e, m)
  291.                 continue
  292.         
  293.  
  294.  
  295.  
  296. class FetchMusicListListener(operations.OperationListener):
  297.     
  298.     def before_music_fetched(self, event, music):
  299.         pass
  300.  
  301.  
  302.  
  303. class FetchMusicList(operations.MeasurableOperation):
  304.     """
  305.     Fetches a music list which contains the field 'uri' and replaces it by a
  306.     local filename located inside the pool. When the filename is fetched it
  307.     updates the 'filename' field inside each music entry of the music list.
  308.     """
  309.     
  310.     def __init__(self, music_list, pool):
  311.         operations.MeasurableOperation.__init__(self)
  312.         self._FetchMusicList__music_list = music_list
  313.         self._FetchMusicList__queue = operations.OperationsQueue()
  314.         self._FetchMusicList__pool = pool
  315.         self._FetchMusicList__listener = FetchMusicListPriv(self, music_list)
  316.         self._FetchMusicList__queue.listeners.append(self._FetchMusicList__listener)
  317.  
  318.     
  319.     def getProgress(self):
  320.         return self._FetchMusicList__queue.progress
  321.  
  322.     progress = property(getProgress)
  323.     running = property((lambda self: self._FetchMusicList__queue.running))
  324.     
  325.     def start(self):
  326.         for m in self._FetchMusicList__music_list:
  327.             get = GetMusic(self._FetchMusicList__pool, m['location'])
  328.             get.listeners.append(self._FetchMusicList__listener)
  329.             self._FetchMusicList__queue.append(get)
  330.         
  331.         self._FetchMusicList__queue.start()
  332.  
  333.     can_stop = property((lambda self: self._FetchMusicList__queue.can_stop))
  334.     
  335.     def stop(self):
  336.         self._FetchMusicList__queue.stop()
  337.  
  338.  
  339. if __name__ == '__main__':
  340.     import sys
  341.     import gtk
  342.     import gobject
  343.     import gtkutil
  344.     from os import path
  345.     
  346.     def quit():
  347.         return False
  348.  
  349.     
  350.     def pp(oper):
  351.         p = oper.get_progress()
  352.         print p
  353.         if p == 1:
  354.             gtk.main_quit()
  355.         
  356.         return True
  357.  
  358.     
  359.     class MyListener(FetchMusicListListener):
  360.         
  361.         def __init__(self, prog, oper):
  362.             FetchMusicListListener.__init__(self)
  363.             self.music = None
  364.             self.prog = prog
  365.             self.oper = oper
  366.  
  367.         
  368.         def before_music_fetched(self, evt, music):
  369.             print music
  370.             prog_txt = 'Converting '
  371.             prog_txt += path.basename(urlutil.get_path(music['location']))
  372.             self.prog.sub_progress_text = prog_txt
  373.             self.prog.progress_fraction = self.oper.progress
  374.             if self.music:
  375.                 print 'Fetched', self.music['cache_location']
  376.             
  377.             print 'Fetching', music['location']
  378.             self.music = music
  379.  
  380.         
  381.         def on_finished(self, e):
  382.             if self.music:
  383.                 print 'Fetched', self.music
  384.             
  385.             print self.oper.progress
  386.             gtk.main_quit()
  387.  
  388.         
  389.         def tick(self):
  390.             self.prog.progress_fraction = self.oper.progress
  391.             return True
  392.  
  393.  
  394.     prog = gtkutil.HigProgress()
  395.     prog.primary_text = 'Recording Audio Disc'
  396.     prog.secondary_text = 'Selected files are to be written to a CD or DVD disc. This operation may take a long time, depending on data size and write speed.'
  397.     prog.show()
  398.     pool = GvfsMusicPool()
  399.     music_list = [
  400.         {
  401.             'location': path.abspath(sys.argv[1]) }]
  402.     fetcher = FetchMusicList(music_list, pool)
  403.     l = MyListener(prog, fetcher)
  404.     fetcher.listeners.append(l)
  405.     gobject.timeout_add(200, l.tick)
  406.     fetcher.start()
  407.     gtk.main()
  408.     pool.clear()
  409.  
  410.