NotSoOff

NotSoOff

в сети: около 5 часов назад
Личные данные скрытына сайте с мая 2025 г.
Список аниме
57
338
30
Запланировано 163
Смотрю 11
Просмотрено 57
Отложено 164
Брошено 30
Список манги
5
108
7
Запланировано 34
Читаю 44
Прочитано 5
Отложено 30
Брошено 7
Активность:
3 недели и 4 дня
Время за аниме и мангой
1 неделя
1 месяц
3 месяца
6 месяцев
1 год
Активность на сайте
Друзья
Graf_NEET
Клубы
Не состоит ни в одном из клубов
Общие
Жанровые

Нет достижений.

Франшизы
0 / 285
Авторы
0 / 44

Нет достижений.

Обо мне
Приветствую.

Обо мне


Я - не фанат аниме. Просто зритель. Смотреть стал в апреле 2025 года.

Я буду говорить с точки зрения морали и учитывать её. На заметку.

Свои "вкусы" в аниме мне описать трудно (список просмотренного совсем небольшой), но если говорить в целом - я люблю истории с хорошим концом, истории с хорошими ГГ, любитель подобного.
Это относится не только к аниме, а и к сериалам, фильмам, литературе и подобному творчеству.
Не люблю грустные, нечестные концовки, концовки где плохие вещи/действия остаются безнаказанными. Можно сказать, я любитель позитива.

Хоть мне и не нравятся грустные концовки, но это не значит что весь тайтл должен быть наивным, нелогичным и позитивным (сеттинги бывают разные), это не значит что путь протагониста/ов должен быть лёгким, это не значит что мне нравятся "имба"- персонажи и глупые сюжеты.
Это не значит, что помимо сюжета и логики всё должно завершиться хорошо. Я понимаю, некоторые произведения просто задуманы такими.
Они несут в себе посыл, мысль, идею, нечто большее чем просто комедия или развлечение, заставляют задуматься. Однако, пока-что психологические темы и мрачные жанры я избегаю.



Не нравится

- Сюжеты аля "дружба, мир и жвачка".
- Гиперболизированный показ. Не нравится клишированное изображение эмоций персонажей в аниме ("кривляния", подпрыгивания, катание по полу, итп), не нравятся огромные эффекты с большим радиусом действия, не люблю этот дешёвый и бесполезный "гигантизм". Да и в целом, гиперболизацию не особо приветствую.
- "ГГ-тряпки" без характера, тупящие ГГ, ГГ-ОЯШи.
- Гаремы, где ГГ встречается сразу с несколькими персонажами, проявляет чувства сразу к нескольким. Выбери одну!



Нравится

- Когда видно развитие ГГ, как он меняет мышление, как он становится сильнее. Нравится, когда у персонажей есть прогресс. Не просто "вот ты такой, ты сильный", а что-то большее. Развитие и вкладываемые усилия.
- Продуманные сюжеты. Нравится, когда мир ощещается живым.
- Когда у истории есть нормальная завязка, где нам представляют главного героя, показывают какой он, чем жил.
- Погружаться в истории и проникаться их атмосферой, деталями. Мне очень не нравится когда это рушится.
Я люблю обдумывать то, что смотрю.



Из нравящихся жанров могу выделить научную фантастику.

Пожанрово, как на Шикимори: Драма, Приключения, Романтика (буду честен сам с собой), Фантастика, Фэнтези, Экшен.
Из тем: Городское Фэнтези, Исэкай, Космос, Меха.

Из не нравящихся жанров могу отдельно отметить Комедию.
Лично я - не любитель комедий. У меня есть своё понятие "меры" и того, насколько серьёзным и логичным я хочу видеть происходящее на экране, насколько далеко по моему мнению могут зайти авторы.
Комедии я смотреть могу, но далеко не все.

Конечно, это не полный список всего, что мне нравится, а лишь часть.
Да, возможно, некоторые просмотренные/прочитанные мною тайтлы могут и не попадать под мои критерии, но это будет скорее исключением, чем правилом.

Серии я не пропускаю, не люблю так делать.

12 серий - мало, 20 серий - много. Хотите показать насыщенную историю - метьте между этими рамками. Если есть заявка на топ сезона - 20-24 серии. Но, всё что после 18 и особенно 20 серии должны прям заинтересовать, иначе кол-во серий просто оттолкнёт зрителя.

Многие брошенные аниме тайтлы там, потому-что мне становится стыдно при их просмотре от происходящего на экране.
Многие брошенные не аниме тайтлы могут быть там потому-что мне не понравилась рисовка лиц. Не могу читать произведение, в котором лица персонажей выглядят уродливо. В основном это касается китайских манхв.

Я не претендую на абсолютно непредвзятое мнение.

В общем, приятно познакомится, читатель!





Система оценивания:
Высокая оценка (положительный отзыв)
10 - Шедевр
9 - Отличное аниме, которое можно пересматривать с удовольствием по несколько раз
8 - 8.5 - Хорошее произведение, способное удивить, имеет несколько мелких огрехов
7 - 7.5 - Приятная добротная картина, где плюсов больше, чем минусов

Средняя оценка (нейтральный отзыв)
6.5 - Любопытное произведение, слегка не дотянуло до высокой оценки. Скорее да, чем нет
6 - Обычный середнячок на один раз

Низкая оценка (отрицательный отзыв)
5 - Проходняк. Больше не понравилось, чем понравилось
4 - Мусор. Лучше обходить стороной. Ничего интересного
3 - Несмотрибельный шлак, вызывающий душевную боль при просмотре
1 - 2 балла тайтлам не ставлю, кроме клипов, помойных спешлов и прочего мусора.

Автор @Ergenty



Сохранённое


Коллекции

Аниме в 4K UHD 2160p
/collections/16288-anime-v-4k-uhd-2160p

Разум вне плоти. Андроиды, ИИ.
/collections/19047-razum-vne-ploti-androidy-ii

500 самых популярных аниме на Шикимори
/collections/3981-500-samyh-populyarnyh-anime-na-shikimori

Главный герой в аниме не тряпка
/collections/442-glavnyy-geroy-v-anime-ne-tryapka

Аниме про управление государством
/collections/7546-anime-pro-upravlenie-gosudarstvom

Технофэнтези
/collections/12266-tehnofentezi

Chuunime\Чуниме
/collections/14980-chuunime-chunime

Романтика для юношей/мужчин
/collections/18781-romantika-dlya-yunoshey-muzhchin

Цифровая манга
/collections/7084-tsifrovaya-manga

Романтика вторым жанром
/collections/672-romantika-vtorym-zhanrom

Истинные гаремные аниме (?!)
/forum/collections/collection-20769-istinnye-garemnye-anime/607116-obsuzhdenie-kollektsii

Незаконченные аниме
/collections/3947-nezakonchennye-anime

Романтика по жанрам [ОБНОВЛЕНО ОТ 20.07.23]
/collections/2207-romantika-po-zhanram-obnovleno-ot-20-07-23

Концовки гаремников (?!)
/collections/1424-kontsovki-garemnikov

Аниме, в котором ГГ ИМБА
/collections/12294-anime-v-kotorom-gg-imba

Триггеры (персонажи, впадающие в неадекватное состояние из-за слова или любого другого нетипичного раздражителя)
/forum/collections/collection-9371-triggery-personazhi-vpadayuschie-v-neadekvatnoe-sostoyanie-iz-za-slova-ili-lyubogo-drugogo-netipichnogo-razdrazhitelya

Первоисточник: Книга (не комикс); (коллекция заброшена 26 июля 2020 года)
/collections/100-pervoistochnik-kniga-ne-komiks

Постапокалипсис в аниме (18 марта 2019)
/collections/126-postapokalipsis-v-anime

Специфическое
Аниме о Второй мировой (Понятия не имею, зачем это добавил сюда)
/collections/350-anime-o-vtoroy-mirovoy

Плохие аниме адаптации (для сверки, если вообще вспомню про такую коллекцию)
/collections/11433-plohie-anime-adaptatsii

Самые продаваемые онгоинг манги
/collections/15008-samye-prodavaemye-ongoing-mangi

Советское и российское оружие в аниме
/collections/18456-sovetskoe-i-rossiyskoe-oruzhie-v-anime

Девушки и оружие
/collections/2813-devushki-i-oruzhie

Клубы


Собрание коллекций SHIKIMORI
/clubs/2046-sobranie-kollektsiy-shikimori

TOP 250 ANIME
/clubs/202-top-250-anime

Клуб обсуждения манги и ранобэ
/clubs/2977-klub-obsuzhdeniya-mangi-i-ranobe

Специфическое
Girls with red and crimson Hair
/clubs/2707-girls-with-red-and-crimson-hair

Манга ивент им. Мацумото Дзиро (активное комьюнити в Discord, каждое воскресенье обсуждение манги 20.10.2025)
/clubs/4292-manga-ivent-im-matsumoto-dziro

Отсутствующие на Шикимори


Template
Название
Тип: ?
где?
Alt name
Прогресс: ?
Оценка: ?
Комментарий
?

С твоим-то лицом, и есть кто нравится?
Тип: Манхва
где?
You Like Someone With That Face?
Прогресс: 12 глава
Оценка: 5
Комментарий
Отчасти, конечно, утверждение о том, что красота субъективна - это правда.
Но я считаю, что правда в том, что само это выражение субъективно.
Как бы то ни было, в обществе всё равно есть какой-то установленный стандарт красоты. И дело не в том, что он просто навязывается, а в том, что определённая форма лица, носа, глаз, гладкость кожи и подобное нравится людям. Так уж мы устроены. Определённое лицо (и тело в том числе) для нас красиво. Несомненно, есть исключения из правил и определённая градация, но в какой-то мере такие стандарты всё равно существуют. Исключения из правил всегда есть (и во всём), но это не значит, что внезапно человек с красивыми пропорциями и формой лица вдруг станет обычным для остальных.
Наличие предпочтений и вкусов у каждого человека не означает, что какой-то общепризнанной нормы нет.

Поэтому, я считаю что это выражение в большинстве случаев неверно. Если говорить от себя то конечно можно сказать - мне это лицо не нравится, но уж точно не говоря от лица всех в духе "да нет, на самом деле довольно обычное лицо". В большинстве случаев человек будет неправ, ведь большинство наоборот считает этого человека красивым. Так что зачем говорить за всех?

Если говорить про произведение то тут философские размышления на тему издевательства над некрасивыми (в Корее вроде как особенно), и что они просто "не могут" любить красивых. Я считаю это неправильно, как бы плохи ни были ваши там дела. Такое утверждение - вздор, не более.
ГГ здесь якобы "умный" и продумывает намерения других и их вопросы как в шахматах, на несколько ходов вперёд. На деле большинство его действий просто выглядят как надумывание лишнего, но прочитать из интереса всё же можно.

Но спустя где-то глав 12 интерес уже пропал. Автор сделал из ГГ параноика, у которого "пластинку заело". Буквально. Всему надо знать меру.

Оценка: 5. Брошено.
Легендарный механик
Тип: Манхва
где?
The legendary mechanic
Прогресс: ~3 главы
Оценка: 4
Комментарий
Мусор. Клишированно, глупо, рисовка просто отвратительная.
Сразу как начинаешь читать понимаешь что читаешь низкосортный конвеерник, который выглядит просто ужасно.

Несмотря на это, на ReManga у тайтла очень высокий балл и он держится в топе.
Если автор не в состоянии в самом начале заинтересовать меня, то чего стоит это произведение?

Оправдание "это произведение для начинающих" так вообще смех. Не надо такое рекомендовать как "лёгкий старт". Посоветуйте лучше достойные произведения, раз спрашивают с чего начать.

Оценка: 4.

#буээ
Мой линкор можно улучшить
Тип: Маньхуа
где?
My Battleship Can Be Upgraded
Wo De Zhanjian Neng Shengji
Прогресс: 1 глава
Оценка: 4
Комментарий
Низкосортный мусор с, как я понял, тянущейся "романтикой"... Тоесть романтики нет.

Качество рисовки низкое, за 5 страниц 1 главы герой уже вернулся во времени и делает отжимания стараясь накачать тело. Многое говорит о тайтле.

Оценка: 4.

#буээ

4
5
6

7
8
9

Всякие полезности (наверно)

Знали ли вы, что на кнопку добавления тайтла в списке можно нажать, чтобы открылась панель редактирования комментария к тайтлу?
Я вот не знал, и, каждый раз, чтобы редактировать текст к тайтлу в списке, заходил в сам список!
Просто нажмите на кнопку добавления под постером.

Кастомный CSS
Мелкие штучки для сайта

Можно сказать, этот .rate-text блок обязателен к использованию.
Понятия не имею, почему это не используется на Шикимори по дефолту. Если по неосторожности написать слишком большую строку в списке аниме и сохранить, то она *перетечёт* за экран и сломает остальные контейнеры с текстом.
Комично то, что из-за расширения контейнера за границы экрана, кнопка Сохранить, которая нужна, чтобы убрать длинный текст, не видна, и приходится лазить в консоль, чтобы уменьшить елемент и сохранить нормальный текст.
Если с Вами такое случилось, тащите div class="rate-text" в консоль и прописывайте что-то по типу
				document.querySelector(".rate-text").style.width = "400px";
			
или
				document.querySelectorAll(".rate-text").style.width = "400px";
			
Есть вероятность, что это поможет...

				.rate-text {
				word-break: break-word; /* старый тег, для совместимости */
				overflow-wrap: anywhere; /* новый тег */
				}
			

Тоже самое, но для окна редактирования комментария к тайтлу в списке (на странице аниме/манги повторно нажмите на кнопку добавления тайтла в список)

				.note {
					overflow-wrap: anywhere;
				}
			



				/* Окно для текста в списке аниме/манги кастомной высоты */
				.b-input textarea {
				min-height: 400px !important;
				}

				/* Для "включения" чекбоксов на моей теме сайта (у меня кастомные не грузятся) */
				html body form.b-form .checkbox input[type="checkbox"] {
				width: 13px !important;
				height: 13px !important;
				opacity: 1 !important;
				position: static !important;
				margin-left: 0 !important;
				}
			



Три вертикальных арта с закруглёнными краями

				/* Главный контейнер */
				#profiles_show .art-container {
				  display: flex;
				  gap: 15px;     /* Расстояние между картинками */
				  margin-bottom: 15px; /* Отступ внизу */
				}
				
				#profiles_show .art-column {
				  flex: 1; /* Каждая колонка будет занимать равное кол-во места */
				  min-width: 0;
				}
				
				#profiles_show .art-showcase {
				  height: 700px; /* Высота арта */
				  width: 100%; /* Ширина арта */
				  background-size: cover;
				  background-position: center;
				  border-radius: 15px; /* Закругление углов */
				  transition: transform 0.3s ease;
				}
				
				/* Больше артов - копируйте и увеличивайте число (напр. art3 -> art4) */
				
				#profiles_show .art-1 {
				  background-image: url();
				}
				
				#profiles_show .art-2 {
				  background-image: url();
				}
				
				#profiles_show .art-3 {
				  background-image: url();
				}
			

BB-Code. Копировать себе в профиль (Настройки - Профиль)

				[div=art-container]
					[div=art-column]
						[div=art-showcase art-1][/div]
					[/div]
				
					[div=art-column]
						[div=art-showcase art-2][/div]
					[/div]
				
					[div=art-column]
						[div=art-showcase art-3][/div]
					[/div]
				[/div]
			

bb_code
				[div=collapsed d-inline-flex p-1 m-0]
					Flex-контейнер
				[/div]
			

Скрипты
Счётчик букв и слов
Пока-что вылаживать на хостинг не буду. Скрипт добавляет счётчик букв и слов в поля для ввода. Немного протестив не заметил серьёзных проблем для производительности.
Есть небольшая кастомизация вида кнопки с откатом на дефолтные значения. Будет брать стили Edesign и shiki-theme.

Init: ~30.08.2025
v0.2 - 14.09.2025

Зайдите в Tampermonkey (или подобное расширение), и добавьте это:
					// ==UserScript==
					// @name         SCaWC
					// @namespace    http://tampermonkey.net/
					// @version      0.2
					// @description  Shikimori Character and Words Counter. Adds per-editor character and word counters to Shikimori editors (anime list + comments) and prevents overflow from long strings.
					// @author       NotSoOff
					// @match        https://shikimori.one/*
					// @grant        none
					// ==/UserScript==
					(function () {
						'use strict';

						// Simple word counting function
						function countWords(text) {
							if (!text || text.trim() === '') return 0;
							return text.trim().split(/\s+/).length;
						}

						function createCounter(container) {
							const counter = document.createElement("div");
							Object.assign(counter.style, {
								position: "absolute",
								bottom: "4px",
								right: "8px",
								background: "transparent",
								color: "rgb(var(--color-text-hint, var(--light-color, 128, 128, 128)))",
								padding: "2px 6px",
								borderRadius: "4px",
								fontSize: "11px",
								fontFamily: "monospace",
								pointerEvents: "none"
							});
							counter.textContent = "0c • 0w";

							// Ensure parent is positioned
							const style = window.getComputedStyle(container);
							if (style.position === "static") {
								container.style.position = "relative";
							}
							container.appendChild(counter);
							return counter;
						}

						function updateCounter(counter, text) {
							const chars = text.length;
							const words = countWords(text);
							counter.textContent = `${chars}c • ${words}w`;
						}

						function handleTextarea(area) {
							if (area.dataset.charCounterAttached) return;
							area.dataset.charCounterAttached = "true";
							// Prevent overflow from long unbroken strings
							area.style.whiteSpace = "pre-wrap";
							area.style.wordBreak = "break-word";
							const container = area.closest(".b-input") || area.parentElement;
							const counter = createCounter(container);
							function refresh() {
								updateCounter(counter, area.value);
							}
							["input", "keyup", "paste", "cut"].forEach(evt =>
								area.addEventListener(evt, refresh)
							);
							refresh();
						}

						function handleProseMirror(editor) {
							if (editor.dataset.charCounterAttached) return;
							editor.dataset.charCounterAttached = "true";
							// Prevent overflow from long unbroken strings
							editor.style.whiteSpace = "pre-wrap";
							editor.style.wordBreak = "break-word";
							const container = editor.closest(".editor-container") || editor.parentElement;
							const counter = createCounter(container);
							function getText() {
								let text = editor.innerText || "";
								text = text.trim();
								if (text === "" || text === "\n") return "";
								return text;
							}
							function refresh() {
								updateCounter(counter, getText());
							}
							["input", "keyup", "paste", "cut"].forEach(evt =>
								editor.addEventListener(evt, refresh)
							);
							refresh();
						}

						function observeInputs() {
							document.querySelectorAll("textarea.text.optional, textarea#reason").forEach(handleTextarea);
							document.querySelectorAll(".ProseMirror").forEach(handleProseMirror);
						}

						observeInputs();
						const observer = new MutationObserver(() => observeInputs());
						observer.observe(document.body, { childList: true, subtree: true });
					})();
				
Различная статистика
Изначально, скрипт /Chortowod, но с течением времени он устарел, а у меня и вовсе частично перестал работать.

Init: 05.11.2025

Что он умеет:

- Показ истории просмотра (личной)
- Показ рейтинга эпизодов
- Показ статистики в хронологии тайтлов
- Показ средней оценки пользователей на Шикимори
- Показ средней оценки друзей на Шикимори

					// ==UserScript==
					// @name         Shikimori Various Statistic (FIX)
					// @namespace    http://shikimori.one/
					// @version      2.0.0
					// @description  Adds new statistics in various places (viewing history, episode lists, chronology stats, etc.) using modern JavaScript. Revised version of Chortowod's outdated script. (https://openuserjs.org/users/Chortowod)
					// @author       NotSoOff
					// @match        *://shikimori.org/*
					// @match        *://shikimori.one/*
					// @match        *://shikimori.me/*
					// @icon         https://www.google.com/s2/favicons?domain=shikimori.me&sz=64
					// @license      MIT
					// @connect      api.jikan.moe
					// @connect      shikimori.one
					// @copyright    2025, NotSoOff (https://shikimori.one/NotSoOff)
					// @require      https://gist.githubusercontent.com/Chortowod/814b010c68fc97e5f900df47bf79059c/raw/chtw_settings.js?v1
					// @grant        GM_xmlhttpRequest
					// @grant        GM_addStyle
					// ==/UserScript==

					(function() {
						'use strict';

						const SCRIPT_NAME = 'Shikimori Various Statistic';
						const siteName = "https://shikimori.one";
						const settings = new ChtwSettings('chtwVarStat', '<a target="_blank" href="https://shikimori.one/NotSoOff">Разная статистика</a>');
						let config = { debug: true };

						// --- Logging ---
						const log = (...args) => { if (config.debug) console.log(`[${SCRIPT_NAME}]`, ...args); };
						const error = (...args) => console.error(`[${SCRIPT_NAME}]`, ...args);
						const warn = (...args) => console.warn(`[${SCRIPT_NAME}]`, ...args);

						// --- Initialization ---
						function initSettings() {
							settings.createOption('history', 'История просмотра тайтла', true);
							settings.createOption('avTitleFr', 'Средн. оценка тайтла друзей', true);
							settings.createOption('avTitle', 'Средн. оценка тайтла', true);
							settings.createOption('avProfileFr', 'Средняя оценка друга', true);
							settings.createOption('allProfileFr', 'Всего тайтлов друга', true);
							settings.createOption('showEpisodes', 'Показать список эпизодов', true);
							settings.createOption('historyDateWidth', 'Ширина блока с датой эпизода (px)', '115', 'number');
							settings.createOption('epWrapBackground', 'Цвет блока с рейтингом эпизодов', '#0000', 'color');
							settings.createOption('epWrapPadding', 'Отступ слева у блока с рейтингом эпизодов', false);
							settings.createOption('isDebug', 'Режим отладки', false);
							config.debug = settings.getOption('isDebug');
							console.log(`[${SCRIPT_NAME}] Initialized. Debug mode is ${config.debug ? 'ON' : 'OFF'}.`);
						}

						function initStyle() {
							const dateWidth = settings.getOption('historyDateWidth') || 115;
							const epWrapBackground = settings.getOption('epWrapBackground') || '#0000';
							const epWrapPadding = settings.getOption('epWrapPadding') ? '10' : '0';
							GM_addStyle(`
								.chtw-ep-wrap { display: flex; gap: 10px; align-items: center; }
								.chtw-ep-number, .chtw-ep-score { width: 40px; text-align: center; flex-shrink: 0; }
								.chtwEpisodesDateWatchedWrapper .chtw-watched-body, .chtwEpisodesDateWatchedWrapper .chtw-watched-detail-content { padding-left: ${epWrapPadding}px; background: ${epWrapBackground}; }
								.chtw-ep-date { width: ${dateWidth}px; flex-shrink: 0; }
								.chtw-ep-title { flex-grow: 1; }
								.chtw-ep-filler { color: #7e7e7e; } .chtw-ep-recap { color: #663a02; } .chtw-ep-great { color: #00d600; }
								.chtw-ep-epic { color: #00d600; font-weight: bold; } .chtw-ep-good { color: #86d600; } .chtw-ep-bad { color: #e81c00; }
								.chtw-watched-item { display: flex; justify-content: space-between; }
								.chtw-watched-detail-content { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 0.3s ease-out; }
								.chtw-watched-detail-content.expanded { grid-template-rows: 1fr; }
								.chtw-watched-detail-content > div { overflow: hidden; }
								.chtw-watched-detail-content .chtw-watched-item { flex-direction: column; align-items: center; border-bottom: 1px solid #7f7f7f38; text-align: center; padding: 5px 0; }
								.chtw-watched-detail-content .chtw-watched-item:last-child { border: none; }
								#chtwWatchedButtonShowAll, #chtwEpisodesWatchedButtonShowAll { color: var(--link-color); text-align: center; width: 100%; cursor: pointer; background: none; border: none; padding: 10px 0 5px; }
								#chtwWatchedButtonShowAll:hover, #chtwEpisodesWatchedButtonShowAll:hover { color: var(--link-hover-color); }
								.chtw-watched-detail-header { text-align: center; font-weight: bold; margin: 10px 0 8px; display: flex; justify-content: center; align-items: center; }
								.chtw-watched-detail-header::before, .chtw-watched-detail-header::after { content: ""; display: block; height: 2px; min-width: 50%; }
								.chtw-watched-detail-header::before { background: linear-gradient(to right, transparent, #7b8084); }
								.chtw-watched-detail-header::after { background: linear-gradient(to left, transparent, #7b8084); }
								#chtwEpisodesShowMoreButton { background: #1c1c1c; padding: 2px 10px; border-radius: 5px; cursor: pointer; border: none; color: white; margin-top: 10px; }
								#chtwEpisodesShowMoreButton:hover { background: #3b3b3b; }
								@media screen and (max-width: 768px) { .chtw-ep-title { width: 40%; } .chtw-ep-wrap { gap: 5px; } }
							`);
						}

						// --- Utilities ---
						const getLocale = () => document.body.dataset.locale;
						const formatDate = (dateString) => new Date(dateString).toLocaleDateString(getLocale() === 'ru' ? 'ru-RU' : 'en-GB', { year: 'numeric', month: 'long', day: 'numeric' });
						const formatTime = (minutes) => {
							if (!minutes) return '---';
							const hours = minutes / 60;
							if (hours > 24) {
								const days = hours / 24;
								return days > 30 ? `${(days / 30).toFixed(2)} месяцев` : `${days.toFixed(2)} дней`;
							}
							return `${hours.toFixed(2)} часов`;
						};

						// --- Feature: Chronology Statistics ---
						function calculateTime(animes) {
							const stat = { minutesToWatch: 0, minutesWatched: 0, minutesWatching: 0, overall: animes.length, toWatch: [], watched: [], watching: [], notInStat: [] };
							animes.forEach(anime => {
								const episodes = anime.episodes || anime.episodesAired;
								if (!anime.duration || !episodes) {
									stat.notInStat.push(anime);
								} else {
									const totalMinutes = anime.duration * episodes;
									if (anime.status === 'completed') { stat.minutesWatched += totalMinutes; stat.watched.push(anime); }
									else if (anime.status === 'watching') { stat.minutesWatching += totalMinutes; stat.watching.push(anime); }
									else { stat.minutesToWatch += totalMinutes; stat.toWatch.push(anime); }
								}
							});
							stat.minutesOverall = stat.minutesWatched + stat.minutesToWatch + stat.minutesWatching;
							return stat;
						}

						function appendChronologyStat(stat) {
							const notInStatString = stat.notInStat.map(anime => `<p><a class="b-link bubbled-processed" style="text-decoration: none;" href="/animes/${anime.id}">${anime.russian || anime.name}</a></p>`).join('');
							const parentElement = document.querySelector('.b-animes-menu');
							if (!parentElement) { warn("Could not find '.b-animes-menu' to inject chronology stats."); return; }
							const newStatElement = document.createElement('div');
							newStatElement.className = 'block chtw-chronology-stats';
							newStatElement.innerHTML = `
								<div class="subheadline m8">Статистика</div>
								<div><b>Всего времени</b>: ${formatTime(stat.minutesOverall)} (${stat.overall} шт.)</div>
								<div><b>Просмотрено</b>: ${formatTime(stat.minutesWatched)} (${stat.watched.length} шт.)</div>
								<div><b>Смотрю</b>: ${formatTime(stat.minutesWatching)} (${stat.watching.length} шт.)</div>
								<div><b>Осталось</b>: ${formatTime(stat.minutesToWatch)} (${stat.toWatch.length} шт.)</div>
								<div><b>Не учтено</b> (${stat.notInStat.length} шт.):</div>
								<details style="cursor: pointer"><summary style="color:var(--link-color)">Показать/скрыть</summary>${notInStatString}</details>`;
							parentElement.prepend(newStatElement);
							log("Chronology stats appended.");
						}

						async function showChronologyStat() {
							if (!settings.getOption('showEpisodes') || !document.body.classList.contains('p-animes-chronology') || document.querySelector('.chtw-chronology-stats')) return;
							log("Running Chronology Stats");
							const animeNodes = document.querySelectorAll(".b-db_entry-variant-list_item");
							if (animeNodes.length === 0) return;
							const animeIDs = Array.from(animeNodes, item => item.dataset.id);
							const animesData = [];
							try {
								for (let i = 0; i < animeIDs.length; i += 50) {
									const batchIDs = animeIDs.slice(i, i + 50);
									const response = await fetch(`${siteName}/api/graphql`, {
										method: 'POST',
										headers: { "Content-Type": "application/json" },
										body: JSON.stringify({ query: `{ animes(limit: 50, ids: "${batchIDs.join(',')}") { id name russian duration episodes episodesAired } }` })
									});
									if (!response.ok) throw new Error(`GraphQL fetch failed with status ${response.status}`);
									const result = await response.json();
									if (result.data?.animes) animesData.push(...result.data.animes);
								}
								log(`Fetched ${animesData.length} of ${animeIDs.length} animes for chronology.`);
								animesData.forEach(anime => {
									const statusInput = document.querySelector(`.b-db_entry-variant-list_item[data-id="${anime.id}"] .b-user_rate input[name="user_rate[status]"]`);
									anime.status = statusInput ? statusInput.value : 'planned';
								});
								const stat = calculateTime(animesData);
								log("Calculated Chronology Stats:", stat);
								appendChronologyStat(stat);
							} catch (e) {
								error("Failed to fetch or process chronology stats:", e);
							}
						}

						// --- Feature: Watch History ---
						async function showWatchHistory() {
							if (!settings.getOption('history') || document.getElementById('chtwDateWatchedWrapper')) return;

							const path = window.location.pathname;
							const pathRegex = /\/(?:animes|mangas|ranobe)\/(\d+)/;
							const match = path.match(pathRegex);

							// Get ID from URL
							const targetId = match ? match[1] : null;
							let userId = null;

							// Get ID from "data" atribute in <body>
							try {
								const userDataString = document.body.dataset.user;
								if (userDataString) {
									userId = JSON.parse(userDataString).id;
								}
							} catch (e) {
								error("Could not parse user data from body attribute:", e);
							}

							// Check after getting ID
							if (!targetId || !userId) {
								warn("Could not determine targetId from URL or userId from body.", { targetId, userId });
								return;
							}

							log("Running Watch History for targetId:", targetId, "and userId:", userId);

							try {
								const targetType = path.startsWith('/animes/') ? 'Anime' : 'Manga';
								const url = `${siteName}/api/users/${userId}/history?target_id=${targetId}&limit=100&target_type=${targetType}`;
								const response = await fetch(url);
								if (!response.ok) throw new Error(`History fetch failed with status ${response.status}`);
								const data = await response.json();
								log(`Fetched ${data.length} history entries.`);
								if (data.length === 0) return;

								const parentBlock = document.querySelector('.b-animes-menu');
								if (!parentBlock) {
									warn("Could not find '.b-animes-menu' to inject history block.");
									return;
								}

								const isRu = getLocale() === 'ru';
								const completedEntries = data.filter(e => e.description.includes(isRu ? 'Просмотрено' : 'Completed') || e.description.includes(isRu ? 'Прочитано' : 'Completed')).reverse();
								const historyBlock = document.createElement('div');
								historyBlock.id = 'chtwDateWatchedWrapper';
								historyBlock.className = "block";
								historyBlock.style.fontSize = '12px';
								historyBlock.innerHTML = `
									<div class="subheadline">${isRu ? 'История' : 'History'}</div>
									<div class="chtw-watched-body"></div>
									<div class="chtw-watched-detail-content"><div><div class="chtw-watched-detail-header"></div></div></div>
									<button type="button" id="chtwWatchedButtonShowAll">${isRu ? 'показать/скрыть подробнее' : 'show/hide details'}</button>`;

								const body = historyBlock.querySelector('.chtw-watched-body');
								completedEntries.forEach((entry, index) => {
									const text = isRu ? (entry.target.url.startsWith('/anime') ? 'Просмотрено' : 'Прочитано') : 'Completed';
									body.innerHTML += `<div class="chtw-watched-item"><div>${text} #${index + 1}:</div><div>${formatDate(entry.created_at)}</div></div>`;
								});

								const detail = historyBlock.querySelector('.chtw-watched-detail-content > div');
								data.forEach(entry => {
									detail.innerHTML += `<div class="chtw-watched-item"><div>${formatDate(entry.created_at)}</div><div>${entry.description}</div></div>`;
								});

								parentBlock.prepend(historyBlock);
								log("History block appended successfully.");
								historyBlock.querySelector('#chtwWatchedButtonShowAll').addEventListener('click', e => e.currentTarget.previousElementSibling.classList.toggle('expanded'));
							} catch (e) {
								error("Failed to fetch or display watch history:", e);
							}
						}

						// --- Feature: Episodes List ---
						function createNewEpisodeEntry(episodeData) {
							const score = episodeData.score || '???', dateStr = episodeData.aired ? formatDate(episodeData.aired) : 'N/A', title = episodeData.title || 'N/A';
							const entry = document.createElement('div');
							entry.className = "chtw-ep-wrap";
							let colorClass = '';
							if (episodeData.filler) colorClass = "chtw-ep-filler"; else if (episodeData.recap) colorClass = "chtw-ep-recap";
							else if (episodeData.score >= 4.9) colorClass = "chtw-ep-epic"; else if (episodeData.score > 4.8) colorClass = "chtw-ep-great";
							else if (episodeData.score > 4.6) colorClass = "chtw-ep-good"; else if (episodeData.score < 4) colorClass = "chtw-ep-bad";
							if (colorClass) entry.classList.add(colorClass);
							entry.innerHTML = `<span class="chtw-ep-number">#${episodeData.mal_id}</span><span class="chtw-ep-title">${title}</span><span class="chtw-ep-date">${dateStr}</span><span class="chtw-ep-score">${score}</span>`;
							return entry;
						}

						function getAndAppendBatchEpisodes(animeID, page = 1) {
							log(`Fetching episodes for ${animeID}, page ${page}`);
							const container = document.getElementById('chtwEpisodesDateWatchedWrapper');
							if (!container) return;
							GM_xmlhttpRequest({
								method: "GET", url: `https://api.jikan.moe/v4/anime/${animeID}/episodes?page=${page}`,
								onload: function(response) {
									if (response.status < 200 || response.status >= 300) { error(`Jikan API request failed with status ${response.status}`); return; }
									const respData = JSON.parse(response.responseText);
									if (!respData.data || respData.data.length === 0) {
										log('No more episodes found.');
										document.getElementById('chtwEpisodesShowMoreButton')?.remove();
										return;
									}
									const { data: episodesData, pagination } = respData;
									const detailContent = container.querySelector('.chtw-watched-detail-content > div');
									episodesData.forEach(ep => detailContent.append(createNewEpisodeEntry(ep)));
									let moreButton = document.getElementById('chtwEpisodesShowMoreButton');
									if (pagination.has_next_page) {
										if (!moreButton) {
											moreButton = document.createElement('button');
											moreButton.id = 'chtwEpisodesShowMoreButton'; moreButton.type = 'button';
											detailContent.append(moreButton);
										}
										moreButton.textContent = getLocale() === 'ru' ? 'подгрузить ещё' : 'load more';
										moreButton.onclick = () => getAndAppendBatchEpisodes(animeID, page + 1);
									} else { moreButton?.remove(); }
								},
								onerror: err => error("Jikan API request failed:", err)
							});
						}

						function showEpisodesRating() {
							if (!settings.getOption('showEpisodes') || document.getElementById('chtwEpisodesDateWatchedWrapper')) return;
							if (!window.location.pathname.startsWith('/animes/')) return;
							const path = window.location.pathname;
							const match = path.match(/\/animes\/(\d+)/);
							const targetId = match ? match[1] : null;
							if (!targetId) return;
							log("Running Episodes Rating for targetId:", targetId);
							const isRu = getLocale() === 'ru';
							const episodesBlock = document.createElement('div');
							episodesBlock.id = 'chtwEpisodesDateWatchedWrapper';
							episodesBlock.className = "block";
							episodesBlock.style.fontSize = '12px';
							episodesBlock.innerHTML = `
								<div class="subheadline">${isRu ? 'Эпизоды' : 'Episodes'}</div>
								<div class.chtw-watched-body" style="font-weight: bold;">
									<div class="chtw-ep-wrap">
										<span class="chtw-ep-number">Эп.</span><span class="chtw-ep-title">Название</span><span class="chtw-ep-date">Дата</span><span class="chtw-ep-score">Оценка</span>
									</div>
								</div>
								<div class="chtw-watched-detail-content"><div></div></div>
								<button type="button" id="chtwEpisodesWatchedButtonShowAll">${isRu ? 'показать/скрыть все' : 'show/hide all'}</button>`;
							document.querySelector(".b-db_entry")?.insertAdjacentElement('afterend', episodesBlock);
							episodesBlock.querySelector('#chtwEpisodesWatchedButtonShowAll').addEventListener('click', e => e.currentTarget.previousElementSibling.classList.toggle('expanded'));
							getAndAppendBatchEpisodes(targetId, 1);
						}

						// --- Feature: Average Ratings & Totals ---
						function calculateAverageScore(scoreData) {
							let sumScore = 0, totalCount = 0;
							scoreData.forEach(item => {
								const score = item.name ?? item[0], count = item.value ?? item[1];
								sumScore += parseInt(count) * parseInt(score); totalCount += parseInt(count);
							});
							return totalCount > 0 ? (sumScore / totalCount).toFixed(2) : 'N/A';
						}

						function calculateAllTitles(scoreData) {
							return scoreData.reduce((sum, item) => sum + parseInt(item.value), 0);
						}

						function calculateAverageFriendsRating() {
							const friendRates = document.querySelectorAll("div[class*=friend-rate] div.status");
							let sum = 0, count = 0;
							friendRates.forEach(rate => {
								const score = parseInt(rate.textContent.replace(/[^-0-9]/g, ''), 10);
								if (!isNaN(score)) { sum += score; count++; }
							});
							const result = count > 0 ? sum / count : 0;
							return result ? result.toFixed(2).replace('.00', '') : false;
						}

						function appendAverageFriendsRating() {
							if (!settings.getOption('avTitleFr')) return;
							const element = document.querySelector(".block > .friend-rate");
							if (!element) return;
							const avg = calculateAverageFriendsRating();
							if (avg && element.previousElementSibling) {
								log("Updating Average Friends Rating.");
								element.previousElementSibling.textContent = `${getLocale() === 'ru' ? 'У друзей' : 'Friends'} (средняя: ${avg})`;
							}
						}

						function appendAverageRating() {
							if (!settings.getOption('avProfileFr')) return;
							const element = document.querySelector(".p-user_rates.p-profiles .mini-charts > .scores > #scores");
							if (!element) return;
							const stats = JSON.parse(element.dataset.stats || '[]');
							if (stats.length === 0) return;
							const avg = calculateAverageScore(stats);
							const headline = element.closest('.scores')?.querySelector('div.subheadline');
							if (avg !== 'N/A' && headline) {
								log("Updating Average Profile Rating.");
								headline.textContent = `${getLocale() === 'ru' ? 'Оценки' : 'Scores'} (средняя: ${avg})`;
							}
						}

						function appendAverageTitleRating() {
							if (!settings.getOption('avTitle')) return;
							const element = document.querySelector("#rates_scores_stats");
							if (!element) return;
							const stats = JSON.parse(element.dataset.stats || '[]');
							if (stats.length === 0) return;
							const avg = calculateAverageScore(stats);
							if (avg !== 'N/A' && element.previousElementSibling) {
								log("Updating Average Title Rating.");
								element.previousElementSibling.textContent = `${getLocale() === 'ru' ? 'Оценки' : 'Scores'} (средняя: ${avg})`;
							}
						}

						function appendOverallTitles() {
							if (!settings.getOption('allProfileFr')) return;
							const element = document.querySelector(".p-user_rates.p-profiles .mini-charts > .types > #types");
							if (!element) return;
							const stats = JSON.parse(element.dataset.stats || '[]');
							if (stats.length === 0) return;
							const total = calculateAllTitles(stats);
							const headline = element.closest('.types')?.querySelector('div.subheadline');
							if (total && headline) {
								log("Updating Overall Profile Titles count.");
								headline.textContent = `${getLocale() === 'ru' ? 'Типы' : 'Kinds'} (всего: ${total})`;
							}
						}

						// --- Main Execution Logic ---
						function runAllFeatures() {
							initSettings();
							log(`Ready event fired. Running features on: ${window.location.href}`);

							// Add new blocks to the page
							showWatchHistory();
							showEpisodesRating();
							showChronologyStat();

							// Modify existing blocks on the page
							appendAverageTitleRating();
							appendAverageFriendsRating();
							appendAverageRating();
							appendOverallTitles();
						}

						// --- Script Bootstrapping ---
						function ready(fn) {
							document.addEventListener('page:load', fn);
							document.addEventListener('turbolinks:load', fn);
							if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") {
								fn();
							} else {
								document.addEventListener('DOMContentLoaded', fn);
							}
						}

						initStyle();
						ready(runAllFeatures);

					})();
				

Другое
Anti-Flash White
f2f3f4
Пример цвета

Список сайтов для просмотра аниме
/forum/offtopic/586236-gde-seychas-smotrite-anime

Сезоны аниме и манги. [Архив]
/forum/site/586446-sezony-anime-i-mangi-arhiv

Архитектура в Аниме (статья)
/forum/articles/article-404-arhitektura-v-anime/594264-obsuzhdenie-stati

Нетипичный киберпанк в Аниме (коллекции киберпанк аниме и манги)
/articles/310-netipichnyy-kiberpank-v-anime

Иллюстрации
Показанное тут значит, что мне нравится конкретная иллюстрация. Это не значит что мне нравится первоисточник. Это не обязательно значит что мне нравится персонаж. Это просто коллекция.


Постеры
Аниме
Лазарь
Последнее поле брани между тобой и мной, или Святая война сотворения мира
Биско-ржавоед
Восхождение в тени!
Гатиакута
Восемьдесят шесть
Аркнайтс: Восстание из пепла
Вайолет Эвергарден: День, когда ты поймёшь, что я люблю тебя, обязательно наступит
Песнь ночных сов
Ложные выводы
Вечность Югурэ: Эпизод 0
Королевство руин
Раб спецотряда демонического города
Корона грешника
Манга
Эта девушка милая... но опасная?
Забота об одарённой девушке: В престижной школе, полной высококлассных учеников, я буду тайно заботиться о самой красивой девушке (не имеющей никаких жизненных навыков)
Я стал графским ублюдком
Ранобэ
Пустая шкатулка и нулевая Мария
Мой статус убийцы очевидно превосходит геройский
Персонажи

Чардиз

Тиа

Арты
Арты-стена



Арты-постеры






















Другое

Разработчик RtD - приложения для переноса списка аниме в формат Markdown файлов на ПК. ссылка






Разные события
24.06.2025 - Первое достижение - 15 просмотренных аниме. Tonikaku Kawaii: SeifukuУнеси меня на Луну: Униформа. (/NotSoOff/history/437567431)
09.07.2025 - 1 неделя времени за аниме и мангой.
25.08.2025 - 2 недели.
13.10.2025 - 50 просмотренных аниме - Врата: Там бьются наши воины. (по крайней мере полноценно)
14.10.2025 - 3 недели аниме и манги. (Скорее всего на 5 эпизоде Maougun Saikyou no Majutsushi wa Ningen dattaСамый сильный волшебник армии повелителя демонов оказался человеком)
07.11.2025 - Первый просмотренный аниме-фильм (Изгнанные из рая): Rakuen TsuihouИзгнанные из рая

Арты
Основной арт: wallhaven.cc/w/5g1zx7
Бэкграунд арт: wallhaven.cc/w/zpg2jo
Картинка на месте графика активности: wallhaven.cc/w/xe56jz
Персонажи в углу экрана
1. wallhaven.cc/w/po8ple (летом)
2. wallhaven.cc/w/7j3k9v (зимой)
3. wallhaven.cc/w/j323ep (осенью)
4. wallhaven.cc/w/6lk1m6 (весной)
Должно было быть wallhaven.cc/w/mld6zk но арт так себе


Арт "Обо мне": wallhaven.cc/w/4vde83
"Коллекция": safebooru.org
"Клубы": wallhaven.cc
"Отсутствующие": safebooru.org
"Сохранённое": safebooru.org
"Система оценивания": safebooru.org
"Распределение тайлов в списках": safebooru.org
"Теги": safebooru.org

"Комментарии к тайтлам"

Бывшие арты
Картинка на месте графика активности: wallhaven.cc/w/0popxm