From 3b0f0dd4e1a79b39d60beebd87724a1b2d111a7d Mon Sep 17 00:00:00 2001 From: foxixus Date: Fri, 8 Aug 2025 18:39:58 +0000 Subject: [PATCH] Release 2.4 --- README.md | 94 +++++++++++++++++++--------------- public/sitemap-0.xml | 21 ++++---- src/app/auth/callback/page.tsx | 38 ++++++++++++++ src/app/login/LoginClient.tsx | 6 +++ 4 files changed, 108 insertions(+), 51 deletions(-) create mode 100644 src/app/auth/callback/page.tsx diff --git a/README.md b/README.md index 2aa18e4..28129d8 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,64 @@ -# NeoMovies Web 🎬 +# 🎬 Neo Movies -> Современный веб-интерфейс для поиска и просмотра фильмов и сериалов +
+ Neo Movies Logo +

Современный онлайн-сервис с удобным интерфейсом

+
-## 🚀 Особенности +## 📋 О проекте -- 🎭 **TMDB интеграция** - полная информация о фильмах и сериалах -- 🔍 **Умный поиск** - поиск по названию, актерам, жанрам -- 🎬 **Встроенные плееры** - просмотр через Alloha и Lumex -- 🧲 **Торрент интеграция** - поиск раздач по IMDB ID -- ⭐ **Система избранного** - сохраняйте любимые фильмы -- 🎨 **Современный UI** - адаптивный дизайн с темной темой -- 📱 **Мобильная версия** - оптимизировано для всех устройств -- 🔐 **JWT аутентификация** - безопасная авторизация -- 📧 **Email верификация** - подтверждение аккаунта +Neo Movies - это современная веб-платформа построенная с использованием передовых технологий. Проект предлагает удобный интерфейс, быструю навигацию и множество функций для комфортного просмотра информации об фильмах и сералах а также стороние плееры предоставляемые видео-балансерами. + +### ✨ Основные возможности + +- 🎥 Два встроенных видеоплеера на выбор (Alloha, Lumex) +- 🔍 Умный поиск по фильмам +- 📱 Адаптивный дизайн для всех устройств +- 🌙 Темная тема +- 👤 Система авторизации и профили пользователей +- ❤️ Возможность добавлять фильмы в избранное +- ⚡ Быстрая загрузка и оптимизированная производительность ## 🛠 Технологии -- **Frontend**: Next.js 15, React 19, TypeScript -- **Styling**: Tailwind CSS, Radix UI -- **State Management**: Redux Toolkit -- **API**: Go API (neomovies-api) -- **Database**: MongoDB -- **Authentication**: JWT -- **Deployment**: Vercel +- **Frontend:** + - Next.js 13+ (App Router) + - React 18 + - TypeScript + - Styled Components + - JWT-based authentication (custom) -## 📦 Установка +- **Backend:** + - Node.js + Express (neomovies-api) + - MongoDB (native driver) -1. **Клонируйте репозиторий:** +- **Дополнительно:** + - ESLint + - Prettier + - Git + - npm + +## Начало работы + +1. Клонируйте репозиторий: ```bash -git clone https://github.com/Ernous/neomovies-web.git -cd neomovies-web +git clone https://gitlab.com/foxixus/neomovies.git +cd neomovies ``` -2. **Установите зависимости:** +2. Установите зависимости: ```bash npm install ``` 3. Создайте файл `.env` и добавьте следующие переменные: ```env -NEXT_PUBLIC_API_URL=https://api.neomovies.ru +NEXT_PUBLIC_API_URL=https://neomovies-api.vercel.app +NEXT_PUBLIC_TMDB_API_KEY=your_tmdb_api_key +NEXT_PUBLIC_TMDB_ACCESS_TOKEN=your_tmdb_access_token ``` + 4. **Запустите проект:** ```bash # Режим разработки @@ -55,37 +72,33 @@ npm start ## API (neomovies-api) -Приложение использует отдельный Go API сервер. API предоставляет следующие возможности: +Приложение использует отдельный API сервер. API предоставляет следующие возможности: -- Поиск фильмов и сериалов через TMDB +- Поиск фильмов и сериалов - Получение детальной информации о фильме/сериале -- Поиск торрентов по IMDB ID с парсингом сезонов из названий -- Система избранного и реакций -- JWT аутентификация с email верификацией - Оптимизированная загрузка изображений - Кэширование запросов -### Особенности торрент-поиска +### Gmail App Password +1. Включите двухфакторную аутентификацию в аккаунте Google +2. Перейдите в настройки безопасности +3. Создайте пароль приложения +4. Используйте этот пароль в GMAIL_APP_PASSWORD -Новый API автоматически парсит сезоны из названий торрентов, что позволяет: -- Получать реальные доступные сезоны, а не только из TMDB -- Находить раздачи даже если нумерация сезонов отличается от официальной -- Группировать торренты по сезонам для удобного выбора - -Backend `.env` пример смотрите в репозитории [neomovies-api](https://github.com/Ernous/neomovies-api). +Backend `.env` пример смотрите в репозитории [neomovies-api](https://gitlab.com/foxixus/neomovies-api). --- ## Структура проекта ``` -neomovies-web/ +neomovies/ ├── src/ │ ├── app/ # App Router pages │ ├── components/ # React компоненты │ ├── hooks/ # React хуки │ ├── lib/ # Утилиты и API -│ ├── types/ # TypeScript типы +│ ├── models/ # MongoDB модели │ └── styles/ # Глобальные стили ├── public/ # Статические файлы └── package.json @@ -95,7 +108,6 @@ neomovies-web/ ## 👥 Авторы - **Frontend Developer** - [Foxix](https://gitlab.com/foxixus) -- **Backend Developer** - [Ernous](https://github.com/Ernous) ## 📄 Лицензия @@ -114,7 +126,7 @@ neomovies-web/ ## Благодарности - [TMDB](https://www.themoviedb.org/) за предоставление API -- [Vercel](https://vercel.com/) за хостинг +- [Vercel](https://vercel.com/) за хостинг API ## 📞 Контакты diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml index 58a8925..660f5a7 100644 --- a/public/sitemap-0.xml +++ b/public/sitemap-0.xml @@ -1,13 +1,14 @@ -https://neomovies.ru/admin/login2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/categories2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/favorites2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/login2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/profile2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/search2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/settings2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/terms2025-08-07T09:55:31.360Zdaily0.7 -https://neomovies.ru/verify2025-08-07T09:55:31.360Zdaily0.7 +https://neomovies.ru/auth/callback2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/admin/login2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/categories2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/login2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/favorites2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/profile2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/search2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/settings2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/verify2025-08-08T16:29:17.862Zdaily0.7 +https://neomovies.ru/terms2025-08-08T16:29:17.862Zdaily0.7 \ No newline at end of file diff --git a/src/app/auth/callback/page.tsx b/src/app/auth/callback/page.tsx new file mode 100644 index 0000000..8e6fddc --- /dev/null +++ b/src/app/auth/callback/page.tsx @@ -0,0 +1,38 @@ +'use client'; + +import { useEffect } from 'react'; +import { useRouter } from 'next/navigation'; +import { neoApi } from '@/lib/neoApi'; + +export default function OAuthCallbackPage() { + const router = useRouter(); + + useEffect(() => { + const run = async () => { + const url = new URL(window.location.href); + const token = url.searchParams.get('token'); + if (!token) { + router.replace('/login'); + return; + } + + try { + localStorage.setItem('token', token); + neoApi.defaults.headers.common['Authorization'] = `Bearer ${token}`; + const resp = await neoApi.get('/api/v1/auth/profile'); + const user = resp.data; + if (user?.name) localStorage.setItem('userName', user.name); + if (user?.email) localStorage.setItem('userEmail', user.email); + } catch { + // ignore, proceed to home + } finally { + window.dispatchEvent(new Event('auth-changed')); + router.replace('/'); + } + }; + + run(); + }, [router]); + + return null; +} \ No newline at end of file diff --git a/src/app/login/LoginClient.tsx b/src/app/login/LoginClient.tsx index 636ebbd..4454f9a 100644 --- a/src/app/login/LoginClient.tsx +++ b/src/app/login/LoginClient.tsx @@ -40,6 +40,11 @@ export default function LoginClient() { } }; + const handleGoogle = () => { + const base = process.env.NEXT_PUBLIC_API_URL || 'https://api.neomovies.ru'; + window.location.href = `${base}/api/v1/auth/google/login`; + }; + return (
@@ -99,6 +104,7 @@ export default function LoginClient() {