// ==================== MOVIE DATABASE ==================== const MOVIES = [ { id: 1, title: "Побег из Шоушенка", originalTitle: "The Shawshank Redemption", year: 1994, rating: 9.3, duration: 142, genres: ["drama", "crime"], moods: ["think", "sad"], description: "Бухгалтер Энди Дюфрейн обвинён в убийстве собственной жены и её любовника. Оказавшись в тюрьме под названием Шоушенк, он сталкивается с жестокостью и беззаконием, царящими по обе стороны решётки.", poster: "https://image.tmdb.org/t/p/w500/q6y0Go1tsGEsmtFryDOJo3dEmqu.jpg" }, { id: 2, title: "Крёстный отец", originalTitle: "The Godfather", year: 1972, rating: 9.2, duration: 175, genres: ["crime", "drama"], moods: ["think", "drive"], description: "Крёстный отец — драма о мафиозной семье Корлеоне. История о власти, семье и предательстве в мире организованной преступности.", poster: "https://image.tmdb.org/t/p/w500/3bhkrj58Vtu7enYsRolD1fZdja1.jpg" }, { id: 3, title: "Тёмный рыцарь", originalTitle: "The Dark Knight", year: 2008, rating: 9.0, duration: 152, genres: ["action", "crime", "drama"], moods: ["drive", "think"], description: "Бэтмен поднимает ставки в войне с криминалом. С помощью лейтенанта Джима Гордона и прокурора Харви Дента он намерен очистить улицы от преступности.", poster: "https://image.tmdb.org/t/p/w500/qJ2tW6WMUDux911r6m7haRef0WH.jpg" }, { id: 4, title: "Начало", originalTitle: "Inception", year: 2010, rating: 8.8, duration: 148, genres: ["scifi", "action", "thriller"], moods: ["think", "drive", "unusual"], description: "Кобб — талантливый вор, лучший в опасном искусстве извлечения секретов подсознания во время сна. Он получает шанс начать всё заново.", poster: "https://image.tmdb.org/t/p/w500/9gk7adHYeDvHkCSEqAvQNLV5Uge.jpg" }, { id: 5, title: "Интерстеллар", originalTitle: "Interstellar", year: 2014, rating: 8.7, duration: 169, genres: ["scifi", "drama", "adventure"], moods: ["think", "unusual"], description: "Когда засуха и пыльные бури приводят человечество к продовольственному кризису, бывший пилот НАСА Купер отправляется в миссию через червоточину.", poster: "https://image.tmdb.org/t/p/w500/gEU2QniL6E8AHtMYfHM159D5xh.jpg" }, { id: 6, title: "Криминальное чтиво", originalTitle: "Pulp Fiction", year: 1994, rating: 8.9, duration: 154, genres: ["crime", "thriller"], moods: ["drive", "unusual", "fun"], description: "Два бандита Винсент Вега и Джулс Винфилд обсуждают свои предпочтения в еде и разница между европейской и американской поп-культурой.", poster: "https://image.tmdb.org/t/p/w500/d5iIlFn5s0ImszYzBPb8JPIfbXD.jpg" }, { id: 7, title: "Бойцовский клуб", originalTitle: "Fight Club", year: 1999, rating: 8.8, duration: 139, genres: ["drama", "thriller"], moods: ["think", "drive", "unusual"], description: "Сотрудник страховой компании страдает хронической бессонницей и отчаянно пытается вырваться из мучительно скучной жизни.", poster: "https://image.tmdb.org/t/p/w500/pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg" }, { id: 8, title: "Форрест Гамп", originalTitle: "Forrest Gump", year: 1994, rating: 8.8, duration: 142, genres: ["drama", "romance", "comedy"], moods: ["fun", "romance", "sad"], description: "История простого человека с большим сердцем, который становится свидетелем и участником ключевых событий американской истории.", poster: "https://image.tmdb.org/t/p/w500/arw2vcBveWOVZr6pxd9XTd1TdQa.jpg" }, { id: 9, title: "Матрица", originalTitle: "The Matrix", year: 1999, rating: 8.7, duration: 136, genres: ["scifi", "action"], moods: ["drive", "think", "unusual"], description: "Хакер Нео узнаёт, что наш мир — это иллюзия, созданная машинами. Он присоединяется к восстанию против машин.", poster: "https://image.tmdb.org/t/p/w500/f89U3ADr1oiB1s9GkdPOEpXUk5H.jpg" }, { id: 10, title: "Хороший, плохой, злой", originalTitle: "The Good, the Bad and the Ugly", year: 1966, rating: 8.8, duration: 161, genres: ["action", "adventure"], moods: ["drive", "fun"], description: "Три охотника за сокровищами конкурируют в поисках конфедеративного золота во время Гражданской войны в США.", poster: "https://image.tmdb.org/t/p/w500/bX2xnavhMYjWDoZp1VM6VnU1xwe.jpg" }, { id: 11, title: "Властелин колец: Возвращение короля", originalTitle: "The Lord of the Rings: The Return of the King", year: 2003, rating: 9.0, duration: 201, genres: ["fantasy", "adventure", "action"], moods: ["drive", "think"], description: "Фродо и Сэм приближаются к Роковой горе, чтобы уничтожить Кольцо, в то время как Арагорн ведёт битву за Гондор.", poster: "https://image.tmdb.org/t/p/w500/rCzpDGLbOoPwLjy3OAm5NUPOTrC.jpg" }, { id: 12, title: "Бойцовский клуб", originalTitle: "Fight Club", year: 1999, rating: 8.8, duration: 139, genres: ["drama"], moods: ["think", "unusual"], description: "Офисный работник встречает харизматичного продавца мыла и создаёт подпольный бойцовский клуб.", poster: "https://image.tmdb.org/t/p/w500/pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg" }, { id: 13, title: "Звёздные войны: Эпизод V - Империя наносит ответный удар", originalTitle: "Star Wars: Episode V - The Empire Strikes Back", year: 1980, rating: 8.7, duration: 124, genres: ["scifi", "adventure", "fantasy"], moods: ["drive", "fun"], description: "Люк Скайуокер начинает обучение джедая у магистра Йоды, в то время как Дарт Вейдер преследует друзей Люка.", poster: "https://image.tmdb.org/t/p/w500/2l05cFWJacyIsTpsqSgH0wQXe4V.jpg" }, { id: 14, title: "Один дома", originalTitle: "Home Alone", year: 1990, rating: 7.7, duration: 103, genres: ["comedy", "adventure"], moods: ["fun", "comedy"], description: "Восьмилетний Кевин остаётся один дома на Рождество и должен защитить свой дом от двух грабителей.", poster: "https://image.tmdb.org/t/p/w500/onTSipZ8R3amIkoc8xWrLXl5hV.jpg" }, { id: 15, title: "Унесённые призраками", originalTitle: "Spirited Away", year: 2001, rating: 8.6, duration: 125, genres: ["animation", "fantasy", "adventure"], moods: ["unusual", "think"], description: "Девочка попадает в таинственный мир духов и должна найти способ освободить себя и своих родителей.", poster: "https://image.tmdb.org/t/p/w500/39wmItIWsg5sZMyRUKGnDbALpd1.jpg" }, { id: 16, title: "Сияние", originalTitle: "The Shining", year: 1980, rating: 8.4, duration: 146, genres: ["horror", "thriller"], moods: ["scary", "think"], description: "Писатель Джек Торранс становится зимним смотрителем отеля «Оверлук», где происходят сверхъестественные события.", poster: "https://image.tmdb.org/t/p/w500/b6ko0IKC8MdYBBPkkA1aBPLe2yz.jpg" }, { id: 17, title: "Чужой", originalTitle: "Alien", year: 1979, rating: 8.5, duration: 117, genres: ["horror", "scifi"], moods: ["scary", "drive"], description: "Экипаж космического корабля сталкивается с смертоносным инопланетным существом.", poster: "https://image.tmdb.org/t/p/w500/vfrQk5IPloGg1v9Rzbh2Eg3VGyM.jpg" }, { id: 18, title: "Титаник", originalTitle: "Titanic", year: 1997, rating: 7.9, duration: 195, genres: ["romance", "drama"], moods: ["romance", "sad"], description: "История любви между аристократкой и художником из бедных слоёв общества на борту обречённого лайнера.", poster: "https://image.tmdb.org/t/p/w500/9xjZS2rlVxm8SFx8kPC3aIGCOYQ.jpg" }, { id: 19, title: "День сурка", originalTitle: "Groundhog Day", year: 1993, rating: 8.0, duration: 101, genres: ["comedy", "romance", "fantasy"], moods: ["fun", "comedy", "romance"], description: "Циничный метеоролог попадает в временную петлю и вынужден проживать один и тот же день снова и снова.", poster: "https://image.tmdb.org/t/p/w500/gCgt1WARPZaXnq5zeJRYrWwFZ2.jpg" }, { id: 20, title: "Паразиты", originalTitle: "Gisaengchung", year: 2019, rating: 8.5, duration: 132, genres: ["thriller", "drama", "comedy"], moods: ["think", "unusual", "drive"], description: "Бедная семья обманом проникает в богатый дом, выдавая себя за квалифицированных специалистов.", poster: "https://image.tmdb.org/t/p/w500/7IiTTgloJzvGI1TAYymCfbfl3vT.jpg" }, { id: 21, title: "Джокер", originalTitle: "Joker", year: 2019, rating: 8.4, duration: 122, genres: ["crime", "thriller", "drama"], moods: ["think", "sad", "drive"], description: "История происхождения самого известного злодея вселенной DC — Артура Флека.", poster: "https://image.tmdb.org/t/p/w500/udDclJoHjfjb8EkGsdr7ZKRN44.jpg" }, { id: 22, title: "Мстители: Финал", originalTitle: "Avengers: Endgame", year: 2019, rating: 8.4, duration: 181, genres: ["action", "adventure", "scifi"], moods: ["drive", "fun"], description: "Мстители собираются в последний раз, чтобы восстановить порядок во вселенной после событий Войны Бесконечности.", poster: "https://image.tmdb.org/t/p/w500/or06FN3Dka5tukK1e9sl16pB3iy.jpg" }, { id: 23, title: "Ла-Ла Ленд", originalTitle: "La La Land", year: 2016, rating: 8.0, duration: 128, genres: ["romance", "drama", "comedy"], moods: ["romance", "fun", "sad"], description: "История любви между начинающей актрисой и талантливым музыкантом в Лос-Анджелесе.", poster: "https://image.tmdb.org/t/p/w500/uDO8zWDhfWu7x6O0k0006Oe2M7.jpg" }, { id: 24, title: "Дюна", originalTitle: "Dune", year: 2021, rating: 8.0, duration: 155, genres: ["scifi", "adventure"], moods: ["think", "drive", "unusual"], description: "Пол Атрейдес отправляется на самую опасную планету во Вселенной, чтобы обеспечить будущее своей семьи.", poster: "https://image.tmdb.org/t/p/w500/d5NXSklXo0qyIYkgV94XAgMIckC.jpg" }, { id: 25, title: "Гарри Поттер и философский камень", originalTitle: "Harry Potter and the Sorcerer's Stone", year: 2001, rating: 7.6, duration: 152, genres: ["fantasy", "adventure"], moods: ["fun", "drive"], description: "Мальчик-сирота узнаёт, что он волшебник, и отправляется в школу магии Хогвартс.", poster: "https://image.tmdb.org/t/p/w500/wuMc08IPKEatf9rnMNXvIDxqP4W.jpg" }, { id: 26, title: "Терминатор 2: Судный день", originalTitle: "Terminator 2: Judgment Day", year: 1991, rating: 8.6, duration: 137, genres: ["action", "scifi"], moods: ["drive", "fun"], description: "Киборг отправляется в прошлое, чтобы защитить будущего лидера сопротивления машин.", poster: "https://image.tmdb.org/t/p/w500/5M0j0B18abtBI5gi2RhfjjurTqb.jpg" }, { id: 27, title: "Назад в будущее", originalTitle: "Back to the Future", year: 1985, rating: 8.5, duration: 116, genres: ["scifi", "adventure", "comedy"], moods: ["fun", "drive", "comedy"], description: "Подросток Марти Макфлай случайно отправляется в 1955 год на машине времени.", poster: "https://image.tmdb.org/t/p/w500/fNOH9f9aA7XRTzl1sAd7k1i0qHc.jpg" }, { id: 28, title: "Молчание ягнят", originalTitle: "The Silence of the Lambs", year: 1991, rating: 8.6, duration: 118, genres: ["crime", "thriller", "mystery"], moods: ["scary", "think"], description: "Агент ФБР обращается за помощью к каннибалу Ганнибалу Лектеру, чтобы поймать другого серийного убийцу.", poster: "https://image.tmdb.org/t/p/w500/uS9m8OBk1A8eM9I042bx8XXpqAq.jpg" }, { id: 29, title: "Спасти рядового Райана", originalTitle: "Saving Private Ryan", year: 1998, rating: 8.6, duration: 169, genres: ["drama", "history", "action"], moods: ["think", "sad", "drive"], description: "Отряд солдат отправляется на поиски парашютиста, чьи три брата погибли в бою.", poster: "https://image.tmdb.org/t/p/w500/uqx37cS8cpHg8U35f9U5IBlrCV3.jpg" }, { id: 30, title: "Зелёная миля", originalTitle: "The Green Mile", year: 1999, rating: 8.6, duration: 189, genres: ["drama", "fantasy"], moods: ["think", "sad"], description: "История о тюремном охраннике и заключённом с божественным даром.", poster: "https://image.tmdb.org/t/p/w500/velWPhVMQeQKcxggNEU8YmIo51R.jpg" }, { id: 31, title: "Гладиатор", originalTitle: "Gladiator", year: 2000, rating: 8.5, duration: 155, genres: ["action", "drama", "history"], moods: ["drive", "think"], description: "Римский генерал становится гладиатором и ищет мести за убийство своей семьи.", poster: "https://image.tmdb.org/t/p/w500/ty8TGRuvJLPUmAR1H1nRIsgwvim.jpg" }, { id: 32, title: "Король Лев", originalTitle: "The Lion King", year: 1994, rating: 8.5, duration: 88, genres: ["animation", "adventure", "drama"], moods: ["fun", "sad"], description: "Лев Симба должен принять свою судьбу и стать королём Прайдленда.", poster: "https://image.tmdb.org/t/p/w500/sKCr78MXSLixwmZ8DyJLrpMsd15.jpg" }, { id: 33, title: "Вечное сияние чистого разума", originalTitle: "Eternal Sunshine of the Spotless Mind", year: 2004, rating: 8.3, duration: 108, genres: ["romance", "scifi", "drama"], moods: ["romance", "think", "sad"], description: "Пара проходит процедуру удаления воспоминаний о болезненных отношениях.", poster: "https://image.tmdb.org/t/p/w500/5MwkWH9tYHv3m89PXxNulFo7Xug.jpg" }, { id: 34, title: "Отступники", originalTitle: "The Departed", year: 2006, rating: 8.5, duration: 151, genres: ["crime", "thriller", "drama"], moods: ["drive", "think"], description: "Два крота работают по обе стороны закона в полицейском департаменте Бостона.", poster: "https://image.tmdb.org/t/p/w500/nT97ifVT2J1yMQmeq20Qblg61T.jpg" }, { id: 35, title: "Престиж", originalTitle: "The Prestige", year: 2006, rating: 8.5, duration: 130, genres: ["mystery", "thriller", "drama"], moods: ["think", "unusual"], description: "Два фокусника ведут ожесточённую борьбу, которая приводит к трагическим последствиям.", poster: "https://image.tmdb.org/t/p/w500/tRNlZbgNCNOpLpbPEz5L8G8A0JN.jpg" }, { id: 36, title: "Вверх", originalTitle: "Up", year: 2009, rating: 8.3, duration: 96, genres: ["animation", "adventure", "comedy"], moods: ["fun", "comedy", "sad"], description: "78-летний Карл Фредриксен отправляется в приключение на воздушных шарах.", poster: "https://image.tmdb.org/t/p/w500/mFvoEwSfLqbr3N7xzWF8vB5lSj.jpg" }, { id: 37, title: "Тайна Коко", originalTitle: "Coco", year: 2017, rating: 8.4, duration: 105, genres: ["animation", "adventure", "fantasy"], moods: ["fun", "sad"], description: "Мальчик Мигель мечтает стать музыкантом и попадает в страну мёртвых.", poster: "https://image.tmdb.org/t/p/w500/gGEsBPAijhVUFoiNpgZXqRVWJt2.jpg" }, { id: 38, title: "Джанго освобождённый", originalTitle: "Django Unchained", year: 2012, rating: 8.4, duration: 165, genres: ["action", "drama"], moods: ["drive", "fun"], description: "Освобождённый раб Джанго отправляется спасать свою жену от жестокого владельца плантации.", poster: "https://image.tmdb.org/t/p/w500/7oWY8VDWW7thTzWh3OKYRkWUlD5.jpg" }, { id: 39, title: "ВАЛЛ·И", originalTitle: "WALL·E", year: 2008, rating: 8.4, duration: 98, genres: ["animation", "scifi", "adventure"], moods: ["fun", "think"], description: "Робот-уборщик на заброшенной Земле влюбляется в робота-разведчика ЕВУ.", poster: "https://image.tmdb.org/t/p/w500/hBnYqza876OMhRJRXxkFz4jjZPt.jpg" }, { id: 40, title: "Жизнь прекрасна", originalTitle: "La vita è bella", year: 1997, rating: 8.6, duration: 116, genres: ["comedy", "drama"], moods: ["fun", "sad", "think"], description: "Отец использует своё воображение, чтобы защитить сына от ужасов концлагеря.", poster: "https://image.tmdb.org/t/p/w500/74hLDKjD5aGYOotO6esUVaeISa2.jpg" }, { id: 41, title: "Матрица: Перезагрузка", originalTitle: "The Matrix Reloaded", year: 2003, rating: 7.2, duration: 138, genres: ["action", "scifi"], moods: ["drive", "think"], description: "Нео и его друзья готовятся к войне против машин.", poster: "https://image.tmdb.org/t/p/w500/9TGHDvWrqKBzwDxDodHYXEmOE5J.jpg" }, { id: 42, title: "Аватар", originalTitle: "Avatar", year: 2009, rating: 7.9, duration: 162, genres: ["scifi", "adventure", "fantasy"], moods: ["drive", "unusual"], description: "Морпех Джейк Салли оказывается на планете Пандора и становится частью народа На'ви.", poster: "https://image.tmdb.org/t/p/w500/6EiRUJpuoeQPghrs3YNktfnqOVh.jpg" }, { id: 43, title: "Мстители: Война бесконечности", originalTitle: "Avengers: Infinity War", year: 2018, rating: 8.3, duration: 149, genres: ["action", "adventure", "scifi"], moods: ["drive", "fun"], description: "Мстители и их союзники должны остановить безумного титана Таноса.", poster: "https://image.tmdb.org/t/p/w500/7WsyChQLEftFiDOVTGkv3hFpyyt.jpg" }, { id: 44, title: "Твоё имя", originalTitle: "Kimi no Na wa", year: 2016, rating: 8.4, duration: 106, genres: ["animation", "romance", "fantasy"], moods: ["romance", "think", "unusual"], description: "Два подростка mysteriously меняются телами и пытаются найти друг друга.", poster: "https://image.tmdb.org/t/p/w500/q719jXXEzOoYaps6babgKnONONX.jpg" }, { id: 45, title: "1+1", originalTitle: "Intouchables", year: 2011, rating: 8.5, duration: 112, genres: ["drama", "comedy"], moods: ["fun", "comedy", "think"], description: "Аристократ-инвалид нанимает парня из гетто в качестве сиделки.", poster: "https://image.tmdb.org/t/p/w500/323BP0QQpxYZxhI7nwmANpLHR0u.jpg" }, { id: 46, title: "Хатико: Самый верный друг", originalTitle: "Hachi: A Dog's Tale", year: 2009, rating: 8.1, duration: 93, genres: ["drama"], moods: ["sad", "think"], description: "История о преданной собаке, которая ждёт своего хозяина на вокзале.", poster: "https://image.tmdb.org/t/p/w500/8Vt7mXHRo6bEj8nT5sD7bL8pF0.jpg" }, { id: 47, title: "Три билборда на границе Эббинга, Миссури", originalTitle: "Three Billboards Outside Ebbing, Missouri", year: 2017, rating: 8.1, duration: 115, genres: ["crime", "drama", "comedy"], moods: ["think", "drive"], description: "Мать убитой дочери требует справедливости через три билборда.", poster: "https://image.tmdb.org/t/p/w500/pZRhqJj0DBy4ghB7g6pG7MG9xW.jpg" }, { id: 48, title: "Большой Лебовски", originalTitle: "The Big Lebowski", year: 1998, rating: 7.8, duration: 117, genres: ["comedy", "crime"], moods: ["fun", "comedy", "unusual"], description: "Чувака путают с миллионером и втягивают в странную историю.", poster: "https://image.tmdb.org/t/p/w500/d4ftZu4dWypDlVE5p3V0p3e3i4.jpg" }, { id: 49, title: "Город Бога", originalTitle: "Cidade de Deus", year: 2002, rating: 8.6, duration: 130, genres: ["crime", "drama"], moods: ["drive", "think"], description: "История о жизни в фавелах Рио-де-Жанейро на протяжении нескольких десятилетий.", poster: "https://image.tmdb.org/t/p/w500/k7eYdWvhYQyDYR1p5MjZnJ4n2.jpg" }, { id: 50, title: "Список Шиндлера", originalTitle: "Schindler's List", year: 1993, rating: 9.0, duration: 195, genres: ["drama", "history"], moods: ["think", "sad"], description: "История Оскара Шиндлера, спасшего более тысячи евреев во время Холокоста.", poster: "https://image.tmdb.org/t/p/w500/sF1U4EUQS8YHUYjNl3pTXMYC4mV.jpg" }, { id: 51, title: "Пираты Карибского моря: Проклятие Чёрной жемчужины", originalTitle: "Pirates of the Caribbean: The Curse of the Black Pearl", year: 2003, rating: 8.0, duration: 143, genres: ["adventure", "fantasy", "action"], moods: ["fun", "drive", "comedy"], description: "Кузнец Уилл Тёрнер объединяется с эксцентричным пиратом Джеком Воробьём.", poster: "https://image.tmdb.org/t/p/w500/z8onk7LV9Mmw6zKz4hT6pzzvmvl.jpg" }, { id: 52, title: "Дьявол носит Prada", originalTitle: "The Devil Wears Prada", year: 2006, rating: 7.5, duration: 109, genres: ["comedy", "drama"], moods: ["fun", "comedy"], description: "Молодая девушка становится ассистенткой жестокого редактора модного журнала.", poster: "https://image.tmdb.org/t/p/w500/8916As6Y7bYPVr9pWzuBQQnrTHU.jpg" }, { id: 53, title: "Малхолланд Драйв", originalTitle: "Mulholland Drive", year: 2001, rating: 7.9, duration: 147, genres: ["mystery", "thriller", "drama"], moods: ["think", "unusual", "scary"], description: "Женщина с амнезией и начинающая актриса исследуют тёмные стороны Голливуда.", poster: "https://image.tmdb.org/t/p/w500/tVxGt7uffR6IIbGlQpSP3yJhqqa.jpg" }, { id: 54, title: "Семь", originalTitle: "Se7en", year: 1995, rating: 8.6, duration: 127, genres: ["crime", "mystery", "thriller"], moods: ["scary", "think", "drive"], description: "Два детектива ищут серийного убийцу, который наказывает жертв за семь смертных грехов.", poster: "https://image.tmdb.org/t/p/w500/6yoghtyTpznpBik8EngEmJskVUO.jpg" }, { id: 55, title: "Отель «Гранд Будапешт»", originalTitle: "The Grand Budapest Hotel", year: 2014, rating: 8.1, duration: 99, genres: ["comedy", "adventure"], moods: ["fun", "comedy", "unusual"], description: "История о легендарном консьерже Густаве и его друге Zero.", poster: "https://image.tmdb.org/t/p/w500/eWdyYQreja6JGCzqHWXpWHDrrPo.jpg" }, { id: 56, title: "Безумный Макс: Дорога ярости", originalTitle: "Mad Max: Fury Road", year: 2015, rating: 7.6, duration: 120, genres: ["action", "adventure", "scifi"], moods: ["drive", "fun"], description: "В постапокалиптической пустоши Макс и Фуриоса бегут от тирана.", poster: "https://image.tmdb.org/t/p/w500/hA2ple9q4qnwxp3hKVNhroipsir.jpg" }, { id: 57, title: "Старикам тут не место", originalTitle: "No Country for Old Men", year: 2007, rating: 8.2, duration: 122, genres: ["crime", "thriller", "drama"], moods: ["think", "scary", "drive"], description: "Охотник находит деньги от наркосделки и становится мишенью психопата.", poster: "https://image.tmdb.org/t/p/w500/bj1v6YKF8yHqA489VFfnQvOJp9n.jpg" }, { id: 58, title: "Трудно быть богом", originalTitle: "Hard to Be a God", year: 2013, rating: 6.5, duration: 177, genres: ["scifi", "drama"], moods: ["think", "unusual"], description: "Учёный из будущего отправляется на планету, где застряла средневековая цивилизация.", poster: "https://image.tmdb.org/t/p/w500/iR79ieYRZ5fBmXVL7fOe0y7xIJ.jpg" }, { id: 59, title: "Одержимость", originalTitle: "Whiplash", year: 2014, rating: 8.5, duration: 106, genres: ["drama"], moods: ["think", "drive"], description: "Молодой барабанщик мечтает стать великим, но сталкивается с жестоким преподавателем.", poster: "https://image.tmdb.org/t/p/w500/7fn624j5lj3xTme2SgiZErnGSwC.jpg" }, { id: 60, title: "Криминальное чтиво", originalTitle: "Pulp Fiction", year: 1994, rating: 8.9, duration: 154, genres: ["crime", "thriller"], moods: ["fun", "drive", "unusual"], description: "Несколько переплетающихся историй из криминального мира Лос-Анджелеса.", poster: "https://image.tmdb.org/t/p/w500/d5iIlFn5s0ImszYzBPb8JPIfbXD.jpg" } ]; // Genre and mood labels for display const GENRE_LABELS = { action: "Боевик", comedy: "Комедия", drama: "Драма", scifi: "Фантастика", horror: "Ужасы", thriller: "Триллер", adventure: "Приключения", fantasy: "Фэнтези", mystery: "Детектив", romance: "Романтика", animation: "Анимация", crime: "Криминал", history: "История" }; const MOOD_LABELS = { fun: "Весело", scary: "Страшно", think: "Подумать", romance: "Романтика", drive: "Драйв", comedy: "Комедия", sad: "Грустное", unusual: "Что-то необычное" }; // ==================== STATE ==================== let currentMovie = null; let selectedMood = null; let lastFoundMovies = []; // Movies found in current session let favorites = JSON.parse(localStorage.getItem('filmora_favorites')) || []; let history = JSON.parse(localStorage.getItem('filmora_history')) || []; // ==================== DOM ELEMENTS ==================== const navBtns = document.querySelectorAll('.nav-btn'); const backBtns = document.querySelectorAll('.back-btn'); const moodBtns = document.querySelectorAll('.mood-btn'); const findMovieBtn = document.getElementById('findMovie'); const randomModeBtn = document.getElementById('randomMode'); const anotherMovieBtn = document.getElementById('anotherMovie'); const addToFavoritesBtn = document.getElementById('addToFavorites'); const resetFiltersBtn = document.getElementById('resetFilters'); const resetFiltersEmptyBtn = document.getElementById('resetFiltersEmpty'); const clearHistoryBtn = document.getElementById('clearHistory'); const resultSection = document.getElementById('resultSection'); const emptyState = document.getElementById('emptyState'); const loadingState = document.getElementById('loadingState'); const loadingText = document.getElementById('loadingText'); // Filter elements const genreFilter = document.getElementById('genreFilter'); const yearFilter = document.getElementById('yearFilter'); const ratingFilter = document.getElementById('ratingFilter'); const durationFilter = document.getElementById('durationFilter'); // Movie display elements const moviePoster = document.getElementById('moviePoster'); const movieTitle = document.getElementById('movieTitle'); const movieOriginal = document.getElementById('movieOriginal'); const movieYear = document.getElementById('movieYear'); const movieDuration = document.getElementById('movieDuration'); const movieRating = document.getElementById('movieRating'); const movieGenres = document.getElementById('movieGenres'); const movieDescription = document.getElementById('movieDescription'); // ==================== NAVIGATION ==================== function showPage(pageId) { document.querySelectorAll('.page').forEach(page => page.classList.remove('active')); document.getElementById(pageId).classList.add('active'); if (pageId === 'favorites') { renderFavorites(); } else if (pageId === 'history') { renderHistory(); } } navBtns.forEach(btn => { btn.addEventListener('click', () => { const page = btn.dataset.page; showPage(page); }); }); backBtns.forEach(btn => { btn.addEventListener('click', () => { const page = btn.dataset.page; showPage(page); }); }); // ==================== MOOD SELECTION ==================== moodBtns.forEach(btn => { btn.addEventListener('click', () => { const mood = btn.dataset.mood; if (selectedMood === mood) { selectedMood = null; btn.classList.remove('selected'); } else { moodBtns.forEach(b => b.classList.remove('selected')); selectedMood = mood; btn.classList.add('selected'); } }); }); // ==================== FILTER FUNCTIONS ==================== function resetFilters() { selectedMood = null; moodBtns.forEach(btn => btn.classList.remove('selected')); genreFilter.value = 'any'; yearFilter.value = 'any'; ratingFilter.value = 'any'; durationFilter.value = 'any'; } resetFiltersBtn.addEventListener('click', resetFilters); if (resetFiltersEmptyBtn) { resetFiltersEmptyBtn.addEventListener('click', () => { resetFilters(); emptyState.style.display = 'none'; resultSection.classList.remove('show'); }); } // ==================== MOVIE FILTERING ==================== function filterMovies() { let filtered = [...MOVIES]; // Mood filter if (selectedMood) { filtered = filtered.filter(movie => movie.moods.includes(selectedMood)); } // Genre filter if (genreFilter.value !== 'any') { filtered = filtered.filter(movie => movie.genres.includes(genreFilter.value)); } // Year filter if (yearFilter.value !== 'any') { const ranges = { '2020-2026': [2020, 2026], '2010-2019': [2010, 2019], '2000-2009': [2000, 2009], '1990-1999': [1990, 1999], 'before-1990': [0, 1989] }; const [min, max] = ranges[yearFilter.value]; filtered = filtered.filter(movie => movie.year >= min && movie.year <= max); } // Rating filter if (ratingFilter.value !== 'any') { const minRating = parseFloat(ratingFilter.value); filtered = filtered.filter(movie => movie.rating >= minRating); } // Duration filter if (durationFilter.value !== 'any') { if (durationFilter.value === '150+') { filtered = filtered.filter(movie => movie.duration > 150); } else { const maxDuration = parseInt(durationFilter.value); filtered = filtered.filter(movie => movie.duration <= maxDuration); } } // Exclude movies already found in this session filtered = filtered.filter(movie => !lastFoundMovies.includes(movie.id)); return filtered; } // ==================== MOVIE SELECTION & ANIMATION ==================== function getRandomMovie() { const filtered = filterMovies(); if (filtered.length === 0) return null; const randomIndex = Math.floor(Math.random() * filtered.length); return filtered[randomIndex]; } function showLoadingAnimation(callback) { resultSection.classList.remove('show'); emptyState.style.display = 'none'; loadingState.style.display = 'block'; const movieTitles = MOVIES.map(m => m.title); let counter = 0; const maxCounter = 15; const interval = setInterval(() => { const randomTitle = movieTitles[Math.floor(Math.random() * movieTitles.length)]; loadingText.textContent = randomTitle; counter++; if (counter >= maxCounter) { clearInterval(interval); loadingState.style.display = 'none'; callback(); } }, 100); } function displayMovie(movie) { currentMovie = movie; moviePoster.src = movie.poster; movieTitle.textContent = movie.title; movieOriginal.textContent = movie.originalTitle; movieYear.textContent = movie.year; movieDuration.textContent = `${movie.duration} мин`; movieRating.textContent = `⭐ ${movie.rating}/10`; movieGenres.innerHTML = movie.genres.map(g => `${GENRE_LABELS[g]}` ).join(''); movieDescription.textContent = movie.description; // Update favorite button state const isFavorite = favorites.some(f => f.id === movie.id); addToFavoritesBtn.classList.toggle('active', isFavorite); addToFavoritesBtn.querySelector('span:first-child').textContent = isFavorite ? '❤️' : '♡'; resultSection.classList.add('show'); } function findMovie() { showLoadingAnimation(() => { const movie = getRandomMovie(); if (!movie) { resultSection.classList.remove('show'); emptyState.style.display = 'block'; return; } lastFoundMovies.push(movie.id); // Add to history const historyEntry = { ...movie, date: new Date().toISOString() }; history.unshift(historyEntry); if (history.length > 50) history.pop(); // Keep max 50 entries localStorage.setItem('filmora_history', JSON.stringify(history)); displayMovie(movie); }); } findMovieBtn.addEventListener('click', findMovie); anotherMovieBtn.addEventListener('click', () => { findMovie(); }); // ==================== FAVORITES ==================== addToFavoritesBtn.addEventListener('click', () => { if (!currentMovie) return; const index = favorites.findIndex(f => f.id === currentMovie.id); if (index === -1) { favorites.unshift(currentMovie); addToFavoritesBtn.classList.add('active'); addToFavoritesBtn.querySelector('span:first-child').textContent = '❤️'; } else { favorites.splice(index, 1); addToFavoritesBtn.classList.remove('active'); addToFavoritesBtn.querySelector('span:first-child').textContent = '♡'; } localStorage.setItem('filmora_favorites', JSON.stringify(favorites)); }); function renderFavorites() { const grid = document.getElementById('favoritesGrid'); const empty = document.getElementById('emptyFavorites'); if (favorites.length === 0) { grid.innerHTML = ''; empty.style.display = 'block'; return; } empty.style.display = 'none'; grid.innerHTML = favorites.map(movie => `