@@ -192,10 +192,142 @@ mod data {
192192 }
193193
194194 impl ModuleDynamicMajor {
195- pub fn as_archive ( & self ) -> Option < & ModuleDynamicMajorArchiveInner > {
195+ pub fn to_content ( & self ) -> Option < PostContent > {
196196 match self {
197- ModuleDynamicMajor :: Archive ( archive) => Some ( & archive. archive ) ,
198- _ => None ,
197+ Self :: None ( none) => Some ( PostContent :: plain ( & none. none . tips ) ) ,
198+ Self :: Opus ( opus) => {
199+ if let Some ( title) = opus. opus . title . as_deref ( ) {
200+ Some (
201+ PostContent :: plain ( title)
202+ . with_plain ( "\n \n " )
203+ . with_content ( opus. opus . summary . to_content ( ) ) ,
204+ )
205+ } else {
206+ Some ( opus. opus . summary . to_content ( ) )
207+ }
208+ }
209+ Self :: Archive ( archive) => Some (
210+ PostContent :: plain ( "投稿了视频《" )
211+ . with_plain ( & archive. archive . title )
212+ . with_plain ( "》" ) ,
213+ ) ,
214+ Self :: Article ( article) => Some (
215+ PostContent :: plain ( "投稿了文章《" )
216+ . with_plain ( & article. article . title )
217+ . with_plain ( "》" ) ,
218+ ) ,
219+ Self :: Draw ( _) => None ,
220+ Self :: Common ( common) => Some (
221+ PostContent :: plain ( & common. common . title )
222+ . with_plain ( " - " )
223+ . with_plain ( & common. common . desc ) ,
224+ ) ,
225+ Self :: Pgc ( pgc) => Some (
226+ PostContent :: plain ( "剧集《" )
227+ . with_plain ( & pgc. pgc . title )
228+ . with_plain ( "》" ) ,
229+ ) ,
230+ Self :: Live ( live) => Some ( PostContent :: plain ( & live. live . title ) ) ,
231+ Self :: LiveRcmd | Self :: Blocked => {
232+ critical ! ( "unexpected major type" , kv: { major: ? = self } ) ;
233+ unreachable ! ( )
234+ }
235+ }
236+ }
237+
238+ pub fn to_url ( & self ) -> Option < PostUrl > {
239+ match self {
240+ Self :: None ( _) | Self :: Opus ( _) | Self :: Draw ( _) | Self :: Common ( _) => {
241+ // No need to add extra URLs
242+ None
243+ }
244+ Self :: Archive ( archive) => Some ( PostUrl :: new_clickable (
245+ format ! ( "https://www.bilibili.com/video/{}" , archive. archive. bvid) ,
246+ "查看视频" ,
247+ ) ) ,
248+ Self :: Article ( article) => Some ( PostUrl :: new_clickable (
249+ format ! ( "https://www.bilibili.com/read/cv{}" , article. article. id) ,
250+ "查看文章" ,
251+ ) ) ,
252+ Self :: Pgc ( pgc) => Some ( PostUrl :: new_clickable (
253+ format ! ( "https://www.bilibili.com/bangumi/play/ep{}" , pgc. pgc. epid) ,
254+ "查看剧集" ,
255+ ) ) ,
256+ Self :: Live ( live) => Some ( PostUrl :: new_clickable (
257+ format ! ( "https://live.bilibili.com/{}" , live. live. id) ,
258+ "前往直播间" ,
259+ ) ) ,
260+ Self :: LiveRcmd | Self :: Blocked => {
261+ critical ! ( "unexpected major type" , kv: { major: ? = self } ) ;
262+ unreachable ! ( )
263+ }
264+ }
265+ }
266+
267+ pub fn to_attachments ( & self ) -> Vec < PostAttachment > {
268+ match self {
269+ Self :: None ( _) => vec ! [ ] ,
270+ Self :: Opus ( opus) => opus
271+ . opus
272+ . pics
273+ . iter ( )
274+ . map ( |pic| {
275+ PostAttachment :: Image ( PostAttachmentImage {
276+ media_url : upgrade_to_https ( & pic. url ) ,
277+ has_spoiler : false ,
278+ } )
279+ } )
280+ . collect ( ) ,
281+ Self :: Archive ( archive) => {
282+ vec ! [ PostAttachment :: Image ( PostAttachmentImage {
283+ media_url: upgrade_to_https( & archive. archive. cover) ,
284+ has_spoiler: false ,
285+ } ) ]
286+ }
287+ Self :: Article ( article) => article
288+ . article
289+ . covers
290+ . iter ( )
291+ . map ( |cover| {
292+ PostAttachment :: Image ( PostAttachmentImage {
293+ media_url : upgrade_to_https ( cover) ,
294+ has_spoiler : false ,
295+ } )
296+ } )
297+ . collect ( ) ,
298+ Self :: Draw ( draw) => draw
299+ . draw
300+ . items
301+ . iter ( )
302+ . map ( |item| {
303+ PostAttachment :: Image ( PostAttachmentImage {
304+ media_url : upgrade_to_https ( & item. src ) ,
305+ has_spoiler : false ,
306+ } )
307+ } )
308+ . collect ( ) ,
309+ Self :: Common ( common) => {
310+ vec ! [ PostAttachment :: Image ( PostAttachmentImage {
311+ media_url: upgrade_to_https( & common. common. cover) ,
312+ has_spoiler: false ,
313+ } ) ]
314+ }
315+ Self :: Pgc ( pgc) => {
316+ vec ! [ PostAttachment :: Image ( PostAttachmentImage {
317+ media_url: upgrade_to_https( & pgc. pgc. cover) ,
318+ has_spoiler: false ,
319+ } ) ]
320+ }
321+ Self :: Live ( live) => {
322+ vec ! [ PostAttachment :: Image ( PostAttachmentImage {
323+ media_url: upgrade_to_https( & live. live. cover) ,
324+ has_spoiler: false ,
325+ } ) ]
326+ }
327+ Self :: LiveRcmd | Self :: Blocked => {
328+ critical ! ( "unexpected major type" , kv: { major: ? = self } ) ;
329+ unreachable ! ( )
330+ }
199331 }
200332 }
201333 }
@@ -580,57 +712,12 @@ fn fetch_space_history_impl<'a>(
580712
581713fn parse_response ( resp : data:: SpaceHistory , blocked : & mut BlockedPostIds ) -> anyhow:: Result < Posts > {
582714 fn parse_item ( item : & data:: Item , parent_item : Option < & data:: Item > ) -> anyhow:: Result < Post > {
583- let major_content =
584- item. modules
585- . dynamic
586- . major
587- . as_ref ( )
588- . and_then ( |major| -> Option < PostContent > {
589- match major {
590- data:: ModuleDynamicMajor :: None ( none) => {
591- Some ( PostContent :: plain ( & none. none . tips ) )
592- }
593- data:: ModuleDynamicMajor :: Opus ( opus) => {
594- if let Some ( title) = opus. opus . title . as_deref ( ) {
595- Some (
596- PostContent :: plain ( title)
597- . with_plain ( "\n \n " )
598- . with_content ( opus. opus . summary . to_content ( ) ) ,
599- )
600- } else {
601- Some ( opus. opus . summary . to_content ( ) )
602- }
603- }
604- data:: ModuleDynamicMajor :: Archive ( archive) => Some (
605- PostContent :: plain ( "投稿了视频《" )
606- . with_plain ( & archive. archive . title )
607- . with_plain ( "》" ) ,
608- ) ,
609- data:: ModuleDynamicMajor :: Article ( article) => Some (
610- PostContent :: plain ( "投稿了文章《" )
611- . with_plain ( & article. article . title )
612- . with_plain ( "》" ) ,
613- ) ,
614- data:: ModuleDynamicMajor :: Draw ( _) => None ,
615- data:: ModuleDynamicMajor :: Common ( common) => Some (
616- PostContent :: plain ( & common. common . title )
617- . with_plain ( " - " )
618- . with_plain ( & common. common . desc ) ,
619- ) ,
620- data:: ModuleDynamicMajor :: Pgc ( pgc) => Some (
621- PostContent :: plain ( "剧集《" )
622- . with_plain ( & pgc. pgc . title )
623- . with_plain ( "》" ) ,
624- ) ,
625- data:: ModuleDynamicMajor :: Live ( live) => {
626- Some ( PostContent :: plain ( & live. live . title ) )
627- }
628- data:: ModuleDynamicMajor :: LiveRcmd | data:: ModuleDynamicMajor :: Blocked => {
629- critical ! ( "unexpected major type" , kv: { major: ? } ) ;
630- unreachable ! ( )
631- }
632- }
633- } ) ;
715+ let major_content = item
716+ . modules
717+ . dynamic
718+ . major
719+ . as_ref ( )
720+ . and_then ( |major| major. to_content ( ) ) ;
634721 let content = match ( & item. modules . dynamic . desc , major_content) {
635722 ( Some ( desc) , Some ( major) ) => desc. to_content ( ) . with_plain ( "\n \n " ) . with_content ( major) ,
636723 ( Some ( desc) , None ) => desc. to_content ( ) ,
@@ -661,35 +748,7 @@ fn parse_response(resp: data::SpaceHistory, blocked: &mut BlockedPostIds) -> any
661748 . dynamic
662749 . major
663750 . as_ref ( )
664- . and_then ( |major| match major {
665- data:: ModuleDynamicMajor :: None ( _)
666- | data:: ModuleDynamicMajor :: Opus ( _)
667- | data:: ModuleDynamicMajor :: Draw ( _)
668- | data:: ModuleDynamicMajor :: Common ( _) => {
669- // No need to add extra URLs
670- None
671- }
672- data:: ModuleDynamicMajor :: Archive ( archive) => Some ( PostUrl :: new_clickable (
673- format ! ( "https://www.bilibili.com/video/{}" , archive. archive. bvid) ,
674- "查看视频" ,
675- ) ) ,
676- data:: ModuleDynamicMajor :: Article ( article) => Some ( PostUrl :: new_clickable (
677- format ! ( "https://www.bilibili.com/read/cv{}" , article. article. id) ,
678- "查看文章" ,
679- ) ) ,
680- data:: ModuleDynamicMajor :: Pgc ( pgc) => Some ( PostUrl :: new_clickable (
681- format ! ( "https://www.bilibili.com/bangumi/play/ep{}" , pgc. pgc. epid) ,
682- "查看剧集" ,
683- ) ) ,
684- data:: ModuleDynamicMajor :: Live ( live) => Some ( PostUrl :: new_clickable (
685- format ! ( "https://live.bilibili.com/{}" , live. live. id) ,
686- "前往直播间" ,
687- ) ) ,
688- data:: ModuleDynamicMajor :: LiveRcmd | data:: ModuleDynamicMajor :: Blocked => {
689- critical ! ( "unexpected major type" , kv: { major: ? } ) ;
690- unreachable ! ( )
691- }
692- } )
751+ . and_then ( |major| major. to_url ( ) )
693752 . unwrap_or ( major_url) ;
694753
695754 let time = item
@@ -723,70 +782,7 @@ fn parse_response(resp: data::SpaceHistory, blocked: &mut BlockedPostIds) -> any
723782 . dynamic
724783 . major
725784 . as_ref ( )
726- . map ( |major| match major {
727- data:: ModuleDynamicMajor :: None ( _) => vec ! [ ] ,
728- data:: ModuleDynamicMajor :: Opus ( opus) => opus
729- . opus
730- . pics
731- . iter ( )
732- . map ( |pic| {
733- PostAttachment :: Image ( PostAttachmentImage {
734- media_url : upgrade_to_https ( & pic. url ) ,
735- has_spoiler : false ,
736- } )
737- } )
738- . collect ( ) ,
739- data:: ModuleDynamicMajor :: Archive ( archive) => {
740- vec ! [ PostAttachment :: Image ( PostAttachmentImage {
741- media_url: upgrade_to_https( & archive. archive. cover) ,
742- has_spoiler: false ,
743- } ) ]
744- }
745- data:: ModuleDynamicMajor :: Article ( article) => article
746- . article
747- . covers
748- . iter ( )
749- . map ( |cover| {
750- PostAttachment :: Image ( PostAttachmentImage {
751- media_url : upgrade_to_https ( cover) ,
752- has_spoiler : false ,
753- } )
754- } )
755- . collect ( ) ,
756- data:: ModuleDynamicMajor :: Draw ( draw) => draw
757- . draw
758- . items
759- . iter ( )
760- . map ( |item| {
761- PostAttachment :: Image ( PostAttachmentImage {
762- media_url : upgrade_to_https ( & item. src ) ,
763- has_spoiler : false ,
764- } )
765- } )
766- . collect ( ) ,
767- data:: ModuleDynamicMajor :: Common ( common) => {
768- vec ! [ PostAttachment :: Image ( PostAttachmentImage {
769- media_url: upgrade_to_https( & common. common. cover) ,
770- has_spoiler: false ,
771- } ) ]
772- }
773- data:: ModuleDynamicMajor :: Pgc ( pgc) => {
774- vec ! [ PostAttachment :: Image ( PostAttachmentImage {
775- media_url: upgrade_to_https( & pgc. pgc. cover) ,
776- has_spoiler: false ,
777- } ) ]
778- }
779- data:: ModuleDynamicMajor :: Live ( live) => {
780- vec ! [ PostAttachment :: Image ( PostAttachmentImage {
781- media_url: upgrade_to_https( & live. live. cover) ,
782- has_spoiler: false ,
783- } ) ]
784- }
785- data:: ModuleDynamicMajor :: LiveRcmd | data:: ModuleDynamicMajor :: Blocked => {
786- critical ! ( "unexpected major type: {major:?}" ) ;
787- unreachable ! ( )
788- }
789- } )
785+ . map ( |major| major. to_attachments ( ) )
790786 . unwrap_or_default ( ) ,
791787 prefer_treat_as_reply : false ,
792788 } )
0 commit comments