files.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from open_webui.routers.images import (
  2. load_b64_image_data,
  3. upload_image,
  4. )
  5. from fastapi import (
  6. APIRouter,
  7. Depends,
  8. HTTPException,
  9. Request,
  10. UploadFile,
  11. )
  12. from open_webui.routers.files import upload_file_handler
  13. import mimetypes
  14. import base64
  15. import io
  16. def get_image_url_from_base64(request, base64_image_string, metadata, user):
  17. if "data:image/png;base64" in base64_image_string:
  18. image_url = ""
  19. # Extract base64 image data from the line
  20. image_data, content_type = load_b64_image_data(base64_image_string)
  21. if image_data is not None:
  22. image_url = upload_image(
  23. request,
  24. image_data,
  25. content_type,
  26. metadata,
  27. user,
  28. )
  29. return image_url
  30. return None
  31. def load_b64_audio_data(b64_str):
  32. try:
  33. if "," in b64_str:
  34. header, b64_data = b64_str.split(",", 1)
  35. else:
  36. b64_data = b64_str
  37. header = "data:audio/wav;base64"
  38. audio_data = base64.b64decode(b64_data)
  39. content_type = (
  40. header.split(";")[0].split(":")[1] if ";" in header else "audio/wav"
  41. )
  42. return audio_data, content_type
  43. except Exception as e:
  44. print(f"Error decoding base64 audio data: {e}")
  45. return None, None
  46. def upload_audio(request, audio_data, content_type, metadata, user):
  47. audio_format = mimetypes.guess_extension(content_type)
  48. file = UploadFile(
  49. file=io.BytesIO(audio_data),
  50. filename=f"generated-{audio_format}", # will be converted to a unique ID on upload_file
  51. headers={
  52. "content-type": content_type,
  53. },
  54. )
  55. file_item = upload_file_handler(
  56. request,
  57. file=file,
  58. metadata=metadata,
  59. process=False,
  60. user=user,
  61. )
  62. url = request.app.url_path_for("get_file_content_by_id", id=file_item.id)
  63. return url
  64. def get_audio_url_from_base64(request, base64_audio_string, metadata, user):
  65. if "data:audio/wav;base64" in base64_audio_string:
  66. audio_url = ""
  67. # Extract base64 audio data from the line
  68. audio_data, content_type = load_b64_audio_data(base64_audio_string)
  69. if audio_data is not None:
  70. audio_url = upload_audio(
  71. request,
  72. audio_data,
  73. content_type,
  74. metadata,
  75. user,
  76. )
  77. return audio_url
  78. return None
  79. def get_file_url_from_base64(request, base64_file_string, metadata, user):
  80. if "data:image/png;base64" in base64_file_string:
  81. return get_image_url_from_base64(request, base64_file_string, metadata, user)
  82. elif "data:audio/wav;base64" in base64_file_string:
  83. return get_audio_url_from_base64(request, base64_file_string, metadata, user)
  84. return None