Skip to content
Clone
main
64 lines 1.9 KB Rust
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<EmbedRule> {
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<crate::Resolved> {
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;