use crate::parse::{EmbedRule, Platform}; use crate::Category; pub struct Bilibili; impl Platform for Bilibili { fn id(&self) -> &'static str { "bilibili" } fn name(&self) -> &'static str { "哔哩哔哩" } fn category(&self) -> Category { Category::Video } fn domains(&self) -> &'static [&'static str] { &["bilibili.com", "bilibili.tv"] } fn embed_rule(&self) -> Option { Some(EmbedRule::wide( r"^/video/(BV[A-Za-z0-9]+)", "https://player.bilibili.com/player.html?bvid={id}&autoplay=0", )) } /// 旧版 `av` 号与番剧 `ep` 号走各自的播放器参数,声明式模板表达不了。 fn parse(&self, url: &url::Url) -> Option { use crate::parse::{capture_args, default_parse, platform_resolved}; use crate::EmbedKind; if let Some(caps) = capture_args(r"^/video/av(\d+)", url) { return Some(platform_resolved( self, url, EmbedKind::Iframe, Some(format!( "https://player.bilibili.com/player.html?aid={}&autoplay=0", caps[0] )), crate::Aspect::Wide, )); } if let Some(caps) = capture_args(r"^/bangumi/play/(?:ep|ss)(\d+)", url) { let param = if url.path().contains("/ep") { "ep_id" } else { "season_id" }; return Some(platform_resolved( self, url, EmbedKind::Iframe, Some(format!( "https://player.bilibili.com/player.html?{param}={}&autoplay=0", caps[0] )), crate::Aspect::Wide, )); } default_parse(self, url) } } pub static PLATFORM: Bilibili = Bilibili;