Skip to content

Commit b3e27b4

Browse files
committed
[bilibili.playback] Send XML metadata file updates
1 parent 8c1d50a commit b3e27b4

3 files changed

Lines changed: 60 additions & 42 deletions

File tree

src/helper.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ pub async fn ffprobe_resolution(video: &Path) -> anyhow::Result<VideoResolution>
120120
Ok(VideoResolution { width, height })
121121
}
122122

123+
// ffmpeg -i 录制-5208231-20241209-100743-972-王小桃模式.flv -c copy -fs 100M
124+
// 1.mp4
125+
123126
#[cfg(test)]
124127
mod tests {
125128
use super::*;

src/source/platform/bilibili/playback/bililive_recorder.rs

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ use chrono::{DateTime, Local};
88
use serde::Deserialize;
99
use serde_json as json;
1010
use spdlog::prelude::*;
11-
use tokio::sync::{mpsc, Mutex};
11+
use tokio::{
12+
fs,
13+
sync::{mpsc, Mutex},
14+
};
1215
use warp::Filter;
1316

1417
use super::PLATFORM_METADATA;
@@ -190,49 +193,61 @@ async fn handle(event: data::WebhookV2, params: &Context) -> anyhow::Result<()>
190193
);
191194
}
192195

193-
let file_path = params.working_directory.join(&file_closed.relative_path);
194-
195-
enum FileType {
196-
Video(PlaybackFormat),
197-
Metadata,
198-
}
196+
let send_update = async |path: PathBuf| {
197+
enum FileType {
198+
Video(PlaybackFormat),
199+
Metadata,
200+
}
201+
202+
let file_type = match path
203+
.extension()
204+
.map(|ext| ext.to_string_lossy().to_ascii_lowercase())
205+
.as_deref()
206+
{
207+
Some("flv") => FileType::Video(PlaybackFormat::Flv),
208+
Some("xml") => FileType::Metadata,
209+
_ => bail!(
210+
"bililive-recorder closed a file with an unknown extension '{path:?}'"
211+
),
212+
};
213+
214+
let status = Update::new(
215+
match file_type {
216+
FileType::Video(format) => UpdateKind::Playback(Playback {
217+
live_start_time: session.live_start_time,
218+
file_path: path,
219+
format,
220+
}),
221+
FileType::Metadata => UpdateKind::Document(Document { file_path: path }),
222+
},
223+
StatusSource {
224+
platform: PLATFORM_METADATA,
225+
user: None,
226+
},
227+
);
199228

200-
let file_type = match file_path
201-
.extension()
202-
.map(|ext| ext.to_string_lossy().to_ascii_lowercase())
203-
.as_deref()
204-
{
205-
Some("flv") => FileType::Video(PlaybackFormat::Flv),
206-
Some("xml") => FileType::Metadata,
207-
_ => bail!(
208-
"bililive-recorder closed a file with an unknown extension '{file_path:?}'"
209-
),
229+
params
230+
.senders
231+
.lock()
232+
.await
233+
.get(&session.room_id)
234+
.ok_or_else(|| anyhow!("room id {} has no sender", session.room_id))?
235+
.send(status)
236+
.await
237+
.map_err(|err| anyhow!("failed to send status: {err}. session: {session:?}"))
210238
};
211239

212-
let status = Update::new(
213-
match file_type {
214-
FileType::Video(format) => UpdateKind::Playback(Playback {
215-
live_start_time: session.live_start_time,
216-
file_path,
217-
format,
218-
}),
219-
FileType::Metadata => UpdateKind::Document(Document { file_path }),
220-
},
221-
StatusSource {
222-
platform: PLATFORM_METADATA,
223-
user: None,
224-
},
225-
);
226-
227-
params
228-
.senders
229-
.lock()
230-
.await
231-
.get(&session.room_id)
232-
.ok_or_else(|| anyhow!("room id {} has no sender", session.room_id))?
233-
.send(status)
234-
.await
235-
.map_err(|err| anyhow!("failed to send status: {err}. session: {session:?}"))
240+
let playback_file = params.working_directory.join(&file_closed.relative_path);
241+
let metadate_file = playback_file.with_extension("xml");
242+
243+
let ret1 = send_update(playback_file).await;
244+
let mut ret2 = Ok(());
245+
if let Ok(true) = fs::try_exists(&metadate_file).await {
246+
ret2 = send_update(metadate_file).await;
247+
}
248+
ret1?;
249+
ret2?;
250+
Ok(())
236251
}
237252
data::EventKind::FileOpening {}
238253
| data::EventKind::StreamStarted {}

src/task/subscription.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl Task for TaskSubscription {
101101
match self.sourcer.take().unwrap() {
102102
Sourcer::Fetcher(fetcher) => Box::pin(self.continuous_fetch(fetcher)),
103103
Sourcer::Listener(mut listener) => {
104-
let (sender, receiver) = mpsc::channel(1);
104+
let (sender, receiver) = mpsc::channel(10);
105105
// TODO: A bit hacky, improve it?
106106
let platform = listener.to_string();
107107
Box::pin(async move {

0 commit comments

Comments
 (0)