diff --git a/src/main/java/me/kavin/piped/server/handlers/ChannelHandlers.java b/src/main/java/me/kavin/piped/server/handlers/ChannelHandlers.java index e086df9..92117ca 100644 --- a/src/main/java/me/kavin/piped/server/handlers/ChannelHandlers.java +++ b/src/main/java/me/kavin/piped/server/handlers/ChannelHandlers.java @@ -210,6 +210,57 @@ public class ChannelHandlers { List items = collectRelatedItems(info.getRelatedItems()); + Multithreading.runAsync(() -> { + + var channel = DatabaseHelper.getChannelFromId(info.getId()); + + if (channel != null) { + try (StatelessSession s = DatabaseSessionFactory.createStatelessSession()) { + var streamInfoItems = info.getRelatedItems() + .stream() + .parallel() + .filter(StreamInfoItem.class::isInstance) + .map(StreamInfoItem.class::cast) + .toList(); + + var channelIds = streamInfoItems + .stream() + .map(item -> { + try { + return YOUTUBE_SERVICE.getStreamLHFactory().getId(item.getUrl()); + } catch (ParsingException e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toUnmodifiableSet()); + + List videoIdsPresent = DatabaseHelper.getVideosFromIds(s, channelIds) + .stream() + .map(Video::getId) + .toList(); + + streamInfoItems + .stream() + .parallel() + .forEach(item -> { + try { + String id = YOUTUBE_SERVICE.getStreamLHFactory().getId(item.getUrl()); + if (videoIdsPresent.contains(id)) + VideoHelpers.updateVideo(id, item); + else if (item.getUploadDate() != null) { + // shorts tab doesn't have upload date + // we don't want to fetch each video's upload date + long time = item.getUploadDate().offsetDateTime().toInstant().toEpochMilli(); + if ((System.currentTimeMillis() - time) < TimeUnit.DAYS.toMillis(Constants.FEED_RETENTION)) + VideoHelpers.handleNewVideo(item.getUrl(), time, channel); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + } + }); + String nextpage = null; if (info.hasNextPage()) { Page page = info.getNextPage(); diff --git a/src/main/java/me/kavin/piped/utils/DatabaseHelper.java b/src/main/java/me/kavin/piped/utils/DatabaseHelper.java index 9b9ae91..93563cc 100644 --- a/src/main/java/me/kavin/piped/utils/DatabaseHelper.java +++ b/src/main/java/me/kavin/piped/utils/DatabaseHelper.java @@ -214,9 +214,11 @@ public class DatabaseHelper { CollectionUtils.collectPreloadedTabs(info.getTabs()) .stream() .parallel() - .map(tab -> { + .mapMulti((tab, consumer) -> { try { - return ChannelTabInfo.getInfo(YOUTUBE_SERVICE, tab).getRelatedItems(); + ChannelTabInfo.getInfo(YOUTUBE_SERVICE, tab) + .getRelatedItems() + .forEach(consumer); } catch (ExtractionException | IOException e) { throw new RuntimeException(e); } @@ -224,11 +226,11 @@ public class DatabaseHelper { .filter(StreamInfoItem.class::isInstance) .map(StreamInfoItem.class::cast) .forEach(item -> { - long time = item.getUploadDate() != null - ? item.getUploadDate().offsetDateTime().toInstant().toEpochMilli() - : System.currentTimeMillis(); - if ((System.currentTimeMillis() - time) < TimeUnit.DAYS.toMillis(Constants.FEED_RETENTION)) - VideoHelpers.handleNewVideo(item.getUrl(), time, channel); + long time = item.getUploadDate() != null + ? item.getUploadDate().offsetDateTime().toInstant().toEpochMilli() + : System.currentTimeMillis(); + if ((System.currentTimeMillis() - time) < TimeUnit.DAYS.toMillis(Constants.FEED_RETENTION)) + VideoHelpers.handleNewVideo(item.getUrl(), time, channel); }); });