Compare commits

..

13 Commits

Author SHA1 Message Date
f3443867c5 feat(player): improve video scaling, YOLO positioning, and controls 2026-03-19 01:40:25 +08:00
64f217fdc4 feat: add sdl2 ttf feature for text rendering 2026-03-19 01:35:20 +08:00
d89057de5b feat(overlay): update YOLO loader with proper metadata fields 2026-03-19 01:35:00 +08:00
9cf4c55dd7 feat(player): add ASR/YOLO overlays, zoom, and text rendering
- Add TTF text rendering for subtitles and YOLO labels
- Implement ASR subtitle display with background
- Add YOLO bbox rendering with class labels
- Add zoom in/out (+/-) and reset (Backquote)
- Add frame/time info display
- Fix YOLO metadata parsing for actual file format
- Add Shift+Arrow for 1-second seek
2026-03-19 01:34:32 +08:00
abce13e17f feat(web): update bridge module 2026-03-19 01:26:29 +08:00
27e1434eed feat(overlay): update YOLO loader 2026-03-19 01:26:23 +08:00
55bb5d62f1 feat(overlay): update ASR loader 2026-03-19 01:26:16 +08:00
19d60de245 feat(overlay): update overlay module 2026-03-19 01:26:12 +08:00
025d62362d feat(player): update video player 2026-03-19 01:26:10 +08:00
487ada4c10 feat(player): update SDL2 renderer 2026-03-19 01:25:50 +08:00
105a6ce834 feat(player): update FFmpeg decoder 2026-03-19 01:25:44 +08:00
f55d623dca feat(player): update config module 2026-03-19 01:25:32 +08:00
5868f0da05 feat(player): implement SDL2 video playback with FFmpeg decoder 2026-03-19 01:25:05 +08:00
5280 changed files with 97 additions and 104595 deletions

4358
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,46 +15,30 @@ name = "momentry_playground"
path = "src/lib.rs" path = "src/lib.rs"
[dependencies] [dependencies]
# Desktop window management
tao = "0.30" tao = "0.30"
wry = "0.54" wry = "0.54"
# Video/Audio
sdl2 = { version = "0.38", features = ["ttf"] } sdl2 = { version = "0.38", features = ["ttf"] }
ffmpeg-sidecar = "2.4" ffmpeg-sidecar = "2.4"
# Error handling
anyhow = "1.0" anyhow = "1.0"
thiserror = "2.0" thiserror = "2.0"
# Serialization
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
# Async
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
# HTTP client
reqwest = { version = "0.12", features = ["json"] } reqwest = { version = "0.12", features = ["json"] }
# URL parsing
url = "2.5" url = "2.5"
# Markdown (for potential MD viewing)
pulldown-cmark = "0.10" pulldown-cmark = "0.10"
# Logging
log = "0.4" log = "0.4"
env_logger = "0.11" env_logger = "0.11"
# CLI
clap = { version = "4.5", features = ["derive"] } clap = { version = "4.5", features = ["derive"] }
dirs = "6" dirs = "6"
# LRU Cache for YOLO frame caching
lru = "0.12" lru = "0.12"
# Time
chrono = "0.4" chrono = "0.4"
[dev-dependencies] [dev-dependencies]

View File

@@ -6,7 +6,6 @@
- 多格式媒體播放(視頻、音頻、圖片) - 多格式媒體播放(視頻、音頻、圖片)
- Frame-精確的視頻控制 - Frame-精確的視頻控制
- **反向播放**`--start > --end --loop`
- ASR 字幕顯示(可開關) - ASR 字幕顯示(可開關)
- YOLO 檢測框疊加(可開關) - YOLO 檢測框疊加(可開關)
- Chunk 導航標記(可開關) - Chunk 導航標記(可開關)
@@ -45,11 +44,6 @@ cargo run -- \
--asr "/Users/accusys/momentry_core_0.1/output/39567a0eb16f39fd.asr.json" \ --asr "/Users/accusys/momentry_core_0.1/output/39567a0eb16f39fd.asr.json" \
--yolo "/Users/accusys/test_video/Old_Time_Movie_Show_-_Charade_1963.HD.yolo.json" --yolo "/Users/accusys/test_video/Old_Time_Movie_Show_-_Charade_1963.HD.yolo.json"
# 反向播放 (從 130s 倒放到 120s循環)
cargo run -- \
--video "/Users/accusys/test_video/Old_Time_Movie_Show_-_Charade_1963.HD.mov" \
--start 130 --end 120 --loop
# 指定窗口大小 # 指定窗口大小
cargo run -- --width 1280 --height 720 --video video.mp4 cargo run -- --width 1280 --height 720 --video video.mp4
``` ```
@@ -71,10 +65,6 @@ cargo run -- --width 1280 --height 720 --video video.mp4
| `F` | 全屏 | | `F` | 全屏 |
| `[` / `]` | 上一塊/下一塊 | | `[` / `]` | 上一塊/下一塊 |
| `/` | 開啟搜尋 | | `/` | 開啟搜尋 |
| `H` | 快捷鍵幫助面板 |
| `<` / `>` | 減慢/加快播放速度 |
| `P` | 重置播放速度 |
| `E` | 匯出當前幀為 PNG |
| `Esc` | 關閉面板 | | `Esc` | 關閉面板 |
## 命令列參數 ## 命令列參數
@@ -83,9 +73,6 @@ cargo run -- --width 1280 --height 720 --video video.mp4
-v, --video <PATH> 視頻文件路徑 -v, --video <PATH> 視頻文件路徑
-a, --asr <PATH> ASR JSON 文件路徑 -a, --asr <PATH> ASR JSON 文件路徑
-y, --yolo <PATH> YOLO JSON 文件路徑 -y, --yolo <PATH> YOLO JSON 文件路徑
-s, --start <SEC> 開始時間(秒)
-e, --end <SEC> 結束時間(秒)
--loop 循環播放
-w, --width <N> 窗口寬度 (default: 1280) -w, --width <N> 窗口寬度 (default: 1280)
-h, --height <N> 窗口高度 (default: 720) -h, --height <N> 窗口高度 (default: 720)
--fullscreen 全屏模式啟動 --fullscreen 全屏模式啟動

View File

@@ -19,9 +19,6 @@ pub struct Config {
#[arg(short = 'y', long = "yolo", help = "YOLO JSON file path")] #[arg(short = 'y', long = "yolo", help = "YOLO JSON file path")]
pub yolo: Option<PathBuf>, pub yolo: Option<PathBuf>,
#[arg(short = 'c', long = "chunks", help = "Chunk/Cut JSON file path")]
pub chunks: Option<PathBuf>,
#[arg( #[arg(
short = 'w', short = 'w',
long = "width", long = "width",
@@ -33,7 +30,7 @@ pub struct Config {
#[arg( #[arg(
short = 'h', short = 'h',
long = "height", long = "height",
default_value = "1053", default_value = "720",
help = "Window height" help = "Window height"
)] )]
pub height: u32, pub height: u32,
@@ -47,30 +44,6 @@ pub struct Config {
help = "UI language (en, zh-TW, etc.)" help = "UI language (en, zh-TW, etc.)"
)] )]
pub locale: String, pub locale: String,
#[arg(
short = 's',
long = "start",
default_value = "0",
help = "Start time in seconds"
)]
pub start_seconds: f64,
#[arg(
short = 'e',
long = "end",
default_value = "0",
help = "End time in seconds (0 = no limit)"
)]
pub end_seconds: f64,
#[arg(
short = 'l',
long = "loop",
default_value = "false",
help = "Loop playback between start and end"
)]
pub loop_playback: bool,
} }
impl Config { impl Config {

View File

@@ -2,9 +2,9 @@
//! //!
//! Unified media player with ASR/YOLO/Chunks overlay support //! Unified media player with ASR/YOLO/Chunks overlay support
pub mod config;
pub mod overlay;
pub mod player; pub mod player;
pub mod overlay;
pub mod web; pub mod web;
pub mod config;
pub use config::Config; pub use config::Config;

File diff suppressed because it is too large Load Diff

View File

@@ -1,52 +0,0 @@
use anyhow::Context;
use log::info;
use serde::Deserialize;
use std::fs;
use std::path::Path;
#[derive(Debug, Deserialize)]
pub struct CutData {
pub frame_count: u64,
pub fps: f64,
pub scenes: Vec<Scene>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Scene {
pub scene_number: u32,
pub start_frame: u64,
pub end_frame: u64,
pub start_time: f64,
pub end_time: f64,
}
#[derive(Debug)]
pub struct ChunkLoader {
pub data: CutData,
}
impl ChunkLoader {
pub fn load(path: &Path) -> anyhow::Result<Self> {
let content = fs::read_to_string(path)
.with_context(|| format!("Failed to read chunk file: {:?}", path))?;
let data: CutData = serde_json::from_str(&content)
.with_context(|| format!("Failed to parse chunk JSON: {:?}", path))?;
info!("Loaded {} scenes from {:?}", data.scenes.len(), path);
Ok(Self { data })
}
pub fn scene_count(&self) -> usize {
self.data.scenes.len()
}
pub fn get_scene_boundaries(&self) -> Vec<u64> {
self.data.scenes.iter().map(|s| s.start_frame).collect()
}
pub fn get_current_scene(&self, frame: u64) -> Option<&Scene> {
self.data
.scenes
.iter()
.find(|s| frame >= s.start_frame && frame <= s.end_frame)
}
}

View File

@@ -1,11 +1,9 @@
//! Overlay module //! Overlay module
//! //!
//! ASR subtitle, YOLO bbox, and chunk marker overlay management //! ASR subtitle and YOLO bbox overlay management
pub mod asr; pub mod asr;
pub mod chunk;
pub mod yolo; pub mod yolo;
pub use asr::AsrLoader; pub use asr::AsrLoader;
pub use chunk::ChunkLoader;
pub use yolo::YoloLoader; pub use yolo::YoloLoader;

View File

@@ -1,11 +1,13 @@
//! Audio player module //! 音頻播放模組
use log::info; use anyhow::Result;
use std::process::{Child, Command, Stdio}; use std::process::{Command, Stdio};
use std::io::Write;
use std::sync::{Arc, Mutex};
#[derive(Debug)] #[derive(Debug, Clone)]
pub struct AudioPlayer { pub struct AudioPlayer {
process: Option<Child>, process: Option<std::process::Child>,
volume: f32, volume: f32,
muted: bool, muted: bool,
} }
@@ -19,8 +21,8 @@ impl AudioPlayer {
} }
} }
pub fn play(&mut self, path: &std::path::Path, start_ms: u64) -> Option<()> { pub fn play(&mut self, path: &str, start_ms: u64) -> Result<()> {
self.stop(); self.stop()?;
let start_sec = start_ms as f64 / 1000.0; let start_sec = start_ms as f64 / 1000.0;
let volume_filter = if self.muted { let volume_filter = if self.muted {
@@ -29,51 +31,36 @@ impl AudioPlayer {
format!("volume={}", self.volume) format!("volume={}", self.volume)
}; };
let cmd = Command::new("ffplay") let mut cmd = Command::new("ffplay");
.args([ cmd.args([
"-nodisp", "-nodisp",
"-autoexit", "-autoexit",
"-ss", "-ss", &format!("{}", start_sec),
&format!("{:.3}", start_sec), "-af", &volume_filter,
"-af", "-i", path,
&volume_filter, ])
"-i", .stdin(Stdio::null())
]) .stdout(Stdio::null())
.arg(path) .stderr(Stdio::null())
.stdin(Stdio::null()) .spawn()?;
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.ok()?;
self.process = Some(cmd); self.process = Some(cmd);
info!("Audio playback started from {:.1}s", start_sec); Ok(())
Some(())
} }
pub fn pause(&mut self) { pub fn stop(&mut self) -> Result<()> {
if let Some(ref mut child) = self.process { if let Some(mut child) = self.process.take() {
let _ = child.kill(); let _ = child.kill();
let _ = child.wait(); let _ = child.wait();
} }
self.process = None; Ok(())
info!("Audio paused");
}
pub fn resume(&mut self, path: &std::path::Path, current_time_ms: u64) -> Option<()> {
self.play(path, current_time_ms)
}
pub fn stop(&mut self) {
if let Some(ref mut child) = self.process.take() {
let _ = child.kill();
let _ = child.wait();
}
self.process = None;
} }
pub fn set_volume(&mut self, volume: f32) { pub fn set_volume(&mut self, volume: f32) {
self.volume = volume.clamp(0.0, 1.0); self.volume = volume.clamp(0.0, 1.0);
if !self.muted {
self.restart_with_volume()?;
}
} }
pub fn toggle_mute(&mut self) -> bool { pub fn toggle_mute(&mut self) -> bool {
@@ -84,16 +71,14 @@ impl AudioPlayer {
pub fn is_muted(&self) -> bool { pub fn is_muted(&self) -> bool {
self.muted self.muted
} }
}
impl Default for AudioPlayer { fn restart_with_volume(&mut self) -> Result<()> {
fn default() -> Self { Ok(())
Self::new()
} }
} }
impl Drop for AudioPlayer { impl Drop for AudioPlayer {
fn drop(&mut self) { fn drop(&mut self) {
self.stop(); let _ = self.stop();
} }
} }

View File

@@ -1,7 +1,6 @@
//! FFmpeg wrapper //! FFmpeg wrapper
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use std::collections::VecDeque;
use std::io::{BufReader, Read}; use std::io::{BufReader, Read};
use std::path::Path; use std::path::Path;
use std::process::{Child, ChildStdout, Command, Stdio}; use std::process::{Child, ChildStdout, Command, Stdio};
@@ -21,14 +20,6 @@ pub struct FFmpegDecoder {
process: Option<Child>, process: Option<Child>,
stdout: Option<BufReader<ChildStdout>>, stdout: Option<BufReader<ChildStdout>>,
info: VideoInfo, info: VideoInfo,
frame_buffer: VecDeque<Vec<u8>>,
frame_times: VecDeque<u64>,
buffer_loaded: bool,
current_read_ms: u64,
display_time_ms: u64,
reverse_start_ms: u64,
reverse_end_ms: u64,
in_reverse_mode: bool,
} }
impl FFmpegDecoder { impl FFmpegDecoder {
@@ -41,14 +32,6 @@ impl FFmpegDecoder {
process: None, process: None,
stdout: None, stdout: None,
info, info,
frame_buffer: VecDeque::new(),
frame_times: VecDeque::new(),
buffer_loaded: false,
current_read_ms: 0,
display_time_ms: 0,
reverse_start_ms: 0,
reverse_end_ms: 0,
in_reverse_mode: false,
}) })
} }
@@ -141,39 +124,12 @@ impl FFmpegDecoder {
self.process = Some(child); self.process = Some(child);
self.stdout = Some(BufReader::new(stdout)); self.stdout = Some(BufReader::new(stdout));
self.current_read_ms = start_ms;
Ok(()) Ok(())
} }
pub fn seek(&mut self, timestamp_ms: u64) -> Result<()> { pub fn seek(&mut self, timestamp_ms: u64) -> Result<()> {
self.in_reverse_mode = false; self.start_decoding(timestamp_ms)
self.frame_buffer.clear();
self.current_read_ms = timestamp_ms;
self.start_decoding(timestamp_ms)?;
let frame_size = (self.info.width * self.info.height * 3) as usize;
for _ in 0..5 {
let mut dummy = vec![0u8; frame_size];
if let Some(ref mut reader) = self.stdout {
if reader.read_exact(&mut dummy).is_err() {
break;
}
}
}
Ok(())
}
pub fn enable_reverse(&mut self, start_ms: u64, end_ms: u64) {
self.stop();
self.frame_buffer.clear();
self.frame_times.clear();
self.buffer_loaded = false;
self.reverse_start_ms = start_ms;
self.reverse_end_ms = end_ms;
self.current_read_ms = end_ms;
self.display_time_ms = start_ms;
self.in_reverse_mode = true;
self.start_decoding(end_ms).ok();
} }
pub fn stop(&mut self) { pub fn stop(&mut self) {
@@ -186,33 +142,11 @@ impl FFmpegDecoder {
pub fn read_frame(&mut self) -> Result<Option<Vec<u8>>> { pub fn read_frame(&mut self) -> Result<Option<Vec<u8>>> {
let frame_size = (self.info.width * self.info.height * 3) as usize; let frame_size = (self.info.width * self.info.height * 3) as usize;
if let Some(frame) = self.frame_buffer.pop_front() {
if self.in_reverse_mode && self.frame_buffer.len() < 300 {
let _ = self.refill_reverse_buffer(600);
}
return Ok(Some(frame));
}
if self.in_reverse_mode {
if self.current_read_ms <= self.reverse_end_ms {
return Ok(None);
}
let _ = self.refill_reverse_buffer(30);
if let Some(frame) = self.frame_buffer.pop_front() {
return Ok(Some(frame));
}
return Ok(None);
}
let mut buffer = vec![0u8; frame_size]; let mut buffer = vec![0u8; frame_size];
if let Some(ref mut reader) = self.stdout { if let Some(ref mut reader) = self.stdout {
match reader.read_exact(&mut buffer) { match reader.read_exact(&mut buffer) {
Ok(_) => { Ok(_) => Ok(Some(buffer)),
self.current_read_ms += 16;
Ok(Some(buffer))
}
Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => Ok(None), Err(e) if e.kind() == std::io::ErrorKind::UnexpectedEof => Ok(None),
Err(e) => Err(e.into()), Err(e) => Err(e.into()),
} }
@@ -220,133 +154,6 @@ impl FFmpegDecoder {
Ok(None) Ok(None)
} }
} }
pub fn fill_reverse_buffer(&mut self, num_frames: usize) -> Result<()> {
let frame_size = (self.info.width * self.info.height * 3) as usize;
self.frame_buffer.clear();
self.frame_times.clear();
let frame_duration_ms = (1000.0 / self.info.fps) as u64;
let total_range = self.reverse_start_ms.saturating_sub(self.reverse_end_ms);
let max_frames = (total_range / frame_duration_ms).max(1) as usize;
let frames_to_read = max_frames.min(num_frames);
let mut temp_frames: Vec<Vec<u8>> = Vec::new();
let mut temp_times: Vec<u64> = Vec::new();
for _ in 0..frames_to_read {
let mut buffer = vec![0u8; frame_size];
if let Some(ref mut reader) = self.stdout {
match reader.read_exact(&mut buffer) {
Ok(_) => {
temp_frames.push(buffer);
temp_times.push(self.current_read_ms);
self.current_read_ms += frame_duration_ms;
}
Err(_) => break,
}
} else {
break;
}
}
for i in (0..temp_frames.len()).rev() {
self.frame_buffer.push_back(temp_frames.remove(i));
self.frame_times.push_back(temp_times.remove(i));
}
Ok(())
}
pub fn refill_reverse_buffer(&mut self, _num_frames: usize) -> Result<()> {
if !self.in_reverse_mode {
return Ok(());
}
self.frame_buffer.clear();
self.frame_times.clear();
self.current_read_ms = self.reverse_end_ms;
self.display_time_ms = self.reverse_start_ms;
let frame_duration_ms = (1000.0 / self.info.fps) as u64;
let frames_to_read =
((self.reverse_start_ms - self.reverse_end_ms) / frame_duration_ms).max(1) as usize;
self.stop();
self.start_decoding(self.reverse_end_ms)?;
let frame_size = (self.info.width * self.info.height * 3) as usize;
let mut temp_frames: Vec<Vec<u8>> = Vec::new();
let mut temp_times: Vec<u64> = Vec::new();
for _ in 0..frames_to_read {
let mut buffer = vec![0u8; frame_size];
if let Some(ref mut reader) = self.stdout {
match reader.read_exact(&mut buffer) {
Ok(_) => {
temp_frames.push(buffer);
temp_times.push(self.current_read_ms);
self.current_read_ms += frame_duration_ms;
}
Err(_) => break,
}
} else {
break;
}
}
for i in (0..temp_frames.len()).rev() {
self.frame_buffer.push_back(temp_frames.remove(i));
self.frame_times.push_back(temp_times.remove(i));
}
Ok(())
}
pub fn has_frames_in_buffer(&self) -> bool {
!self.frame_buffer.is_empty()
}
pub fn buffer_size(&self) -> usize {
self.frame_buffer.len()
}
pub fn get_buffer_front(&mut self) -> Option<Vec<u8>> {
self.frame_buffer.pop_front()
}
pub fn get_frame_time(&mut self) -> Option<u64> {
if self.in_reverse_mode {
let time = self.display_time_ms;
self.display_time_ms = self
.display_time_ms
.saturating_sub((1000.0 / self.info.fps) as u64);
Some(time)
} else {
self.frame_times.pop_front()
}
}
pub fn needs_loading(&self) -> bool {
self.in_reverse_mode && self.frame_buffer.len() < 300
}
pub fn get_current_time_ms(&self) -> u64 {
self.current_read_ms
}
pub fn set_current_time_ms(&mut self, ms: u64) {
self.current_read_ms = ms;
}
pub fn get_reverse_end_ms(&self) -> u64 {
self.reverse_end_ms
}
pub fn is_at_boundary(&self) -> bool {
self.in_reverse_mode && self.current_read_ms <= self.reverse_end_ms
}
} }
impl Drop for FFmpegDecoder { impl Drop for FFmpegDecoder {

View File

@@ -2,12 +2,10 @@
//! //!
//! Video playback, frame decoding, and rendering //! Video playback, frame decoding, and rendering
pub mod audio; pub mod video;
pub mod ffmpeg; pub mod ffmpeg;
pub mod renderer; pub mod renderer;
pub mod state; pub mod state;
pub mod video;
pub use audio::AudioPlayer; pub use video::Video;
pub use state::{PlaybackState, PlayerState}; pub use state::{PlayerState, PlaybackState};
pub use video::VideoPlayer;

View File

@@ -1,96 +0,0 @@
use anyhow::{Context, Result};
use log::{error, info, warn};
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub frame: u64,
pub time_ms: u64,
pub text: String,
pub score: f32,
}
#[derive(Debug)]
pub struct VectorSearcher {
qdrant_url: String,
collection: String,
asr_loader: Option<super::overlay::AsrLoader>,
}
impl VectorSearcher {
pub fn new(qdrant_url: &str, collection: &str) -> Self {
Self {
qdrant_url: qdrant_url.to_string(),
collection: collection.to_string(),
asr_loader: None,
}
}
pub fn load_asr(&mut self, path: &Path) -> Result<()> {
let loader =
super::overlay::AsrLoader::load(path).context("Failed to load ASR for search")?;
info!(
"Loaded ASR with {} segments for search",
loader.segment_count()
);
self.asr_loader = Some(loader);
Ok(())
}
pub fn search(&self, query: &str) -> Vec<SearchResult> {
info!("Searching for: {}", query);
if let Some(ref asr) = self.asr_loader {
let query_lower = query.to_lowercase();
let mut results: Vec<SearchResult> = Vec::new();
for segment in asr.get_all_segments() {
let text_lower = segment.text.to_lowercase();
if text_lower.contains(&query_lower) {
let score = self.calculate_score(&query_lower, &text_lower);
results.push(SearchResult {
frame: (segment.start * 60.0) as u64,
time_ms: (segment.start * 1000.0) as u64,
text: segment.text.clone(),
score,
});
}
}
results.sort_by(|a, b| b.score.partial_cmp(&a.score).unwrap());
results.truncate(10);
info!("Found {} results", results.len());
return results;
}
warn!("No ASR loaded for search");
Vec::new()
}
fn calculate_score(&self, query: &str, text: &str) -> f32 {
let query_words: Vec<&str> = query.split_whitespace().collect();
let text_words: Vec<&str> = text.split_whitespace().collect();
let mut matches = 0;
for qw in &query_words {
for tw in &text_words {
if tw.contains(qw) {
matches += 1;
break;
}
}
}
(matches as f32) / (query_words.len() as f32)
}
pub fn is_available(&self) -> bool {
true
}
}
pub fn create_searcher() -> VectorSearcher {
VectorSearcher::new("http://localhost:6333", "AccusysDB")
}

View File

@@ -1 +0,0 @@
{"rustc_fingerprint":7910028290815472967,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: aarch64-apple-darwin\nrelease: 1.92.0\nLLVM version: 21.1.3\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/accusys/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"vh\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"apple\"\nunix\n","stderr":""}},"successes":{}}

View File

@@ -1,3 +0,0 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
cafaf23dcf812b49

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"core\", \"default\", \"rustc-dep-of-std\", \"std\"]","target":6569825234462323107,"profile":5347358027863023418,"path":15149082351976033191,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/adler2-41b0dd48552c20c5/dep-lib-adler2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"perf-literal\", \"std\"]","declared_features":"[\"default\", \"logging\", \"perf-literal\", \"std\"]","target":7534583537114156500,"profile":5347358027863023418,"path":2498799609881310857,"deps":[[1363051979936526615,"memchr",false,16761034740145381771]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/aho-corasick-88b3cd4431528e8d/dep-lib-aho_corasick","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"alloc\"]","declared_features":"[\"alloc\", \"default\", \"fresh-rust\", \"nightly\", \"serde\", \"std\"]","target":5388200169723499962,"profile":8526714817676984181,"path":9266711163172033080,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/allocator-api2-5e7341e257c04569/dep-lib-allocator_api2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
35fdd6938cddbe96

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"auto\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":11459093354283867776,"path":1368805165058083929,"deps":[[5652275617566266604,"anstyle_query",false,8874033107635935327],[7098682853475662231,"anstyle",false,12300851714675958605],[7711617929439759244,"colorchoice",false,3274431315892103036],[7727459912076845739,"is_terminal_polyfill",false,12638843975273980479],[11410867133969439143,"anstyle_parse",false,3908141501184340663],[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-5c7ee89b12f2f0af/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
df1b360d59411b84

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"auto\", \"default\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":8255941854203129366,"path":14237504360179493621,"deps":[[2608044744973004659,"anstyle_parse",false,1360650918450305252],[5652275617566266604,"anstyle_query",false,8874033107635935327],[7098682853475662231,"anstyle",false,12300851714675958605],[7711617929439759244,"colorchoice",false,3274431315892103036],[7727459912076845739,"is_terminal_polyfill",false,12638843975273980479],[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-cbae704d8623b559/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
4de303387667b5aa

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":6165884447290141869,"profile":8255941854203129366,"path":1622006416877328561,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-0c8ab8bd38595486/dep-lib-anstyle","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":8255941854203129366,"path":13053215332907560763,"deps":[[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-392f1d4c1d178323/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":11459093354283867776,"path":14980379806015639209,"deps":[[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-584c63468a348cbd/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":10705714425685373190,"profile":14848920055892446256,"path":4316627989718112974,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-query-3a5ace2dbec2ae9f/dep-lib-anstyle_query","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"backtrace\", \"default\", \"std\"]","target":5408242616063297496,"profile":3033921117576893,"path":15975461479635710502,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-24ec003b790501cc/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[12478428894219133322,"build_script_build",false,17048764819802277613]],"local":[{"RerunIfChanged":{"output":"debug/build/anyhow-40fe6c014f4e8bb6/output","paths":["src/nightly.rs"]}},{"RerunIfEnvChanged":{"var":"RUSTC_BOOTSTRAP","val":null}}],"rustflags":[],"config":0,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
acdf419166c7c9f4

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"backtrace\", \"default\", \"std\"]","target":1563897884725121975,"profile":5347358027863023418,"path":8136069237744135612,"deps":[[12478428894219133322,"build_script_build",false,5618577620159850428]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-d838341a95e3a987/dep-lib-anyhow","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":5347358027863023418,"path":11009143541493348455,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/atomic-waker-b0bffc3cf38abbeb/dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
1477b7ed36cbf522

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":6962977057026645649,"profile":3033921117576893,"path":10045383212328745351,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/autocfg-e2e21eab783460c2/dep-lib-autocfg","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
0c8f0e4e099d8852

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":13060062996227388079,"profile":5347358027863023418,"path":2443796168128073955,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/base64-80c574e62179e036/dep-lib-base64","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
2ef398f319cb65f8

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"std\"]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":5347358027863023418,"path":1039962568932081109,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-ccb9bc03a9edff55/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
0375a828b8d21fda

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\"]","declared_features":"[\"compiler_builtins\", \"core\", \"default\", \"example_generated\", \"rustc-dep-of-std\"]","target":12919857562465245259,"profile":5347358027863023418,"path":3910279081600245434,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-fc563d35d55f7f61/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
b63146aeea754deb

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":6813287393046767197,"profile":5347358027863023418,"path":7951925049428246312,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/block-7f847bd28d463d32/dep-lib-block","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
649d78e788b7a9f2

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"compiler-rt\", \"default\", \"gnustep-1-7\", \"gnustep-1-8\", \"gnustep-1-9\", \"gnustep-2-0\", \"gnustep-2-1\", \"std\", \"unstable-coerce-pointee\", \"unstable-objfw\", \"unstable-private\", \"unstable-winobjc\"]","target":8611651741325771798,"profile":8196097686603091492,"path":14352777551528949466,"deps":[[5711497484949304150,"objc2",false,9362850287131531880]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/block2-2dc27831c2863634/dep-lib-block2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
b8b18efa93809b0f

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\"]","declared_features":"[\"allocator-api2\", \"allocator_api\", \"bench_allocator_api\", \"boxed\", \"collections\", \"default\", \"serde\", \"std\"]","target":10625613344215589528,"profile":5347358027863023418,"path":18342583852565774136,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bumpalo-9214dc9bc289b3ef/dep-lib-bumpalo","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
fc13a733e8b70924

View File

@@ -1 +0,0 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":7855341030452660939,"path":9738655571473828057,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bytes-5544e1f3425bf39c/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -1 +0,0 @@
This file has an mtime of when this was started.

View File

@@ -1 +0,0 @@
160aff27f90efb59

Some files were not shown because too many files have changed in this diff Show More