diff --git a/crates/bili_sync/src/adapter/collection.rs b/crates/bili_sync/src/adapter/collection.rs index 79cce89..dbbabae 100644 --- a/crates/bili_sync/src/adapter/collection.rs +++ b/crates/bili_sync/src/adapter/collection.rs @@ -3,6 +3,7 @@ use std::pin::Pin; use anyhow::{Context, Result}; use bili_sync_entity::*; +use chrono::Utc; use futures::Stream; use sea_orm::ActiveValue::Set; use sea_orm::entity::prelude::*; @@ -37,13 +38,19 @@ impl VideoSource for collection::Model { }) } + fn should_take(&self, _release_datetime: &chrono::DateTime, _latest_row_at: &chrono::DateTime) -> bool { + // collection(视频合集/视频列表)返回的内容似乎并非严格按照时间排序,并且不同 collection 的排序方式也不同 + // 为了保证程序正确性,collection 不根据时间提前 break,而是每次都全量拉取 + true + } + fn log_refresh_video_start(&self) { info!("开始扫描{}「{}」..", CollectionType::from(self.r#type), self.name); } fn log_refresh_video_end(&self, count: usize) { info!( - "扫描{}「{}」完成,获取到 {} 条新视频", + "扫描{}「{}」完成,已拉取 {} 条视频", CollectionType::from(self.r#type), self.name, count, diff --git a/crates/bili_sync/src/adapter/mod.rs b/crates/bili_sync/src/adapter/mod.rs index 4f8f1a9..0178128 100644 --- a/crates/bili_sync/src/adapter/mod.rs +++ b/crates/bili_sync/src/adapter/mod.rs @@ -7,6 +7,7 @@ use std::path::Path; use std::pin::Pin; use anyhow::Result; +use chrono::Utc; use enum_dispatch::enum_dispatch; use futures::Stream; use sea_orm::DatabaseConnection; @@ -52,6 +53,11 @@ pub trait VideoSource { /// Box 又提示 ActiveModelTrait 没有 object safety,因此手写一个 Enum 静态分发 fn update_latest_row_at(&self, datetime: DateTime) -> _ActiveModel; + // 判断是否应该继续拉取视频 + fn should_take(&self, release_datetime: &chrono::DateTime, latest_row_at: &chrono::DateTime) -> bool { + release_datetime > latest_row_at + } + /// 开始刷新视频 fn log_refresh_video_start(&self); diff --git a/crates/bili_sync/src/workflow.rs b/crates/bili_sync/src/workflow.rs index 561c885..2d6a75e 100644 --- a/crates/bili_sync/src/workflow.rs +++ b/crates/bili_sync/src/workflow.rs @@ -72,7 +72,7 @@ pub async fn refresh_video_source<'a>( if release_datetime > &max_datetime { max_datetime = *release_datetime; } - futures::future::ready(release_datetime > &latest_row_at) + futures::future::ready(video_source.should_take(release_datetime, &latest_row_at)) } } })