|
1 | | -# Содержание |
2 | | - |
3 | | -## Filter/ |
4 | | - |
5 | | -* [ReviewSearchFilter](Filter/ReviewSearchFilter.md) |
6 | | -* [SortCriteria](Filter/SortCriteria.md) |
7 | | -* [MovieSearchFilter](Filter/MovieSearchFilter.md) |
8 | | -* [SeasonSearchFilter](Filter/SeasonSearchFilter.md) |
9 | | -* [StudioSearchFilter](Filter/StudioSearchFilter.md) |
10 | | -* [ImageSearchFilter](Filter/ImageSearchFilter.md) |
11 | | -* [KeywordSearchFilter](Filter/KeywordSearchFilter.md) |
12 | | -* [PersonSearchFilter](Filter/PersonSearchFilter.md) |
13 | | -## Contracts/ |
14 | | - |
15 | | -* [CacheInterface](Contracts/CacheInterface.md) |
16 | | -* [LoggerInterface](Contracts/LoggerInterface.md) |
17 | | -## Utils/ |
18 | | - |
19 | | -* [DataManager](Utils/DataManager.md) |
20 | | -* [FilterTrait](Utils/FilterTrait.md) |
21 | | -* [SortManager](Utils/SortManager.md) |
22 | | -* [MovieFilter](Utils/MovieFilter.md) |
23 | | -## Models/ |
24 | | - |
25 | | -* [Spouses](Models/Spouses.md) |
26 | | -* [FactInMovie](Models/FactInMovie.md) |
27 | | -* [Rating](Models/Rating.md) |
28 | | -* [WatchabilityItem](Models/WatchabilityItem.md) |
29 | | -* [ExternalId](Models/ExternalId.md) |
30 | | -* [CurrencyValue](Models/CurrencyValue.md) |
31 | | -* [Name](Models/Name.md) |
32 | | -* [FactInPerson](Models/FactInPerson.md) |
33 | | -* [NominationAward](Models/NominationAward.md) |
34 | | -* [YearRange](Models/YearRange.md) |
35 | | -* [Networks](Models/Networks.md) |
36 | | -* [Watchability](Models/Watchability.md) |
37 | | -* [Movie](Models/Movie.md) |
38 | | -* [MovieInPerson](Models/MovieInPerson.md) |
39 | | -* [Season](Models/Season.md) |
40 | | -* [NetworkItem](Models/NetworkItem.md) |
41 | | -* [PersonPlace](Models/PersonPlace.md) |
42 | | -* [MeiliPersonEntity](Models/MeiliPersonEntity.md) |
43 | | -* [Video](Models/Video.md) |
44 | | -* [DeathPlace](Models/DeathPlace.md) |
45 | | -* [PersonAward](Models/PersonAward.md) |
46 | | -* [LinkedMovie](Models/LinkedMovie.md) |
47 | | -* [ItemName](Models/ItemName.md) |
48 | | -* [SeasonInfo](Models/SeasonInfo.md) |
49 | | -* [Logo](Models/Logo.md) |
50 | | -* [Image](Models/Image.md) |
51 | | -* [Review](Models/Review.md) |
52 | | -* [BirthPlace](Models/BirthPlace.md) |
53 | | -* [Votes](Models/Votes.md) |
54 | | -* [ReviewInfo](Models/ReviewInfo.md) |
55 | | -* [PersonInMovie](Models/PersonInMovie.md) |
56 | | -* [Episode](Models/Episode.md) |
57 | | -* [Audience](Models/Audience.md) |
58 | | -* [ApiImage](Models/ApiImage.md) |
59 | | -* [Premiere](Models/Premiere.md) |
60 | | -* [Lists](Models/Lists.md) |
61 | | -* [BaseModel](Models/BaseModel.md) |
62 | | -* [MovieFromKeyword](Models/MovieFromKeyword.md) |
63 | | -* [Nomination](Models/Nomination.md) |
64 | | -* [Fees](Models/Fees.md) |
65 | | -* [MovieAward](Models/MovieAward.md) |
66 | | -* [SearchMovie](Models/SearchMovie.md) |
67 | | -* [Person](Models/Person.md) |
68 | | -* [AbstractBaseModel](Models/AbstractBaseModel.md) |
69 | | -* [Studio](Models/Studio.md) |
70 | | -* [Keyword](Models/Keyword.md) |
71 | | -* [VideoTypes](Models/VideoTypes.md) |
72 | | -* [ShortImage](Models/ShortImage.md) |
73 | | -* [MovieFromStudio](Models/MovieFromStudio.md) |
74 | | -## Http/ |
75 | | - |
76 | | -* [StudioRequests](Http/StudioRequests.md) |
77 | | -* [MovieRequests](Http/MovieRequests.md) |
78 | | -* [ImageRequests](Http/ImageRequests.md) |
79 | | -* [KeywordRequests](Http/KeywordRequests.md) |
80 | | -* [PersonRequests](Http/PersonRequests.md) |
81 | | -* [SeasonRequests](Http/SeasonRequests.md) |
82 | | -* [ListRequests](Http/ListRequests.md) |
83 | | -* [ReviewRequests](Http/ReviewRequests.md) |
84 | | -## Enums/ |
85 | | - |
86 | | -* [ListCategory](Enums/ListCategory.md) |
87 | | -* [FilterOperator](Enums/FilterOperator.md) |
88 | | -* [SortDirection](Enums/SortDirection.md) |
89 | | -* [ImageType](Enums/ImageType.md) |
90 | | -* [PersonProfession](Enums/PersonProfession.md) |
91 | | -* [MovieType](Enums/MovieType.md) |
92 | | -* [HttpStatusCode](Enums/HttpStatusCode.md) |
93 | | -* [ReviewType](Enums/ReviewType.md) |
94 | | -* [RatingMpaa](Enums/RatingMpaa.md) |
95 | | -* [MovieStatus](Enums/MovieStatus.md) |
96 | | -* [StudioType](Enums/StudioType.md) |
97 | | -* [FilterField](Enums/FilterField.md) |
98 | | -* [SortField](Enums/SortField.md) |
99 | | -* [PersonSex](Enums/PersonSex.md) |
100 | | -## |
101 | | - |
102 | | -* [Kinopoisk](Kinopoisk.md) |
103 | | -## Exceptions/ |
104 | | - |
105 | | -* [KinopoiskResponseException](Exceptions/KinopoiskResponseException.md) |
106 | | -* [ValidationException](Exceptions/ValidationException.md) |
107 | | -* [KinopoiskDevException](Exceptions/KinopoiskDevException.md) |
108 | | -## Services/ |
109 | | - |
110 | | -* [CacheService](Services/CacheService.md) |
111 | | -* [ValidationService](Services/ValidationService.md) |
112 | | -## Responses/ |
113 | | - |
114 | | -* [ErrorResponseDto](Responses/ErrorResponseDto.md) |
115 | | -* [BaseDocsResponseDto](Responses/BaseDocsResponseDto.md) |
116 | | -* [BaseResponseDto](Responses/BaseResponseDto.md) |
117 | | -## Responses/Api/ |
118 | | - |
119 | | -* [ImageDocsResponseDto](Responses/Api/ImageDocsResponseDto.md) |
120 | | -* [PersonDocsResponseDto](Responses/Api/PersonDocsResponseDto.md) |
121 | | -* [MovieAwardDocsResponseDto](Responses/Api/MovieAwardDocsResponseDto.md) |
122 | | -* [PossibleValueDto](Responses/Api/PossibleValueDto.md) |
123 | | -* [KeywordDocsResponseDto](Responses/Api/KeywordDocsResponseDto.md) |
124 | | -* [MovieDocsResponseDto](Responses/Api/MovieDocsResponseDto.md) |
125 | | -* [SearchMovieResponseDto](Responses/Api/SearchMovieResponseDto.md) |
126 | | -* [ListDocsResponseDto](Responses/Api/ListDocsResponseDto.md) |
127 | | -* [SearchPersonResponseDto](Responses/Api/SearchPersonResponseDto.md) |
128 | | -* [ReviewDocsResponseDto](Responses/Api/ReviewDocsResponseDto.md) |
129 | | -* [SeasonDocsResponseDto](Responses/Api/SeasonDocsResponseDto.md) |
130 | | -* [StudioDocsResponseDto](Responses/Api/StudioDocsResponseDto.md) |
131 | | -* [PersonAwardDocsResponseDto](Responses/Api/PersonAwardDocsResponseDto.md) |
132 | | -* [SearchStudioResponseDto](Responses/Api/SearchStudioResponseDto.md) |
133 | | -## Responses/Errors/ |
134 | | - |
135 | | -* [NotFoundErrorResponseDto](Responses/Errors/NotFoundErrorResponseDto.md) |
136 | | -* [UnauthorizedErrorResponseDto](Responses/Errors/UnauthorizedErrorResponseDto.md) |
137 | | -* [ForbiddenErrorResponseDto](Responses/Errors/ForbiddenErrorResponseDto.md) |
138 | | -## Attributes/ |
139 | | - |
140 | | -* [ApiField](Attributes/ApiField.md) |
141 | | -* [Sensitive](Attributes/Sensitive.md) |
142 | | -* [Validation](Attributes/Validation.md) |
| 1 | +# KinopoiskDev PHP Wrapper |
| 2 | + |
| 3 | +Современная PHP библиотека для работы с API [kinopoisk.dev](https://kinopoisk.dev) - неофициальным API КиноПоиска. |
| 4 | + |
| 5 | +## 🚀 Особенности |
| 6 | + |
| 7 | +- **Современный подход** - использует PHP 8.3+ атрибуты и строгую типизацию |
| 8 | +- **Расширенные фильтры** - гибкая система фильтрации с поддержкой диапазонов |
| 9 | +- **Автоматическая валидация** - декларативная валидация через атрибуты |
| 10 | +- **PSR стандарты** - совместимость с PSR-3 для логирования |
| 11 | +- **Активная поддержка** - [Telegram группа](https://t.me/omdb_dev) с 7,908 участниками |
| 12 | +- **Модульная архитектура** - четкое разделение ответственности |
| 13 | + |
| 14 | +## 📦 Установка |
| 15 | + |
| 16 | +```bash |
| 17 | +composer require devcraftclub/kinopoisk-dev |
| 18 | +``` |
| 19 | + |
| 20 | +## 🔧 Быстрый старт |
| 21 | + |
| 22 | +```php |
| 23 | +<?php |
| 24 | + |
| 25 | +use KinopoiskDev\Http\MovieRequests; |
| 26 | +use KinopoiskDev\Filter\MovieSearchFilter; |
| 27 | + |
| 28 | +// Создание клиента |
| 29 | +$request = new MovieRequests(apiToken: 'your-api-token'); |
| 30 | + |
| 31 | +// Поиск фильмов с расширенными фильтрами |
| 32 | +$filter = new MovieSearchFilter(); |
| 33 | +$filter->withYearBetween(2020, 2024) |
| 34 | + ->withMinRating(7.0, 'kp') |
| 35 | + ->withAllGenres(['драма', 'комедия']) |
| 36 | + ->onlyMovies(); |
| 37 | + |
| 38 | +$movies = $request->searchMovies($filter); |
| 39 | + |
| 40 | +// Получение информации о фильме |
| 41 | +$movie = $request->getMovieById(301); |
| 42 | +echo $movie->name; // "Матрица" |
| 43 | +``` |
| 44 | + |
| 45 | +## 🏗️ Архитектура |
| 46 | + |
| 47 | +### Основные компоненты |
| 48 | + |
| 49 | +- **Kinopoisk** - главный класс для работы с API |
| 50 | +- **Фильтры** - специализированные классы для разных типов поиска |
| 51 | +- **Модели** - типизированные объекты для данных |
| 52 | +- **Атрибуты** - декларативная валидация и конфигурация |
| 53 | +- **Сервисы** - бизнес-логика и утилиты |
| 54 | + |
| 55 | +### Структура проекта |
| 56 | + |
| 57 | +``` |
| 58 | +KinopoiskDev/ |
| 59 | +├── Attributes/ # PHP 8.3+ атрибуты |
| 60 | +├── Contracts/ # Интерфейсы (PSR-3, кэширование) |
| 61 | +├── Enums/ # Перечисления |
| 62 | +├── Exceptions/ # Специализированные исключения |
| 63 | +├── Filter/ # Классы фильтров |
| 64 | +├── Http/ # HTTP запросы |
| 65 | +├── Models/ # Модели данных |
| 66 | +├── Responses/ # Ответы API |
| 67 | +├── Services/ # Сервисы |
| 68 | +└── Utils/ # Утилиты |
| 69 | +``` |
| 70 | + |
| 71 | +## 🔍 Возможности |
| 72 | + |
| 73 | +### Поиск фильмов |
| 74 | + |
| 75 | +```php |
| 76 | +$filter = new MovieSearchFilter(); |
| 77 | +$filter->withYearBetween(2020, 2024) |
| 78 | + ->withMinRating(7.0, 'kp') |
| 79 | + ->withAllGenres(['драма', 'комедия']) |
| 80 | + ->onlyMovies() |
| 81 | + ->inTop250(); |
| 82 | + |
| 83 | +$movies = $kinopoisk->searchMovies($filter); |
| 84 | +``` |
| 85 | + |
| 86 | +### Поиск персон |
| 87 | + |
| 88 | +```php |
| 89 | +$filter = new PersonSearchFilter(); |
| 90 | +$filter->onlyActors() |
| 91 | + ->ageRange(30, 50) |
| 92 | + ->withMinRating(7.0, 'kp'); |
| 93 | + |
| 94 | +$persons = $kinopoisk->searchPersons($filter); |
| 95 | +``` |
| 96 | + |
| 97 | +### Работа с изображениями |
| 98 | + |
| 99 | +```php |
| 100 | +$filter = new ImageSearchFilter(); |
| 101 | +$filter->onlyPosters() |
| 102 | + ->minResolution(1920, 1080) |
| 103 | + ->onlyHighRes(); |
| 104 | + |
| 105 | +$images = $kinopoisk->getMovieImages(301, $filter); |
| 106 | +``` |
| 107 | + |
| 108 | +### Автоматическая валидация |
| 109 | + |
| 110 | +```php |
| 111 | +class Movie { |
| 112 | + #[Validation(required: true, minLength: 1, maxLength: 255)] |
| 113 | + public string $title; |
| 114 | + |
| 115 | + #[Validation(min: 1900, max: 2030)] |
| 116 | + public int $year; |
| 117 | + |
| 118 | + #[Sensitive(hideInJson: true)] |
| 119 | + public string $apiToken; |
| 120 | +} |
| 121 | +``` |
| 122 | + |
| 123 | +## 🛡️ Безопасность |
| 124 | + |
| 125 | +- **Атрибут `#[Sensitive]`** - автоматическое скрытие конфиденциальных данных |
| 126 | +- **Валидация входных данных** - защита от некорректных параметров |
| 127 | +- **Типизированные модели** - предотвращение ошибок типов |
| 128 | + |
| 129 | +## 📚 Документация |
| 130 | + |
| 131 | +- **[Основной класс](Kinopoisk.md)** - главный клиент API |
| 132 | +- **[Атрибуты](Attributes/)** - валидация и конфигурация |
| 133 | +- **[Фильтры](Filter/)** - система фильтрации |
| 134 | +- **[Модели](Models/)** - структуры данных |
| 135 | +- **[Исключения](Exceptions/)** - обработка ошибок |
| 136 | + |
| 137 | +## 🔗 Полезные ссылки |
| 138 | + |
| 139 | +- **[kinopoisk.dev](https://kinopoisk.dev)** - официальный сайт API |
| 140 | +- **[Telegram группа](https://t.me/omdb_dev)** - активное сообщество (7,908 участников) |
| 141 | +- **[Сравнение с KinopoiskUnofficialTech](notkinopoiskphp-compare.md)** - различия между библиотеками |
| 142 | + |
| 143 | +## 🤝 Поддержка |
| 144 | + |
| 145 | +- **Telegram**: [@omdb_dev](https://t.me/omdb_dev) - основная группа поддержки |
| 146 | +- **Email**: поддержка через Telegram группу |
| 147 | +- **Документация**: полная документация в этом разделе |
| 148 | + |
| 149 | +## 📄 Лицензия |
| 150 | + |
| 151 | +MIT License - см. файл [LICENSE](LICENSE) для деталей. |
| 152 | + |
| 153 | +## 🆚 Сравнение с альтернативами |
| 154 | + |
| 155 | +| Особенность | KinopoiskDev | KinopoiskUnofficialTech | |
| 156 | +| --------------- | -------------------------------------- | --------------------------- | |
| 157 | +| **API** | [kinopoisk.dev](https://kinopoisk.dev) | kinopoiskapiunofficial.tech | |
| 158 | +| **Поддержка** | ✅ Активная (Telegram) | ❌ Отсутствует | |
| 159 | +| **PHP версия** | 8.3+ | 8.3+ | |
| 160 | +| **Архитектура** | Модульная | Монолитная | |
| 161 | +| **Валидация** | Автоматическая | Ручная | |
| 162 | +| **Фильтры** | Расширенные | Базовые | |
| 163 | + |
| 164 | +## 🚀 Миграция |
| 165 | + |
| 166 | +Если вы используете KinopoiskUnofficialTech, см. [руководство по миграции](notkinopoiskphp-compare.md#миграция). |
| 167 | + |
| 168 | +--- |
| 169 | + |
| 170 | +**KinopoiskDev** - современное решение для работы с API КиноПоиска с активной поддержкой и развитием. |
0 commit comments