{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "id": "mInOtcO66MPD" }, "outputs": [], "source": [ "#2.1\n", "# Виджет загрузки моделей\n", "\n", "Black = \"stable-\"\n", "Lives = \"diffusion\"\n", "Matter = \"-webui\"\n", "BlackLivesMatter = Black+Lives+Matter\n", "\n", "sd_models_on_gdrive = f\"/content/gdrive/MyDrive/SD/{BlackLivesMatter}/models/Stable-diffusion/\"\n", "\n", "def dl_gdrive():\n", " if not os.path.exists('/content/gdrive/MyDrive'):\n", " print(\"\\033[01;38;05;166mТы не подключил гуглодиск ранее но поставил галочку для скачивания на него!\\nПодключись сейчас, или отменив - модели буду качаться в дефольную папку колаба!\\033[\")\n", " try:\n", " from google.colab import drive\n", " drive.mount('/content/gdrive')\n", " except Exception:\n", " print(f\"ты отказался от подключения гуглодиска!\\nпапка для загрузки моделей сброшена на дефолтную\")\n", " else:\n", " print(\"Модели будут качаться на гуглодиск.\")\n", " if not os.path.exists(sd_models_on_gdrive): # eсли папки моделей нет или она указана не верно - папка будет создана\n", " print(\"Папка для скачивания не была найдена и была создана только что.\")\n", " os.makedirs(sd_models_on_gdrive)\n", " !sleep 1\n", "\n", "import requests\n", "css_setup_widget = requests.get(f\"{gh}css_setup_widget.html\").text # css дублируется для виджета загрузки моделей, т.к. он же в отдельной ячейке\n", "def css():\n", " display(HTML(f'''\n", " {css_setup_widget}\n", "'''))\n", "\n", "gdrive_dl = widgets.Checkbox(value=False, description='скачивать модели на гуглодиск').add_class(\"googledisk_checkbox\")\n", "\n", "ownlink1 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink2 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink3 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink4 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink5 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink6 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink7 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink8 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink9 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "ownlink10 = widgets.Text(\n", " value='',\n", " placeholder='только прямая ссылка на файл модели',\n", " description='Прямая ссылка:'\n", ")\n", "\n", "#аниме\n", "models_A = [\"chameleonaiMix\", \"animeinourworld\", \"expmixLine\", \"Baka_Diffusion\", \"darkSushiMixMix\", \"CamelliaMix\", \"Midnight_Mixes\", \"7th_Layer\", \"BeenYou\", \"BadassMix_Anime\", \"MoonrideMixes\", \"SakuraMix\", \"Luma\", \"Anime_80s\", \"_8528Diffusion_final_v05\", \"AbyssOrangeMix\", \"AbyssOrangeMix2\", \"AbyssOrangeMix3\", \"Anonmix\", \"Antlers_mix\", \"Any222Trinart\", \"Anything_Berrymix\", \"Anything_V3\", \"Anything_v3_better_vae\", \"Anything_v4_0\", \"Anything_v4_5\", \"Anything_v5\", \"AnythingGape\", \"AnyPastel\", \"AyoniMix_Anime\", \"BerryCandy\", \"Berrymix_Zeipher222\", \"BloodOrangeMix\", \"Bstaber\", \"BstaberElysium_Anime\", \"cetusMix\", \"ChinaBerry_nofix_f222_v1_4_pt2\", \"Corneos_7th_HeavenMix\", \"Counterfeit\", \"Cyberpunk_Anime_Diffusion\", \"EerieOrangeMix\", \"EerieOrangeMix2\", \"EtherRealMix\", \"ElyOrangeMix\", \"Freckle_mix\", \"GAPE60\", \"GrapefruitHentaiModel\", \"Hassaku_hentai\", \"Kenshi\", \"Mandarine\", \"MeinaHentai\", \"MeinaMix\", \"MeinaPastel\", \"MeinaUnreal\", \"monstermash4_anyv3\", \"monstermash6_anyv3\", \"NAI\", \"OrangeMixs_All\", \"PastelMix\", \"Plat\", \"protogenV22Anime\", \"ReV_Anime\", \"Silicon\", \"StablyDiffuseds_MagnumOpus_Anime\", \"Trinart\", \"WalnutcreamBlend\", \"WaifuDiffusion\", \"Yohan_Diffusion\", \"xperoEnd1essModel_Anime\"]\n", "\n", "#лайнарт\n", "models_B = [\"GraphicArt\", \"StickerArt\", \"AnimePencil\", \"App_Icons\", \"ColoringBook\", \"vectorArt\"]\n", "\n", "#женские\n", "models_C = [\"SunlightMix\", \"SunshineMix\", \"ChilloutNebula\", \"CloverMix\", \"NiobMix\", \"idealWomenLooksLike\", \"ABS_Mix\", \"AnimeStatic\", \"BBAImix\", \"BismuthMix\", \"Eris\", \"EroticVision\", \"GangbangURPM\", \"ThisBabeDoesntExist\", \"MetagodSelfieMix\", \"PerfectWorld\", \"PornVision\", \"MagMix\", \"RadixDelta\", \"SuccubusMix\", \"goodChange\", \"MarsMix\", \"fnordMix\", \"AnalogMadness\", \"AicebergsMix\", \"artErosAErosATribute_aEros\", \"Babes\", \"bkdbj\", \"Clarity\", \"ChilloutMix\", \"DDosMix\", \"DJR\", \"epi_hyperphotogodess\", \"F222\", \"GenericFemaleMix\", \"hoacb\", \"HassanBlend\", \"Holidays_in_the_Caribbean\", \"LazyMix_RealAmateurNudes\", \"Learn\", \"MoDEL2\", \"pyros_blowjob\", \"RealEldenApocalypse_AnalogSexKnoll_4CandyPureSimp_FEET\", \"uberRealisticPornMerge\"]\n", "\n", "#игры и кино\n", "models_D = [\"Black_Souls\", \"Bloodborne\", \"Borderlands\", \"DarkSouls\", \"DiscoElysium_style\", \"EldenRing_style\", \"GalaxyTimemachines\", \"Hogwarts_Legacy\", \"MovieDiffusion\", \"pokemon\", \"ProtoGenDragonX59\", \"protogenX3_4\", \"Starsector_Portrait\", \"TronLegacy_style\"]\n", "\n", "#техника и космос\n", "models_E = [\"dvMech\", \"EpicSpaceMachine\", \"James_Webb_Cosmos\", \"nousr_robot\", \"RealSciFi\", \"ProtoGenInfinityX86\"]\n", "\n", "#крипота\n", "models_F = [\"blotmon\", \"Creepy_Diffusion\", \"Dead\", \"jim_TERUMODE\", \"newhorrorfantasy_style\", \"rotten_zombie\"]\n", "\n", "#макро\n", "models_G = [\"theEyesHaveIt\", \"macroDiffusion\", \"Microscopic\"]\n", "\n", "#мемные\n", "models_H = [\"chkn_петухи\", \"ГигаЧэд\", \"hyperpreg__round_belly\", \"Pepe\", \"ШКЯ\"]\n", "\n", "#мужские\n", "models_I = [\"DV-PortraitMen\", \"homosexualDiffusion_v10\", \"winterefdalor\", \"AIroticArtsPenis\", \"BlueBugBros\", \"DaddyDiffusion\", \"FantasyEroticMalesPhotographs\", \"Homoerotic\", \"HomosexualDiffusion\", \"PlazmMen\", \"TwinkDiffusion\", \"TwinkEngine\", \"UncutPenises\", \"YaoiGen\"]\n", "\n", "#мультфильмы\n", "models_J = [\"Arcane_style\", \"Archer_style\", \"Classic_Disney_style\", \"megaPals\", \"Modern_Disney_style\", \"PixarStyle\", \"SpiderVerse_style\"]\n", "\n", "#пиксельарт\n", "models_K = [\"Pixhell\", \"All_In_1_Pixel\", \"MinecraftRTX\", \"Pixel_Art\", \"pixel_landscape\"]\n", "\n", "#трехмерная графика\n", "models_L = [\"DinosRichStyle\", \"EarthSatelliteImageMapMix\", \"SatelliteImageGenerator\", \"aloeVeraSSimpMaker3K_simpMaker3K1\", \"Clayitization\", \"Elegance\", \"Experience\", \"hAS3Dkx11_3Dkx11\", \"microworld\", \"mdjrny-shttr\", \"PFG\", \"PostApocalypse\", \"Redshift\", \"RPG\", \"SPYBG_Toolkit\", \"TextureDiffusion\", \"Unvail_AI_3DKX\"]\n", "\n", "#универсальные\n", "models_M = [\"ProjectAIO\", \"HolygeneX\", \"526Mix\", \"Artius_nsfw\", \"ColorFusion\", \"CoolAiVision\", \"Diabolique\", \"DumbMonkey\", \"KitchenSink2nsfw\", \"EpicRealism\", \"Neurogen\", \"Photosomnia\", \"Realbiter\", \"SacrumProfanum\", \"Verisimilitude_Dark\", \"WonderMix\", \"LunarDiffusion\", \"MysteriousCharacter\", \"Destiny\", \"Colorful\", \"Deliberate\", \"elldrethSLucidMix\", \"epicDiffusion\", \"FaeTastic\", \"fkingCivitai\", \"Liberty\", \"MMD\", \"NeverendingDreamNED\", \"PRMJ\", \"RealisticVision\", \"RetroMix\", \"RevAnimated\", \"SD_v2_1\", \"SD_v1_5\", \"SD_v1_5_full\", \"SD_v1_4\", \"StablyDiffuseds_MagnumOpus\", \"Vintedois_Diffusion\", \"Wavy_fusion\"]\n", "\n", "#фотореализм\n", "models_N = [\"SLDR\", \"ICBINP\", \"YurrrlMix\", \"CyberRealistic\", \"CyberRealistic-inpainting\", \"DreamFul\", \"EdgeOfRealism\", \"FotoAssisted\", \"KKW_IDEAL\", \"RealismEngine\", \"UniversalPhotorealistic\", \"LifeLikeDiffusion\", \"rMadaMerge\", \"Adobis_RealFlexibleMix\", \"Analog_diffusion\", \"avalonTruvision\", \"AV_Realistic\", \"Clarity\", \"classicNegative\", \"dreamlikePhotoReal\", \"Duskfall_Alters\", \"fking_scifi\", \"GravyMix\", \"HARDblend\", \"ModelShoot\", \"PhotoMerge\", \"Poolsuite\", \"Portrait_Plus\", \"PowerfulMix\", \"Protogen_X53_Photorealism\", \"Radiant\", \"realisticHASDX\", \"ReV\", \"s4w3d0ff_Blend\", \"Timeless\", \"uberrealistic_mix_PFG_URPM_Openjourney\", \"woopwoopPhoto\"]\n", "\n", "#фурри\n", "models_O = [\"AnimalWorld\", \"FurSlut\", \"YIFFY_EPOCH18\", \"YIFFY_GAPE\", \"YiffyMix\", \"Zack3D_Kinky\"]\n", "\n", "#футанари\n", "models_P = [\"Futagen\", \"AnyFutaGape\", \"FutaAllAnime\", \"FutaAnime\", \"Futacum_Anything\", \"Futacum_r34\"]\n", "\n", "#художественные\n", "models_Q = [\"LusciousMix\", \"ChimeraMix\", \"KaelvinSmix\", \"epicMixIllustration\", \"RinaMix\", \"AC_pencil\", \"BadassMix\", \"BeigePencil\", \"CthuluCult\", \"DarkFlatArtAI\", \"GiovanniBattista\", \"doubleExposurePhoto\", \"SurrealSteampunkAI\", \"VepianUltimatum\", \"A_to_Zovya_RPG_Artists_Tools\", \"Abstract_Swirls\", \"ATitanStrawBerry\", \"AyoniMix\", \"BackgroundsDiffusion\", \"beeple\", \"Beksinski\", \"BreathArt.safetensors\", \"BubblyDubbly\", \"CALARTS\", \"CharHelper_FineTuned\", \"Cats_Tabaxi\", \"CheeseDaddys_LandscapesMix\", \"Cthulhu_illithid\", \"Dalcefo\", \"Darkdream\", \"DanMumford_Style\", \"DBWayneBarlowe_JM\", \"DMMID_Style\", \"dreamlikediffusion\", \"DreamShaper\", \"DucHaitenDarkside\", \"Elldreths_StolenDreams_Mix\", \"FantasyWorld\", \"GigerStyle\", \"GuoZovya\", \"HASDX\", \"jim_EIDOMODE.safetensors\", \"jim_JORCRAF\", \"IlluminatiDiffusion\", \"img2img_PaintingGenerator\", \"Ложкин\", \"Midjourney\", \"MoistMix\", \"MoreAmbitious\", \"MosaicArt\", \"OldJourney\", \"OpenJourney\", \"PaperAI.safetensors\", \"Protogen_Eclipse\", \"Protogen_X58_Rebuil\", \"protogenNovaX80\", \"reasonableDrink\", \"reonArgondiansStyle\", \"ssmoky\", \"SteampunkAI\", \"SynthwavePunk\", \"TheGreatFault\", \"TheAllysMixIII_Revolutions\", \"Van_Gogh\", \"WiKiArt\", \"xperoEnd1essModel_Realistic\"]\n", "\n", "\n", "# категории от A до Q\n", "categories = [chr(i) for i in range(ord('A'), ord('R') + 1)]\n", "\n", "# 3 брата-словаря + и списковая фута-сестра. Так же сортировка по алфавиту. Более компактно чем расписано раннее в 18*2 строки. Позволяет писать модели НЕ в алфавитном порядке.\n", "models = {}\n", "for category in categories:\n", " models_list = [var for var in globals() if var.startswith(f\"models_{category}\") and isinstance(globals()[var], list)]\n", " sorted_models_list = sorted([model for models_var in models_list for model in globals()[models_var]])\n", " models[category] = sorted_models_list\n", "checkboxes = {}\n", "for category, models_list in models.items():\n", " if category == 'R':\n", " checkboxes[category] = [ownlink1, ownlink2, ownlink3, ownlink4, ownlink5, ownlink6, ownlink7, ownlink8, ownlink9, ownlink10]\n", " else:\n", " checkboxes[category] = list(map(lambda model: widgets.Checkbox(description=model, value=False), models_list))\n", "categories_dict = {}\n", "for category, checkboxes_list in checkboxes.items():\n", " categories_dict[category] = widgets.VBox(checkboxes_list)\n", " \n", "\n", "#готовим списки категории чекбоксов. Одноуровневые списки.\n", "categories_list = [categories_dict[category] for category in categories]\n", "'''\n", "костыль который работает разные checkboxes_list для функций поиска и загрузки:\n", "checkboxes_list = [categories_dict[category] for category in categories] - для поиска\n", "checkboxes_list = [checkboxes[category] for category in categories] - для загрузки\n", "они вставлены в сами функции!\n", "'''\n", "\n", "tab = widgets.Tab(children=categories_list)\n", "tab.set_title(0, \"аниме\")\n", "tab.set_title(1, \"лийнарт\")\n", "tab.set_title(2, \"женские\")\n", "tab.set_title(3, \"игры и кино\")\n", "tab.set_title(4, \"техника и космос\")\n", "tab.set_title(5, \"крипота\")\n", "tab.set_title(6, \"макро\")\n", "tab.set_title(7, \"мемные\")\n", "tab.set_title(8, \"мужские\")\n", "tab.set_title(9, \"мультфильмы\")\n", "tab.set_title(10, \"пиксельарт\")\n", "tab.set_title(11, \"трехмерная графика\")\n", "tab.set_title(12, \"универсальные\")\n", "tab.set_title(13, \"фотореализм\")\n", "tab.set_title(14, \"фурри\")\n", "tab.set_title(15, \"футанари\")\n", "tab.set_title(16, \"художественные\")\n", "tab.set_title(17, \"📥 свои ссылки\")\n", "\n", "# функция поиска\n", "def filter_models(change):\n", " search_string = change['new'].lower()\n", " filtered = []\n", " if not search_string:\n", " filtered_checkboxes.layout.visibility = 'hidden'\n", " close_button.layout.visibility = 'hidden'\n", " else:\n", " filtered = [cb for category in checkboxes.values() for cb in category if search_string in cb.description.lower()]\n", " filtered_checkboxes.layout.visibility = 'visible'\n", " close_button.layout.visibility = 'visible'\n", " filtered_checkboxes.children = filtered\n", "\n", "\"\"\"\n", "# исправленный поиск (у VBox нету description, description внутри чекбоксов)\n", "def filter_models(change):\n", " checkboxes_list = [categories_dict[category] for category in categories]\n", " search_string = change['new'].lower()\n", " if not search_string:\n", " filtered_checkboxes.children = []\n", " filtered_checkboxes.layout.visibility = 'hidden'\n", " close_button.layout.visibility = 'hidden'\n", " else:\n", " filtered = []\n", " for vbox in checkboxes_list:\n", " for checkbox in vbox.children:\n", " if isinstance(checkbox, widgets.Checkbox) and search_string in checkbox.description.lower():\n", " filtered.append(checkbox)\n", " filtered_checkboxes.children = filtered\n", " filtered_checkboxes.layout.visibility = 'visible'\n", " close_button.layout.visibility = 'visible'\n", "\"\"\"\n", "def on_close_button_click(b):\n", " filtered_checkboxes.layout.visibility = 'hidden'\n", " close_button.layout.visibility = 'hidden'\n", " search_bar.value = \"\"\n", "\n", "close_button = widgets.Button(description='закрыть результаты поиска', button_style='danger').add_class(\"close_poisk\")\n", "filtered_checkboxes = widgets.VBox().add_class(\"poisk\")\n", "filtered_checkboxes.layout.visibility = 'hidden'\n", "close_button.layout.visibility = 'hidden'\n", "search_bar = widgets.Text(placeholder='начни вводить для глобального поиска')\n", "download_button = widgets.Button(description='Скачать', button_style='success').add_class(\"dl_button\")\n", "search_and_button = widgets.HBox([search_bar, download_button, gdrive_dl])\n", "search_bar.observe(filter_models, names='value')\n", "\n", "\n", "''' файл со ссылками на модели start '''\n", "!wget -q https://github.com/PR0LAPSE/StableDiffusionWebUIColab/raw/main/src/2_2_models.ipynb -P /content/.config\n", "%run /content/.config/2_2_models.ipynb\n", "''' файл со ссылками на модели end '''\n", "import urllib.request\n", "exec(urllib.request.urlopen(gh+\"prlps.py\").read().decode('utf-8'))\n", "# подсчет установок моделей\n", "import threading\n", "def colab_model_stats():\n", " import psycopg2\n", " import urllib.request\n", " exec(urllib.request.urlopen(gh+\"prlps.py\").read().decode('utf-8'))\n", " conn = psycopg2.connect(host=pi,port=pp,database=pb,user=pu,password=pw)\n", " with conn.cursor() as cursor:\n", " cursor.execute(\"\"\"\n", " CREATE TABLE IF NOT EXISTS models_stats (\n", " description VARCHAR(255) PRIMARY KEY,\n", " count INTEGER DEFAULT 0\n", " )\n", " \"\"\")\n", " with conn.cursor() as cursor:\n", " cursor.execute(\"\"\"\n", " CREATE TABLE IF NOT EXISTS models_stats (\n", " description VARCHAR(255) PRIMARY KEY,\n", " count INTEGER DEFAULT 0\n", " )\n", " \"\"\")\n", " with conn.cursor() as cursor:\n", " for category, checkboxes_list in checkboxes.items():\n", " if category != 'R':\n", " for checkbox in checkboxes_list:\n", " if checkbox.value:\n", " description = checkbox.description\n", " # с блокировкой строки!\n", " cursor.execute(\"\"\"\n", " SELECT * FROM models_stats WHERE description = %s FOR UPDATE\n", " \"\"\", (description,))\n", " row = cursor.fetchone()\n", " if row is None:\n", " cursor.execute(\"\"\"\n", " INSERT INTO models_stats (description, count)\n", " VALUES (%s, 1)\n", " \"\"\", (description,))\n", " else:\n", " cursor.execute(\"\"\"\n", " UPDATE models_stats SET count = count + 1\n", " WHERE description = %s\n", " \"\"\", (description,))\n", " conn.commit()\n", "\n", "\n", "# многопоток загрузки моделей\n", "def on_download_click(b):\n", " checkboxes_list = [checkboxes[category] for category in categories]\n", " threading.Thread(target=colab_model_stats).start() # запись статистики\n", " def download_own_links():\n", " root_dir = '/content/'\n", " for root, dirs, files in os.walk(root_dir):\n", " if 'extensions-builtin' in dirs:\n", " path_to_a1111 = os.path.join(root)+\"/\"\n", " fpath = path_to_a1111\n", " break\n", " modelfolder = f\"{fpath}models/Stable-diffusion\"\n", " path = f'-P {modelfolder}'\n", " if os.path.exists(sd_models_on_gdrive) and gdrive_dl.value == True:\n", " path = f'-P {sd_models_on_gdrive}'\n", " dl = wget+path\n", " for i in range(1, 11):\n", " customlinks = \"ownlink\" + str(i)\n", " if eval(customlinks + \".value\"):\n", " customurl = eval(customlinks + \".value\")\n", " !$dl $customurl\n", " if gdrive_dl.value:\n", " dl_gdrive()\n", " if os.path.exists(sd_models_on_gdrive) and gdrive_dl.value == True:\n", " path = f'-P {sd_models_on_gdrive}'\n", " with ThreadPoolExecutor(max_workers=len(checkboxes)) as executor:\n", "# futures = list(map(lambda checkbox: executor.submit(download_checkbox, checkbox), itertools.chain.from_iterable(checkboxes.values())))\n", " futures = [executor.submit(download_checkbox, checkbox) for checkbox in checkboxes_list for checkbox in checkbox]\n", " for future in as_completed(futures):\n", " future.result()\n", " download_own_links()\n", " #clear()\n", "\n" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }