Compare commits

..

3 Commits

Author SHA1 Message Date
748bf975ca Edit README.md 2025-10-18 11:37:08 +00:00
87dc2795ef Edit README.md 2025-10-18 11:36:25 +00:00
06bd83278b Edit README.md 2025-10-18 11:34:20 +00:00
3 changed files with 11 additions and 69 deletions

View File

@@ -4,26 +4,6 @@
[![Download](https://img.shields.io/github/v/release/Neo-Open-Source/neomovies-mobile?label=Download&style=for-the-badge&logo=github)](https://github.com/Neo-Open-Source/neomovies-mobile/releases/latest)
## Возможности
- 📱 Кроссплатформенное приложение (Android/iOS(пока не реализовано))
- 🎥 Просмотр фильмов и сериалов через WebView
- 🌙 Поддержка динамической темы
- 💾 Локальное кэширование данных
- 🔒 Безопасное хранение данных
- 🚀 Быстрая загрузка контента
- 🎨 Современный Material Design интерфейс
## Технологии
- **Flutter** - основной фреймворк
- **Provider** - управление состоянием
- **Hive** - локальная база данных
- **HTTP** - сетевые запросы
- **WebView** - воспроизведение видео
- **Cached Network Image** - кэширование изображений
- **Google Fonts** - красивые шрифты
## Установка
1. Клонируйте репозиторий:
@@ -39,7 +19,7 @@ flutter pub get
3. Создайте файл `.env` в корне проекта:
```
API_URL=your_api_url_here
API_URL=api.neomovies.ru
```
4. Запустите приложение:
@@ -54,11 +34,6 @@ flutter run
flutter build apk --release
```
### iOS
```bash
flutter build ios --release
```
## Структура проекта
```
@@ -77,20 +52,15 @@ lib/
- **Flutter SDK**: 3.8.1+
- **Dart**: 3.8.1+
- **Android**: API 21+ (Android 5.0+)
- **iOS**: iOS 11.0+
## Участие в разработке
1. Форкните репозиторий
2. Создайте ветку для новой функции (`git checkout -b feature/amazing-feature`)
3. Внесите изменения и закоммитьте (`git commit -m 'Add amazing feature'`)
4. Отправьте изменения в ветку (`git push origin feature/amazing-feature`)
5. Создайте Pull Request
## Лицензия
Этот проект лицензирован под Apache 2.0 License - подробности в файле [LICENSE](LICENSE).
Apache 2.0 License - [LICENSE](LICENSE).
## Контакты
Если у вас есть вопросы или предложения, создайте issue в этом репозитории.
neo.movies.mail@gmail.com
## Благодарность
Огромная благодарность создателям проекта [LAMPAC](https://github.com/immisterio/Lampac)

View File

@@ -36,23 +36,15 @@ class DownloadsProvider with ChangeNotifier {
/// Загрузить список активных загрузок
Future<void> refreshDownloads() async {
print('📥 DownloadsProvider: refreshDownloads() called');
try {
print('📥 Setting loading=true, error=null');
_setLoading(true);
_setError(null);
print('📥 Calling TorrentPlatformService.getAllDownloads()...');
final progress = await TorrentPlatformService.getAllDownloads();
print('📥 Got ${progress.length} torrents from platform service');
// Получаем полную информацию о каждом торренте
_torrents.clear();
print('📥 Cleared _torrents list');
for (int i = 0; i < progress.length; i++) {
final progressItem = progress[i];
print('📥 Processing torrent $i: ${progressItem.infoHash.substring(0, 8)}...');
for (final progressItem in progress) {
try {
final torrentInfo = await TorrentPlatformService.getTorrent(progressItem.infoHash);
if (torrentInfo != null) {
@@ -72,22 +64,14 @@ class DownloadsProvider with ChangeNotifier {
state: progressItem.state,
savePath: '/storage/emulated/0/Download/NeoMovies',
files: [],
);
print('📥 ✅ Created basic info: ${basicInfo.name}');
_torrents.add(basicInfo);
));
}
}
print('📥 Final torrents count: ${_torrents.length}');
print('📥 Setting loading=false');
_setLoading(false);
print('📥 ✅ refreshDownloads() completed successfully');
} catch (e, stackTrace) {
print('📥 ❌ Error refreshing downloads: $e');
print('📥 Stack trace: $stackTrace');
_setError(e.toString(), stackTrace.toString());
} catch (e) {
_setError(e.toString());
_setLoading(false);
print('📥 Error state set, loading=false');
}
}

View File

@@ -16,10 +16,7 @@ class _DownloadsScreenState extends State<DownloadsScreen> {
@override
void initState() {
super.initState();
print('📥 DownloadsScreen: initState() called');
WidgetsBinding.instance.addPostFrameCallback((_) {
print('📥 DownloadsScreen: postFrameCallback triggered');
print('📥 DownloadsScreen: calling refreshDownloads()');
context.read<DownloadsProvider>().refreshDownloads();
});
}
@@ -43,20 +40,13 @@ class _DownloadsScreenState extends State<DownloadsScreen> {
),
body: Consumer<DownloadsProvider>(
builder: (context, provider, child) {
print('📥 DownloadsScreen: Consumer builder called');
print('📥 isLoading: ${provider.isLoading}');
print('📥 error: ${provider.error}');
print('📥 torrents.length: ${provider.torrents.length}');
if (provider.isLoading) {
print('📥 → Showing CircularProgressIndicator');
return const Center(
child: CircularProgressIndicator(),
);
}
if (provider.error != null) {
print('📥 → Showing ErrorDisplay');
return ErrorDisplay(
title: 'Ошибка загрузки торрентов',
error: provider.error!,
@@ -68,7 +58,6 @@ class _DownloadsScreenState extends State<DownloadsScreen> {
}
if (provider.torrents.isEmpty) {
print('📥 → Showing empty state');
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@@ -98,7 +87,6 @@ class _DownloadsScreenState extends State<DownloadsScreen> {
);
}
print('📥 → Showing ${provider.torrents.length} torrents in list');
return RefreshIndicator(
onRefresh: () async {
await provider.refreshDownloads();