Skip to content

Commit

Permalink
send premiers
Browse files Browse the repository at this point in the history
  • Loading branch information
AnnaKhairillina committed Nov 24, 2024
1 parent 570eb80 commit df813d4
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 66 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -101,5 +101,10 @@
<version>3.1.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.4.46.v20220331</version>
</dependency>
</dependencies>
</project>
19 changes: 16 additions & 3 deletions src/main/java/org/oopproject/SiteRequests.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import feign.Param;
import feign.RequestLine;
import org.oopproject.deserializers.FilmDeserializer;
import org.oopproject.deserializers.*;
import org.oopproject.parameters.MovieParameters;
import org.oopproject.deserializers.AuthDeserializer;
import org.oopproject.deserializers.ListDeserializer;

import java.util.List;

public interface SiteRequests {

@RequestLine("GET /authentication?api_key={api_key}")
AuthDeserializer checkAuthStatus(@Param("api_key") String token);

Expand All @@ -17,6 +18,18 @@ public interface SiteRequests {
@RequestLine("GET /movie/{id}?api_key={api_key}")
FilmDeserializer getMovieById(@Param("api_key") String token, @Param("id") String id);

@RequestLine("GET /movie/upcoming?api_key={api_key}&language={language}&page={page}")
ListDeserializer findUpcomingMovies(@Param("api_key") String token,
@Param("language") String language,
@Param("page") int page);

@RequestLine("GET /movie/{id}/videos?api_key={api_key}&language={language}")
MovieVideosResponse getMovieVideos(@Param("api_key") String token,
@Param("id") String movieId,
@Param("language") String language);



@RequestLine("GET /discover/movie" +
"?api_key={api_key}" +
"&certification.lte={certification_lte}" +
Expand Down
178 changes: 115 additions & 63 deletions src/main/java/org/oopproject/TelegramBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import feign.Feign;
import feign.Logger;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import org.oopproject.deserializers.ListDeserializer;
import org.oopproject.deserializers.MovieVideosResponse;
import org.oopproject.deserializers.VideoDeserializer;
import org.oopproject.utils.CommandWaiter;
import org.oopproject.utils.Genres;
import org.oopproject.parameters.MovieParameters;
Expand All @@ -14,7 +20,8 @@
import static org.oopproject.utils.Replies.getReply;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.time.LocalDate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -44,8 +51,8 @@ public class TelegramBot implements LongPollingSingleThreadUpdateConsumer {

public TelegramBot(String botToken) throws SQLException {
telegramClient = new OkHttpTelegramClient(botToken);
startBroadcasting();
}
BroadcastingService broadcastingService = new BroadcastingService(); // Initialize BroadcastingService
broadcastingService.startBroadcasting(); }

@Override
public void consume(Update update) {
Expand Down Expand Up @@ -317,76 +324,121 @@ protected String handleAge(String messageText, long chatId) {
return responseMessage;
}

public List<FilmDeserializer> getUpcomingMovies() {
try {
// Получаем текущий год и месяц для фильтрации премьеров
LocalDate currentDate = LocalDate.now();
int currentYear = currentDate.getYear();
int currentMonth = currentDate.getMonthValue();

// Создаем параметры запроса для фильмов, которые были выпущены в текущем месяце
MovieParameters params = new MovieParameters(
"240e7fef369901fb314c80d53d1532d1", // Используйте ваш API ключ TMDb
"PG-13", // Уровень сертификации
"US", // Страна сертификации
false, // Без взрослых фильмов
"ru", // Язык (русский)
1, // Страница
"2024-11-01", // Начальная дата
currentDate.toString(), // Конечная дата
"release_date.asc", // Сортировка по дате релиза
0, // Минимальный рейтинг
10, // Максимальный рейтинг
"", // Жанры
"US", // Страна происхождения
0, // Минимальное время
currentYear // Год
);

// Выполнение запроса
ListDeserializer movieList = tmdbService.findMovie(params);
if (movieList != null && movieList.results != null) {
// Возвращаем первые 5 фильмов
return movieList.results.stream().limit(10).collect(Collectors.toList());
public class MovieService {

private SiteRequests siteRequests;
private int currentPage;

public MovieService() {
siteRequests = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.logLevel(Logger.Level.FULL)
.target(SiteRequests.class, "https://api.themoviedb.org/3");
this.currentPage = 1;
}

private boolean isUpcoming(String releaseDate) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date release = sdf.parse(releaseDate);
Date now = new Date();
return release.after(now);
} catch (ParseException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
public List<FilmDeserializer> getUpcomingMovies() {
try {
ListDeserializer upcomingMovies = siteRequests.findUpcomingMovies(
"240e7fef369901fb314c80d53d1532d1",
"ru",
currentPage
);

if (upcomingMovies != null && upcomingMovies.results != null) {
List<FilmDeserializer> resultList = upcomingMovies.results.stream()
.filter(movie -> isUpcoming(movie.release_date))
.limit(10) // Ограничиваем до 10 фильмов
.collect(Collectors.toList());
for (FilmDeserializer movie : resultList) {
MovieVideosResponse videoResponse = siteRequests.getMovieVideos(
"240e7fef369901fb314c80d53d1532d1",
String.valueOf(movie.id),
"ru"
);

if (videoResponse != null && videoResponse.results != null && !videoResponse.results.isEmpty()) {
// Найдем первый трейлер (если он есть)
VideoDeserializer trailer = videoResponse.results.stream()
.filter(v -> v.site.equals("YouTube"))
.findFirst()
.orElse(null);

if (trailer != null) {
// Формируем ссылку на трейлер
movie.trailerUrl = "https://www.youtube.com/watch?v=" + trailer.key;
}
}
}
currentPage++;
return resultList;
}
} catch (Exception e) {
e.printStackTrace();
}
return Collections.emptyList();
}
return Collections.emptyList();
}

public class BroadcastingService {

private MovieService movieService;

public BroadcastingService() {
this.movieService = new MovieService();
}

public void startBroadcasting() {
scheduler.scheduleAtFixedRate(() -> {
List<Long> subscribedUsers = database.getSubscribedUsers();
List<FilmDeserializer> upcomingMovies = getUpcomingMovies(); // Получаем премьеры

for (Long chatId : subscribedUsers) {
StringBuilder messageText = new StringBuilder("🎬 Фильмы премьеры:\n");

if (upcomingMovies.isEmpty()) {
messageText.append("К сожалению, нет новых фильмов на данный момент.");
} else {
for (int i = 0; i < upcomingMovies.size(); i++) {
FilmDeserializer movie = upcomingMovies.get(i);
messageText.append(i + 1)
.append(". ")
.append(movie.title)
.append("\n")
.append("Дата выхода: ")
.append(movie.release_date)
.append("\n")
.append("Рейтинг: ")
.append(movie.vote_average)
.append("\n\n");
public void startBroadcasting() {
scheduler.scheduleAtFixedRate(() -> {
List<Long> subscribedUsers = database.getSubscribedUsers();
List<FilmDeserializer> upcomingMovies = movieService.getUpcomingMovies();

for (Long chatId : subscribedUsers) {
StringBuilder messageText = new StringBuilder("🎬 Фильмы, которые скоро выйдут:\n");

if (upcomingMovies.isEmpty()) {
messageText.append("К сожалению, нет новых фильмов на данный момент.");
} else {
for (int i = 0; i < upcomingMovies.size(); i++) {
FilmDeserializer movie = upcomingMovies.get(i);
messageText.append(i + 1)
.append(". ")
.append(movie.title)
.append("\n")
.append("Дата выхода: ")
.append(movie.release_date)
.append("\n")
.append("Описание: ")
.append(movie.overview != null && !movie.overview.isEmpty() ? movie.overview : "Нет описания")
.append("\n");
if (movie.trailerUrl != null) {
messageText.append("Ссылка на трейлер: ").append(movie.trailerUrl).append("\n");
}

messageText.append("\n");
}
}
sendMessage(chatId, messageText.toString());
}
sendMessage(chatId, messageText.toString()); // Отправляем сообщение
}
}, 0, 1, TimeUnit.MINUTES); // С интервалом в 1 минуту
}, 0, 1, TimeUnit.MINUTES);
}
}




private void sendMessage(long chatId, String text) {
SendMessage message=SendMessage.builder()
.chatId(chatId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class FilmDeserializer {
public boolean video;
public double vote_average;
public double vote_count;
public String trailerUrl;
// public boolean belongs_to_collection;
// public List<FilmDeserializer> production_companies;
// public List<FilmDeserializer> production_countries;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.oopproject.deserializers;

import com.google.gson.annotations.SerializedName;
import java.util.List;

public class MovieVideosResponse {
@SerializedName("results")
public List<VideoDeserializer> results; // Список видео

// Конструкторы и методы, если нужно
}
16 changes: 16 additions & 0 deletions src/main/java/org/oopproject/deserializers/VideoDeserializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.oopproject.deserializers;

import com.google.gson.annotations.SerializedName;

public class VideoDeserializer {
@SerializedName("key")
public String key; // Ключ видео, который будет использоваться для ссылки

@SerializedName("name")
public String name; // Название видео (например, "Трейлер")

@SerializedName("site")
public String site; // Платформа видео (например, "YouTube")

// Конструкторы и методы, если нужно
}

0 comments on commit df813d4

Please sign in to comment.