script.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from pathlib import Path
  2. import gradio as gr
  3. from modules.html_generator import get_image_cache
  4. from modules.chat import load_character
  5. from modules.shared import gradio, settings
  6. def generate_css():
  7. css = """
  8. .character-gallery > .gallery {
  9. margin: 1rem 0;
  10. display: grid !important;
  11. grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  12. grid-column-gap: 0.4rem;
  13. grid-row-gap: 1.2rem;
  14. }
  15. .character-gallery > .label {
  16. display: none !important;
  17. }
  18. .character-container {
  19. cursor: pointer;
  20. text-align: center;
  21. position: relative;
  22. opacity: 0.85;
  23. }
  24. .character-container:hover {
  25. opacity: 1;
  26. }
  27. .character-container .placeholder, .character-container img {
  28. width: 150px;
  29. height: 200px;
  30. background-color: gray;
  31. object-fit: cover;
  32. margin: 0 auto;
  33. border-radius: 1rem;
  34. border: 3px solid white;
  35. box-shadow: 3px 3px 6px 0px rgb(0 0 0 / 50%);
  36. }
  37. .character-name {
  38. margin-top: 0.3rem;
  39. display: block;
  40. font-size: 1.2rem;
  41. font-weight: 600;
  42. overflow-wrap: anywhere;
  43. }
  44. """
  45. return css
  46. def generate_html():
  47. cards = []
  48. # Iterate through files in image folder
  49. for file in sorted(Path("characters").glob("*")):
  50. if file.name.endswith(".json"):
  51. character = file.name.replace(".json", "")
  52. container_html = f'<div class="character-container">'
  53. image_html = "<div class='placeholder'></div>"
  54. for i in [
  55. f"characters/{character}.png",
  56. f"characters/{character}.jpg",
  57. f"characters/{character}.jpeg",
  58. ]:
  59. path = Path(i)
  60. if path.exists():
  61. try:
  62. image_html = f'<img src="file/{get_image_cache(path)}">'
  63. break
  64. except:
  65. continue
  66. container_html += f'{image_html} <span class="character-name">{character}</span>'
  67. container_html += "</div>"
  68. cards.append([container_html, character])
  69. return cards
  70. def select_character(evt: gr.SelectData):
  71. return (evt.value[1])
  72. def ui():
  73. with gr.Accordion("Character gallery", open=False):
  74. update = gr.Button("Refresh")
  75. gr.HTML(value="<style>"+generate_css()+"</style>")
  76. gallery = gr.Dataset(components=[gr.HTML(visible=False)],
  77. label="",
  78. samples=generate_html(),
  79. elem_classes=["character-gallery"],
  80. samples_per_page=50
  81. )
  82. update.click(generate_html, [], gallery)
  83. gallery.select(select_character, None, gradio['character_menu'])