suggestions.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import os
  2. from flask import current_app
  3. from larigira.config import get_conf
  4. from larigira.fsutils import scan_dir_audio
  5. def get_suggested_files():
  6. if not get_conf()['FILE_PATH_SUGGESTION']:
  7. return []
  8. if current_app.cache.has('dbadmin.get_suggested_files'):
  9. return current_app.cache.get('dbadmin.get_suggested_files')
  10. current_app.logger.debug('get_suggested_files MISS in cache')
  11. files = []
  12. for path in get_conf()['FILE_PATH_SUGGESTION']:
  13. if not os.path.isdir(path):
  14. current_app.logger.warn('Invalid suggestion path: %s' % path)
  15. continue
  16. pathfiles = scan_dir_audio(path)
  17. files.extend(pathfiles)
  18. current_app.logger.debug('Suggested files: %s' % ', '.join(files))
  19. current_app.cache.set('dbadmin.get_suggested_files', files,
  20. timeout=600) # ten minutes
  21. return files
  22. def get_suggested_dirs():
  23. dirset = set()
  24. for f in get_suggested_files():
  25. dirpath = os.path.dirname(f)
  26. while dirpath:
  27. if dirpath in dirset:
  28. break
  29. dirset.add(dirpath)
  30. dirpath = os.path.dirname(dirpath)
  31. return list(dirset)
  32. def get_suggested_scripts():
  33. base = get_conf()['SCRIPTS_PATH']
  34. if not base or not os.path.isdir(base):
  35. return []
  36. fnames = [f for f in os.listdir(base)
  37. if os.access(os.path.join(base, f), os.R_OK | os.X_OK)]
  38. return fnames
  39. def get_suggestions():
  40. files = get_suggested_files()
  41. if len(files) > 200:
  42. current_app.logger.warn("Too many suggested files, cropping")
  43. files = files[:200]
  44. return dict(
  45. files=files,
  46. dirs=get_suggested_dirs(),
  47. scripts=get_suggested_scripts(),
  48. )