script.py 2.9 KB

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