about summary refs log tree commit diff stats
path: root/crates/libmpv2/examples/protocol.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libmpv2/examples/protocol.rs')
-rw-r--r--crates/libmpv2/examples/protocol.rs87
1 files changed, 87 insertions, 0 deletions
diff --git a/crates/libmpv2/examples/protocol.rs b/crates/libmpv2/examples/protocol.rs
new file mode 100644
index 0000000..46702d6
--- /dev/null
+++ b/crates/libmpv2/examples/protocol.rs
@@ -0,0 +1,87 @@
+// yt - A fully featured command line YouTube client
+//
+// Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+// This file is part of Yt.
+//
+// You should have received a copy of the License along with this program.
+// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+use std::{
+    env,
+    fs::File,
+    io::{Read, Seek, SeekFrom},
+    mem, thread,
+    time::Duration,
+};
+
+#[cfg(all(not(test), not(feature = "protocols")))]
+compile_error!("The feature `protocols` needs to be enabled for this example`");
+
+#[cfg(feature = "protocols")]
+fn main() {
+    use libmpv2::{protocol::*, *};
+
+    let path = format!(
+        "filereader://{}",
+        env::args()
+            .nth(1)
+            .expect("Expected path to local media as argument, found nil.")
+    );
+
+    let protocol = unsafe {
+        Protocol::new(
+            "filereader".into(),
+            (),
+            open,
+            close,
+            read,
+            Some(seek),
+            Some(size),
+        )
+    };
+
+    let mpv = Mpv::new().unwrap();
+    mpv.set_property("volume", 25).unwrap();
+
+    let proto_ctx = mpv.create_protocol_context();
+    proto_ctx.register(protocol).unwrap();
+
+    mpv.command("loadfile", &[&path, "append-play"]).unwrap();
+
+    thread::sleep(Duration::from_secs(10));
+
+    mpv.command("seek", &["15"]).unwrap();
+
+    thread::sleep(Duration::from_secs(5));
+}
+
+fn open(_: &mut (), uri: &str) -> File {
+    // Open the file, and strip the `filereader://` part
+    let ret = File::open(&uri[13..]).unwrap();
+
+    println!("Opened file[{}], ready for orders o7", &uri[13..]);
+    ret
+}
+
+fn close(_: Box<File>) {
+    println!("Closing file, bye bye~~");
+}
+
+fn read(cookie: &mut File, buf: &mut [i8]) -> i64 {
+    unsafe {
+        let forbidden_magic = mem::transmute::<&mut [i8], &mut [u8]>(buf);
+
+        cookie.read(forbidden_magic).unwrap() as _
+    }
+}
+
+fn seek(cookie: &mut File, offset: i64) -> i64 {
+    println!("Seeking to byte {}", offset);
+    cookie.seek(SeekFrom::Start(offset as u64)).unwrap() as _
+}
+
+fn size(cookie: &mut File) -> i64 {
+    cookie.metadata().unwrap().len() as _
+}