mirror of
https://gitlab.com/foxixus/neomovies.git
synced 2025-10-27 17:38:50 +05:00
Release 2.4
This commit is contained in:
94
README.md
94
README.md
@@ -1,47 +1,64 @@
|
||||
# NeoMovies Web 🎬
|
||||
# 🎬 Neo Movies
|
||||
|
||||
> Современный веб-интерфейс для поиска и просмотра фильмов и сериалов
|
||||
<div align="center">
|
||||
<img src="public/logo.png" alt="Neo Movies Logo" width="200"/>
|
||||
<p><strong>Современный онлайн-сервис с удобным интерфейсом</strong></p>
|
||||
</div>
|
||||
|
||||
## 🚀 Особенности
|
||||
## 📋 О проекте
|
||||
|
||||
- 🎭 **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
|
||||
|
||||
## 📞 Контакты
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
|
||||
<url><loc>https://neomovies.ru/admin/login</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/categories</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/favorites</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/login</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/profile</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/search</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/settings</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/terms</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/verify</loc><lastmod>2025-08-07T09:55:31.360Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/auth/callback</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/admin/login</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/categories</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/login</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/favorites</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/profile</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/search</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/settings</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/verify</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
<url><loc>https://neomovies.ru/terms</loc><lastmod>2025-08-08T16:29:17.862Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
|
||||
</urlset>
|
||||
38
src/app/auth/callback/page.tsx
Normal file
38
src/app/auth/callback/page.tsx
Normal file
@@ -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;
|
||||
}
|
||||
@@ -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 (
|
||||
<div className="min-h-screen flex items-center justify-center p-4 bg-background">
|
||||
<div className="w-full max-w-md bg-warm-50 dark:bg-warm-900 rounded-lg shadow-lg p-8">
|
||||
@@ -99,6 +104,7 @@ export default function LoginClient() {
|
||||
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleGoogle}
|
||||
className="w-full flex items-center justify-center gap-3 px-4 py-3 border border-warm-200 dark:border-warm-700 rounded-lg bg-white dark:bg-warm-800 hover:bg-warm-100 dark:hover:bg-warm-700 text-warm-900 dark:text-warm-50 transition-colors"
|
||||
>
|
||||
<Image src="/google.svg" alt="Google" width={20} height={20} />
|
||||
|
||||
Reference in New Issue
Block a user