fsutils.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import fnmatch
  2. import logging
  3. import mimetypes
  4. import os
  5. import posixpath
  6. import urllib.request
  7. from tempfile import mkstemp
  8. from urllib.parse import urlparse
  9. log = logging.getLogger(__name__)
  10. def scan_dir(dirname, extension=None):
  11. if extension is None:
  12. extension = "*"
  13. for root, dirnames, filenames in os.walk(dirname):
  14. for fname in fnmatch.filter(filenames, extension):
  15. yield os.path.join(root, fname)
  16. def multi_fnmatch(fname, extensions):
  17. for ext in extensions:
  18. if fnmatch.fnmatch(fname, "*." + ext):
  19. return True
  20. return False
  21. def is_audio(fname):
  22. mimetype = mimetypes.guess_type(fname)[0]
  23. if mimetype is None:
  24. return False
  25. return mimetype.split("/")[0] == "audio"
  26. def scan_dir_audio(dirname, extensions=("mp3", "oga", "wav", "ogg")):
  27. for root, dirnames, filenames in os.walk(dirname):
  28. for fname in filenames:
  29. if is_audio(fname):
  30. yield os.path.join(root, fname)
  31. def shortname(path):
  32. name = os.path.basename(path) # filename
  33. name = name.rsplit(".", 1)[0] # no extension
  34. name = "".join(c for c in name if c.isalnum()) # no strange chars
  35. return name
  36. def download_http(url, destdir=None, copy=False, prefix="httpdl"):
  37. if url.split(":")[0] not in ("http", "https"):
  38. log.warning("Not a valid URL: %s", url)
  39. return None
  40. ext = url.split(".")[-1]
  41. if ext.lower() not in ("mp3", "ogg", "oga", "wma", "m4a"):
  42. log.warning('Invalid format (%s) for "%s"', ext, url)
  43. return None
  44. if not copy:
  45. return url
  46. fname = posixpath.basename(urlparse(url).path)
  47. # sanitize
  48. fname = "".join(
  49. c for c in fname if c.isalnum() or c in list("._-")
  50. ).rstrip()
  51. tmp = mkstemp(
  52. suffix="." + ext, prefix="%s-%s-" % (prefix, fname), dir=destdir
  53. )
  54. os.close(tmp[0])
  55. log.info("downloading %s -> %s", url, tmp[1])
  56. fname, headers = urllib.request.urlretrieve(url, tmp[1])
  57. return "file://%s" % os.path.realpath(tmp[1])