| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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 _
}
 |