Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.24 KB | None | 0 0
  1. package com.upnetix.java.plexnikolaygeorgiev.repositories.external;
  2.  
  3. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceAudioCodecs;
  4. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceEpisode;
  5. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceMediaExtended;
  6. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceMediaStream;
  7. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceMovie;
  8. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceSeason;
  9. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceSeries;
  10. import com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceSubtitleCodecs;
  11. import com.upnetix.java.plexnikolaygeorgiev.exceptions.ExternalDatabaseException;
  12. import com.upnetix.java.plexnikolaygeorgiev.repositories.external.utils.SourceRepositoryUtils;
  13. import com.upnetix.java.plexnikolaygeorgiev.services.DbMigrationService;
  14. import java.sql.Connection;
  15. import java.sql.PreparedStatement;
  16. import java.sql.ResultSet;
  17. import java.sql.SQLException;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.concurrent.ConcurrentHashMap;
  21. import java.util.concurrent.ConcurrentMap;
  22. import javax.sql.DataSource;
  23. import lombok.extern.slf4j.Slf4j;
  24. import org.apache.commons.lang3.EnumUtils;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.springframework.beans.factory.annotation.Autowired;
  27. import org.springframework.beans.factory.annotation.Qualifier;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
  30. import org.springframework.stereotype.Repository;
  31.  
  32.  
  33. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.CODEC;
  34. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.FETCH_SIZE;
  35. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.LANGUAGE;
  36. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.MOVIES_QUERY;
  37. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.SERIES_SEASONS_EPISODES_QUERY;
  38. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.STREAM_QUERY;
  39. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.STREAM_TYPE_ID_2;
  40. import static com.upnetix.java.plexnikolaygeorgiev.entities.external.SourceConstants.STREAM_TYPE_ID_3;
  41. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.CONNECTION_ERROR;
  42. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.MIGRATION_PROCESS_COMPLETED;
  43. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.MOVIE_FETCHING;
  44. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.MOVIE_MIGRATION;
  45. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.SERIES_FETCHING;
  46. import static com.upnetix.java.plexnikolaygeorgiev.logger.LoggerMessages.SERIES_MIGRATION;
  47. import static com.upnetix.java.plexnikolaygeorgiev.logger.MigrationProgress.COMPLETED_MOVIES_SERIES_MIGRATION;
  48. import static com.upnetix.java.plexnikolaygeorgiev.logger.MigrationProgress.FETCHING_MOVIES;
  49. import static com.upnetix.java.plexnikolaygeorgiev.logger.MigrationProgress.FETCHING_SERIES;
  50. import static com.upnetix.java.plexnikolaygeorgiev.logger.MigrationProgress.MIGRATING_MOVIES;
  51. import static com.upnetix.java.plexnikolaygeorgiev.logger.MigrationProgress.MIGRATING_SERIES;
  52.  
  53. @Repository
  54. @Slf4j
  55. public class SourceRepositoryImpl implements SourceRepository {
  56.   @Value("${url.start}")
  57.   private String urlStart;
  58.   private DataSource dataSource;
  59.   private DbMigrationService migrationService;
  60.   private Connection connection;
  61.   @Value("${upload.file.directory}")
  62.   private String uploadDirectory;
  63.   private ConcurrentMap<String, Integer> progress = new ConcurrentHashMap<>();
  64.   private boolean hasFinished;
  65.  
  66.   @Autowired
  67.   public SourceRepositoryImpl(@Qualifier("sqliteDataSource") DataSource dataSource, DbMigrationService migrationService) {
  68.     this.dataSource = dataSource;
  69.     this.migrationService = migrationService;
  70.   }
  71.  
  72.  
  73.   @Override
  74.   public void fetchMedia(String jwt, String fileName) throws SQLException {
  75.     if (StringUtils.isEmpty(fileName)) {
  76.       log.error(CONNECTION_ERROR);
  77.       throw new ExternalDatabaseException(CONNECTION_ERROR);
  78.     }
  79.     synchronized (this) {
  80.       dataSource = DataSourceBuilder.create().url(urlStart + uploadDirectory + fileName).build();
  81.       connection = dataSource.getConnection();
  82.       fetchMovies(jwt);
  83.       fetchSeries(jwt);
  84.       connection.close();
  85.     }
  86.     log.info(MIGRATION_PROCESS_COMPLETED);
  87.     progress.put(jwt, COMPLETED_MOVIES_SERIES_MIGRATION.getStep());
  88.     hasFinished = true;
  89.   }
  90.  
  91.   @Override
  92.   public int getStatus(String jwt) {
  93.     if (hasFinished) {
  94.       hasFinished = false;
  95.       int result = this.progress.getOrDefault(jwt, 0);
  96.       this.progress.put(jwt, 0);
  97.       return result;
  98.     }
  99.     return this.progress.getOrDefault(jwt, 0);
  100.   }
  101.  
  102.   private void fetchMovies(String jwt) throws SQLException {
  103.     progress.put(jwt, FETCHING_MOVIES.getStep());
  104.     log.info(MOVIE_FETCHING);
  105.     PreparedStatement statement = connection.prepareStatement(MOVIES_QUERY);
  106.     SourceRepositoryUtils.prepareMoviesStatement(statement);
  107.  
  108.     ResultSet resultSet = statement.executeQuery();
  109.     List<SourceMovie> sourceMovies = new ArrayList<>(FETCH_SIZE);
  110.     while (resultSet.next()) {
  111.       SourceMovie sourceMovie = SourceMovie.generateFromResultSet(resultSet);
  112.  
  113.       sourceMovies.add(sourceMovie);
  114.     }
  115.  
  116.     sourceMovies = removeDuplicates(sourceMovies);
  117.  
  118.     for (SourceMovie sourceMovie : sourceMovies) {
  119.       setStreamsToMedia(sourceMovie);
  120.     }
  121.  
  122.     progress.put(jwt, MIGRATING_MOVIES.getStep());
  123.     log.info(MOVIE_MIGRATION);
  124.     migrationService.migrateMovies(sourceMovies);
  125.     statement.close();
  126.   }
  127.  
  128.   private List<SourceMovie> removeDuplicates(List<SourceMovie> sourceMovies) {
  129.     List<SourceMovie> result = new ArrayList<>(sourceMovies.size());
  130.  
  131.     for (SourceMovie sourceMovie : sourceMovies) {
  132.       if (!result.contains(sourceMovie)) {
  133.         result.add(sourceMovie);
  134.       }
  135.     }
  136.  
  137.     return result;
  138.   }
  139.  
  140.  
  141.   private void fetchSeries(String jwt) throws SQLException {
  142.     progress.put(jwt, FETCHING_SERIES.getStep());
  143.     log.info(SERIES_FETCHING);
  144.     PreparedStatement statement = connection.prepareStatement(SERIES_SEASONS_EPISODES_QUERY);
  145.     SourceRepositoryUtils.prepareSeriesStatement(statement);
  146.     ResultSet resultSet = statement.executeQuery();
  147.     List<SourceSeries> seriesResults = new ArrayList<>(100);
  148.  
  149.     while (resultSet.next()) {
  150.       SourceSeries sourceSeries = SourceSeries.generateFromResultSet(resultSet);
  151.       generateContentForSeries(resultSet, sourceSeries, seriesResults);
  152.     }
  153.  
  154.     progress.put(jwt, MIGRATING_SERIES.getStep());
  155.     log.info(SERIES_MIGRATION);
  156.     migrationService.migrateSeries(seriesResults);
  157.     statement.close();
  158.   }
  159.  
  160.   private void generateContentForSeries(ResultSet resultSet, SourceSeries sourceSeries,
  161.       List<SourceSeries> seriesResults) throws SQLException {
  162.     if (seriesResults.contains(sourceSeries)) {
  163.       sourceSeries = seriesResults.remove(seriesResults.indexOf(sourceSeries));
  164.     }
  165.     SourceSeason sourceSeason = SourceSeason.generateFromResultSet(resultSet, sourceSeries);
  166.     if (sourceSeries.getSeasons() != null && sourceSeries.getSeasons().contains(sourceSeason)) {
  167.       sourceSeason = sourceSeries.getSeasons().remove(sourceSeries.getSeasons().indexOf(sourceSeason));
  168.     }
  169.     SourceEpisode sourceEpisode = SourceEpisode.generateFromResultSet(resultSet, sourceSeason);
  170.  
  171.     setStreamsToMedia(sourceEpisode);
  172.  
  173.     sourceSeason.addEpisode(sourceEpisode);
  174.     sourceSeries.addSeason(sourceSeason);
  175.     seriesResults.add(sourceSeries);
  176.   }
  177.  
  178.   private List<SourceMediaStream> fetchStream(Long metadataItemId) throws SQLException {
  179.     PreparedStatement statement = connection.prepareStatement(STREAM_QUERY);
  180.     statement.setInt(1, STREAM_TYPE_ID_2);
  181.     statement.setInt(2, STREAM_TYPE_ID_3);
  182.     statement.setLong(3, metadataItemId);
  183.     ResultSet resultSet = statement.executeQuery();
  184.     List<SourceMediaStream> results = new ArrayList<>(2);
  185.  
  186.     while (resultSet.next()) {
  187.       SourceMediaStream sourceMediaStream = new SourceMediaStream();
  188.       sourceMediaStream.setCodec(resultSet.getString(CODEC));
  189.       sourceMediaStream.setLanguage(resultSet.getString(LANGUAGE));
  190.       results.add(sourceMediaStream);
  191.     }
  192.  
  193.     statement.close();
  194.     return results;
  195.   }
  196.  
  197.   private void setStreamsToMedia(SourceMediaExtended sourceMedia) throws SQLException {
  198.     List<SourceMediaStream> mediaStreams = fetchStream(Long.valueOf(sourceMedia.getId()));
  199.     for (SourceMediaStream mediaStream : mediaStreams) {
  200.       if (EnumUtils.isValidEnum(SourceSubtitleCodecs.class, mediaStream.getCodec().toUpperCase())
  201.           && mediaStream.getLanguage().length() > 0) {
  202.         sourceMedia.addSubtitles(mediaStream.getLanguage());
  203.       }
  204.       if (EnumUtils.isValidEnum(SourceAudioCodecs.class, mediaStream.getCodec().toUpperCase())
  205.           && mediaStream.getLanguage().length() > 0) {
  206.         sourceMedia.addAudio(mediaStream.getLanguage());
  207.       }
  208.     }
  209.   }
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement