diff --git a/entity/src/entities/page.rs b/entity/src/entities/page.rs index 099df9c..b181e47 100644 --- a/entity/src/entities/page.rs +++ b/entity/src/entities/page.rs @@ -19,6 +19,19 @@ pub struct Model { } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +pub enum Relation { + #[sea_orm( + belongs_to = "super::video::Entity", + from = "Column::VideoId", + to = "super::video::Column::Id" + )] + Video, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Video.def() + } +} impl ActiveModelBehavior for ActiveModel {} diff --git a/entity/src/entities/video.rs b/entity/src/entities/video.rs index 7f70804..f84123d 100644 --- a/entity/src/entities/video.rs +++ b/entity/src/entities/video.rs @@ -22,12 +22,21 @@ pub struct Model { pub favtime: DateTime, pub handled: bool, pub valid: bool, - pub tags: Option, + pub tags: Option, pub single_page: Option, pub created_at: String, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +pub enum Relation { + #[sea_orm(has_many = "super::page::Entity")] + Page, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Page.def() + } +} impl ActiveModelBehavior for ActiveModel {} diff --git a/src/bilibili/video.rs b/src/bilibili/video.rs index 6b1a565..c9f2157 100644 --- a/src/bilibili/video.rs +++ b/src/bilibili/video.rs @@ -27,6 +27,15 @@ pub struct Tag { pub tag_name: String, } +impl serde::Serialize for Tag { + fn serialize(&self, serializer: S) -> core::result::Result + where + S: serde::Serializer, + { + serializer.serialize_str(&self.tag_name) + } +} + #[derive(Debug, serde::Deserialize)] pub struct PageInfo { pub cid: i32, diff --git a/src/core/command.rs b/src/core/command.rs index d1f4a26..aada26e 100644 --- a/src/core/command.rs +++ b/src/core/command.rs @@ -34,6 +34,7 @@ pub async fn refresh_favorite( let video_stream = bili_favorite_list.into_video_stream().chunks(10); pin_mut!(video_stream); while let Some(videos_info) = video_stream.next().await { + info!("handle videos: {}", videos_info.len()); let exist_labels = exist_labels(&videos_info, &favorite_model, connection.as_ref()).await?; let should_break = videos_info .iter() @@ -50,10 +51,12 @@ pub async fn refresh_favorite( if !unrefreshed_video_models.is_empty() { for video_model in unrefreshed_video_models { let bili_video = Video::new(bili_client.clone(), video_model.bvid.clone()); + let tags = bili_video.get_tags().await?; let pages_info = bili_video.get_pages().await?; create_video_pages(&pages_info, &video_model, connection.as_ref()).await?; let mut video_active_model: video::ActiveModel = video_model.into(); video_active_model.single_page = Set(Some(pages_info.len() == 1)); + video_active_model.tags = Set(Some(serde_json::to_value(tags).unwrap())); video_active_model.save(connection.as_ref()).await?; } }