Skip to main content

oximedia_clips/
lib.rs

1//! Professional clip management and logging system for `OxiMedia`.
2//!
3//! This crate provides comprehensive clip management functionality for professional
4//! video editing and logging workflows, including:
5//!
6//! - **Clip Database**: Store and manage video clips with metadata
7//! - **Subclip Creation**: Create subclips with in/out points
8//! - **Clip Grouping**: Organize clips into bins, folders, and collections
9//! - **Professional Logging**: Keywords, markers, ratings, and notes
10//! - **Take Management**: Track multiple takes of the same shot
11//! - **Proxy Association**: Link clips to proxy versions
12//! - **Smart Collections**: Auto-updating collections based on criteria
13//! - **Search and Filter**: Advanced search and filtering capabilities
14//! - **Import/Export**: EDL, XML, CSV, JSON export
15//!
16//! # Example
17//!
18//! ```rust
19//! use oximedia_clips::{ClipManager, Clip, Rating};
20//! use oximedia_core::types::Rational;
21//! use std::path::PathBuf;
22//!
23//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
24//! // Create a clip manager
25//! let manager = ClipManager::new(":memory:").await?;
26//!
27//! // Create a new clip
28//! let mut clip = Clip::new(PathBuf::from("/path/to/video.mov"));
29//! clip.set_name("Interview Take 1");
30//! clip.set_rating(Rating::FourStars);
31//! clip.add_keyword("interview");
32//! clip.add_keyword("john-doe");
33//!
34//! // Save the clip
35//! let clip_id = manager.add_clip(clip).await?;
36//!
37//! // Search for clips
38//! let results = manager.search("interview").await?;
39//! # Ok(())
40//! # }
41//! ```
42
43#![warn(missing_docs)]
44#![allow(clippy::format_push_string)]
45#![allow(clippy::module_name_repetitions)]
46#![allow(clippy::cast_precision_loss)]
47#![allow(clippy::cast_possible_truncation)]
48#![allow(clippy::cast_sign_loss)]
49#![allow(clippy::cast_lossless)]
50
51pub mod ai_tagging;
52pub mod bin;
53pub mod bin_organizer;
54pub mod camera_metadata;
55pub mod clip;
56pub mod clip_ai_tag;
57pub mod clip_audit;
58pub mod clip_bin;
59pub mod clip_collaboration;
60pub mod clip_compare;
61pub mod clip_export;
62pub mod clip_face_index;
63pub mod clip_favorites;
64pub mod clip_fingerprint;
65pub mod clip_history;
66pub mod clip_merge;
67pub mod clip_metadata;
68pub mod clip_playlist;
69pub mod clip_relations;
70pub mod clip_relations_bidirectional;
71pub mod clip_scene_detect;
72pub mod clip_search;
73pub mod clip_tag;
74pub mod clip_timeline;
75pub mod clip_transcode_status;
76pub mod clip_versioning;
77pub mod clip_waveform;
78#[cfg(not(target_arch = "wasm32"))]
79pub mod database;
80pub mod export;
81pub mod group;
82#[cfg(not(target_arch = "wasm32"))]
83pub mod import;
84pub mod logging;
85pub mod marker;
86pub mod note;
87pub mod offline;
88pub mod proxy;
89pub mod proxy_link;
90pub mod proxy_meta;
91pub mod rating;
92pub mod rating_store;
93pub mod search;
94pub mod storyboard;
95pub mod subclip;
96pub mod sync;
97pub mod take;
98pub mod trim;
99pub mod usage;
100pub mod version;
101
102mod error;
103#[cfg(not(target_arch = "wasm32"))]
104mod manager;
105
106pub use ai_tagging::{AiTagger, AiTaggerConfig, ClipInfo, TagSource, TagSuggestion};
107pub use camera_metadata::{CameraMetadata, CameraMetadataExt, CameraMetadataStore};
108pub use clip::{Clip, ClipId, ClipMetadata, SubClip};
109pub use clip_waveform::{ClipWaveformGenerator, WaveformData, WaveformThumbnail};
110pub use error::{ClipError, ClipResult};
111pub use group::{Bin, BinId, Collection, CollectionId, Folder, FolderId, SmartCollection};
112pub use logging::{Favorite, Keyword, Rating};
113#[cfg(not(target_arch = "wasm32"))]
114pub use manager::ClipManager;
115pub use marker::{Marker, MarkerId, MarkerType};
116pub use note::{Annotation, Note, NoteId};
117pub use proxy::{ProxyLink, ProxyQuality};
118pub use proxy_meta::{ProxyManagerSpec, ProxyMetadata, ProxySpec, ProxyValidationError};
119pub use take::multi_criteria::{
120    rank_takes_multi_criteria, MultiCriteriaTakeSelector, TakeScoreWeights, TakeWeights,
121};
122pub use take::{Take, TakeId, TakeSelector};