A Python UPnP Media Server
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.4 KiB

  1. #!/usr/bin/env python
  2. #
  3. # Copyright 2006 John-Mark Gurney.
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. # notice, this list of conditions and the following disclaimer in the
  13. # documentation and/or other materials provided with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. # SUCH DAMAGE.
  26. #
  27. # $Id$
  28. #
  29. __all__ = [ 'decode_title', 'decode_description' ]
  30. try:
  31. from ctypes import *
  32. import ctypes.util
  33. import os.path
  34. path = os.path.dirname(__file__)
  35. if not path:
  36. path = '.'
  37. hd = ctypes.cdll.LoadLibrary(os.path.join(path, 'libhuffdecode.so.1'))
  38. hd.decodetitle.restype = c_int
  39. hd.decodetitle.argtypes = [ c_char_p, c_char_p, c_int ]
  40. hd.decodedescription.restype = c_int
  41. hd.decodedescription.argtypes = [ c_char_p, c_char_p, c_int ]
  42. def docall(fun, s):
  43. buflen = 256
  44. while True:
  45. buf = ctypes.create_string_buffer(buflen)
  46. cnt = fun(s, buf, buflen)
  47. if cnt < buflen:
  48. break
  49. buflen *= 2
  50. return buf.value.decode('iso8859-1')
  51. decode_title = lambda x: docall(hd.decodetitle, x)
  52. decode_description = lambda x: docall(hd.decodedescription, x)
  53. except ImportError:
  54. def foo(*args):
  55. raise NotImplementedError, 'Failed to import ctypes'
  56. decode_title = decode_description = foo
  57. except OSError:
  58. def foo(*args):
  59. raise NotImplementedError, 'Failed to find library huffdecode'
  60. decode_title = decode_description = foo