@Query("SELECT DISTINCT(a.playlist) FROM Asset a ORDER BY a.playlist")
List<String> queryDistinctPlaylists();
- @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist and a.sunrise <= :currentDate ORDER BY a.seasonNr, a.episodeNr")
+ @Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist AND a.sunrise <= :currentDate AND a.sunset >= :currentDate ORDER BY a.seasonNr, a.episodeNr")
List<Long> queryPlaylistsAssetsByDate(String playlist, Date currentDate);
@Query("SELECT a.id FROM Asset a WHERE a.playlist = :playlist AND a.listed = TRUE ORDER BY a.seasonNr, a.episodeNr")
Optional<Asset> findByCatalogIdAndPlaylist(String catalogId, String playlist);
- @Query("SELECT a FROM Asset a WHERE a.sunset < :currentDate ORDER BY a.catalogId")
+ @Query("SELECT a FROM Asset a WHERE a.sunset < :currentDate AND a.listed = TRUE ORDER BY a.catalogId")
List<Asset> queryExpired(Date currentDate);
@Modifying
- @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.listed = FALSE AND a.id IN (:ids)")
- void updateListed(List<Long> ids);
+ @Query("UPDATE Asset a SET a.listed = TRUE WHERE a.id IN (:ids)")
+ @Transactional
+ void updateSetListed(List<Long> ids);
@Modifying
@Query("UPDATE Asset a SET a.listed = FALSE")
void clearListed();
@Modifying
- @Query("DELETE FROM Asset a WHERE a.sunset < :currentDate")
+ @Query("UPDATE Asset a SET a.listed = FALSE WHERE a.id IN (:ids)")
@Transactional
- void deleteExpired(Date currentDate);
+ void updateSetUnlisted(List<Long> ids);
@Query("SELECT a.referenceId FROM Asset a WHERE a.id = :id")
String findReferenceIdById(Long id);
private Summary video = Summary.builder().build();
@Builder.Default
- private Summary playlist = Summary.builder().build();
+ private PlaylistSummary playlist = PlaylistSummary.builder().build();
private Instant started;
System.lineSeparator() +
String.format("Playlist success count: %d, error count: %d, skip count: %d", playlist.getSuccess(), playlist.getError(), playlist.getSkip()) +
System.lineSeparator() +
- String.format("Playlist insert count: %d, update count: %d, delete count: %d", playlist.getInsert(), playlist.getUpdate(), playlist.getDelete());
+ String.format("Playlist insert count: %d, update count: %d, delete count: %d", playlist.getInsert(), playlist.getUpdate(), playlist.getDelete()) +
+ System.lineSeparator() +
+ String.format("Sunrise: %s", String.join(",", playlist.getSunrises())) +
+ System.lineSeparator() +
+ String.format("Sunset: %s", String.join(",", playlist.getSunsets()));
}
public String getDuration() {
+ if (Objects.isNull(started) || Objects.isNull(finished)) {
+ return StringUtils.EMPTY;
+ }
Duration executionDuration = Duration.between(started, finished);
return DurationFormatUtils.formatDuration(executionDuration.toMillis(), "H:mm:ss", true);
}
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.time.LocalDate;
if (new Date().after(asset.getSunset())) {
summary.getVideo().incSkip();
if (assetSync.getSyncType() == SyncType.UPDATE) {
- assetRepository.saveAndFlush(asset);
+ assetRepository.save(asset);
}
} else {
if (Objects.nonNull(assetSync.getSyncType())) {
- assetRepository.saveAndFlush(asset);
+ assetRepository.save(asset);
assetSync.setAssetId(asset.getId());
- assetSyncRepository.saveAndFlush(assetSync);
+ assetSyncRepository.save(assetSync);
}
if (assetSync.getSyncType() == SyncType.UPDATE) {
}
}
- public void removeExpired(CompositeSummary summary) {
+ public void unlistExpired(CompositeSummary summary) {
List<Asset> expiredAssets = assetRepository.queryExpired(checkDate);
if (!expiredAssets.isEmpty()) {
- assetRepository.deleteExpired(checkDate);
+ List<Long> ids = expiredAssets.stream().map(Asset::getId).collect(Collectors.toList());
+ assetRepository.updateSetUnlisted(ids);
List<AssetSync> syncs = expiredAssets.stream().map(asset -> AssetSync.builder()
.assetId(asset.getId())
.catalogId(asset.getCatalogId())
.syncType(SyncType.DELETE)
.build()).collect(Collectors.toList());
- assetSyncRepository.saveAllAndFlush(syncs);
+ assetSyncRepository.saveAll(syncs);
summary.getVideo().setDelete(expiredAssets.size());
}
}
- @Transactional
public void processPlaylists(CompositeSummary summary) {
currentPlaylists = getPlayLists();
- removeExpired(summary);
+ unlistExpired(summary);
checkPlaylists(summary);
}
Collection<String> playlistNamesDifference = CollectionUtils.subtract(currentPlaylistNames, newPlaylistNames);
if (!playlistNamesDifference.isEmpty()) {
- playlistNamesDifference.forEach(name -> {
- PlaylistSync sync = PlaylistSync.builder()
- .name(name)
- .syncType(SyncType.DELETE)
- .created(Date.from(Instant.now()))
- .build();
- playlistSyncRepository.saveAndFlush(sync);
- summary.getPlaylist().incDelete();
- });
+ handleDeletedPlaylists(summary, playlistNamesDifference);
}
playlistNamesDifference = CollectionUtils.subtract(newPlaylistNames, currentPlaylistNames);
if (!playlistNamesDifference.isEmpty()) {
- playlistNamesDifference.forEach(name -> {
+ handleAddedPlaylist(summary, playlistNamesDifference, newPlaylists);
+ }
+
+ handleUpdatesPlaylist(summary, currentPlaylistNames, newPlaylists);
+ }
+
+ private void handleUpdatesPlaylist(CompositeSummary summary, Set<String> currentPlaylistNames, Map<String, List<Long>> newPlaylists) {
+ currentPlaylistNames.forEach(name -> {
+ List<Long> currentContent = currentPlaylists.get(name);
+ List<Long> newContent = newPlaylists.get(name);
+
+ if (Objects.nonNull(currentContent) && isContentChanged(currentContent, newContent)) {
+ try {
+ PlaylistSync sync = PlaylistSync.builder()
+ .name(name)
+ .syncType(SyncType.UPDATE)
+ .ids(newContent)
+ .created(Date.from(Instant.now()))
+ .build();
+ playlistSyncRepository.save(sync);
+ assetRepository.updateSetListed(sync.getIds());
+ summary.getPlaylist().incUpdate();
+
+ Collection<Long> removedIds = CollectionUtils.subtract(currentContent, newContent);
+ List<String> sunsets = assetRepository.findAllById(removedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+ summary.getPlaylist().getSunsets().addAll(sunsets);
+
+ Collection<Long> addedIds = CollectionUtils.subtract(newContent, currentContent);
+ List<String> sunrises = assetRepository.findAllById(addedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+ summary.getPlaylist().getSunrises().addAll(sunrises);
+ summary.getPlaylist().incSuccess();
+ } catch (Exception e) {
+ summary.getPlaylist().incError();
+ }
+ }
+ });
+ }
+
+ private void handleAddedPlaylist(CompositeSummary summary, Collection<String> playlistNamesDifference, Map<String, List<Long>> newPlaylists) {
+ playlistNamesDifference.forEach(name -> {
+ try {
+ List<Long> ids = newPlaylists.get(name);
PlaylistSync sync = PlaylistSync.builder()
.name(name)
.syncType(SyncType.INSERT)
.created(Date.from(Instant.now()))
- .ids(newPlaylists.get(name))
+ .ids(ids)
.build();
- playlistSyncRepository.saveAndFlush(sync);
- assetRepository.updateListed(sync.getIds());
+ playlistSyncRepository.save(sync);
+ assetRepository.updateSetListed(sync.getIds());
+ summary.getPlaylist().incAll();
summary.getPlaylist().incInsert();
- });
- }
+ List<String> sunrises = assetRepository.findAllById(ids).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+ summary.getPlaylist().getSunrises().addAll(sunrises);
+ summary.getPlaylist().incSuccess();
+ } catch (Exception e) {
+ summary.getPlaylist().incError();
+ }
+ });
+ }
- currentPlaylistNames.forEach(name -> {
- List<Long> currentContent = currentPlaylists.get(name);
- List<Long> newContent = newPlaylists.get(name);
- if (isContentChanged(currentContent, newContent)) {
+ private void handleDeletedPlaylists(CompositeSummary summary, Collection<String> playlistNamesDifference) {
+ playlistNamesDifference.forEach(name -> {
+
+ try {
PlaylistSync sync = PlaylistSync.builder()
.name(name)
- .syncType(SyncType.UPDATE)
- .ids(newPlaylists.get(name))
+ .syncType(SyncType.DELETE)
.created(Date.from(Instant.now()))
.build();
- playlistSyncRepository.saveAndFlush(sync);
- assetRepository.updateListed(sync.getIds());
- summary.getPlaylist().incUpdate();
+ playlistSyncRepository.save(sync);
+ summary.getPlaylist().incDelete();
+
+ List<Long> removedIds = currentPlaylists.get(name);
+ List<String> sunsets = assetRepository.findAllById(removedIds).stream().map(Asset::getCatalogId).collect(Collectors.toList());
+ summary.getPlaylist().getSunsets().addAll(sunsets);
+ summary.getPlaylist().incAll();
+ summary.getPlaylist().incSuccess();
+ } catch (Exception e) {
+ summary.getPlaylist().incError();
}
});
}