script.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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(4, 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.75;
  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 2px 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. }
  38. """
  39. container_html = f'<style>{css}</style><div class="character-gallery">'
  40. # Iterate through files in image folder
  41. for file in Path("characters").glob("*"):
  42. if file.name.endswith(".json"):
  43. character = file.name.replace(".json", "")
  44. 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"));\'>'
  45. image_html = "<div class='placeholder'></div>"
  46. for i in [
  47. f"characters/{character}.png",
  48. f"characters/{character}.jpg",
  49. f"characters/{character}.jpeg",
  50. ]:
  51. path = Path(i)
  52. if path.exists():
  53. try:
  54. image_html = f'<img src="data:image/png;base64,{image_to_base64(path)}">'
  55. break
  56. except:
  57. continue
  58. container_html += f'{image_html} <span class="character-name">{character}</span>'
  59. container_html += "</div>"
  60. container_html += "</div>"
  61. return container_html
  62. def ui():
  63. with gr.Accordion("Character gallery"):
  64. update = gr.Button("Refresh")
  65. gallery = gr.HTML(value=generate_html())
  66. update.click(generate_html, [], gallery)