script.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from pathlib import Path
  2. import gradio as gr
  3. from modules.html_generator import image_to_base64
  4. def generate_html():
  5. css = """
  6. .character-gallery {
  7. margin: 1rem 0;
  8. display: grid;
  9. grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  10. grid-column-gap: 0.4rem;
  11. grid-row-gap: 1.2rem;
  12. }
  13. .character-container {
  14. cursor: pointer;
  15. text-align: center;
  16. position: relative;
  17. opacity: 0.85;
  18. }
  19. .character-container:hover {
  20. opacity: 1;
  21. }
  22. .character-container .placeholder, .character-container img {
  23. width: 150px;
  24. height: 200px;
  25. background-color: gray;
  26. object-fit: cover;
  27. margin: 0 auto;
  28. border-radius: 1rem;
  29. border: 3px solid white;
  30. box-shadow: 5px 5px 8px 0px rgb(0 0 0 / 50%);
  31. }
  32. .character-name {
  33. margin-top: 0.2rem;
  34. display: block;
  35. font-size: 1.2rem;
  36. font-weight: 600;
  37. overflow-wrap: anywhere;
  38. }
  39. """
  40. container_html = f'<style>{css}</style><div class="character-gallery">'
  41. # Iterate through files in image folder
  42. for file in sorted(Path("characters").glob("*")):
  43. if file.name.endswith(".json"):
  44. character = file.name.replace(".json", "")
  45. container_html += f'<div class="character-container" onclick=\'document.getElementById("character-menu").children[1].children[1].value = "{character}"; document.getElementById("character-menu").children[1].children[1].dispatchEvent(new Event("change"));\'>'
  46. image_html = "<div class='placeholder'></div>"
  47. for i in [
  48. f"characters/{character}.png",
  49. f"characters/{character}.jpg",
  50. f"characters/{character}.jpeg",
  51. ]:
  52. path = Path(i)
  53. if path.exists():
  54. try:
  55. image_html = f'<img src="data:image/png;base64,{image_to_base64(path)}">'
  56. break
  57. except:
  58. continue
  59. container_html += f'{image_html} <span class="character-name">{character}</span>'
  60. container_html += "</div>"
  61. container_html += "</div>"
  62. return container_html
  63. def ui():
  64. with gr.Accordion("Character gallery"):
  65. update = gr.Button("Refresh")
  66. gallery = gr.HTML(value=generate_html())
  67. update.click(generate_html, [], gallery)