mirror of
https://github.com/G2-Games/minidisc-cli.git
synced 2025-04-19 11:42:53 -05:00
Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
1bc2f5b18b | |||
e859fd937f |
5 changed files with 79 additions and 9 deletions
|
@ -45,7 +45,7 @@ getrandom = { version = "0.2", features = ["js"] }
|
|||
des = "0.8"
|
||||
cbc = "0.1"
|
||||
ecb = "0.1"
|
||||
tokio = { version = "1.36", features = ["sync"] }
|
||||
tokio = { version = "1.36", features = ["full", "sync"] }
|
||||
g2-unicode-jp = "0.4.1"
|
||||
thiserror = "1.0.57"
|
||||
phf = { version = "0.11.2", features = ["phf_macros", "macros"] }
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
A library for controlling and interfacing with [MiniDisc](https://en.wikipedia.org/wiki/MiniDisc) devices from within Rust programs. Compatible with many cross platform targets (including Web Assembly!) by using [cross-usb](https://github.com/G2-Games/cross-usb).
|
||||
|
||||
The feature set is very similar to that of [netmd-js](https://github.com/cybercase/netmd-js) which this library is inspired by. Devlopment of this project was made much easier by the absolutely awesome [Web Minidisc project](https://github.com/asivery/webminidisc), [NetMD-exploits](https://github.com/asivery/netmd-exploits), and the C based [Linux Minidisc project](https://github.com/linux-minidisc/linux-minidisc). Go check those projects out!
|
||||
The feature set is very similar to that of [netmd-js](https://github.com/cybercase/netmd-js) which this library is inspired by. Development of this project was made much easier by the absolutely awesome [Web Minidisc project](https://github.com/asivery/webminidisc), [NetMD-exploits](https://github.com/asivery/netmd-exploits), and the C based [Linux Minidisc project](https://github.com/linux-minidisc/linux-minidisc). Go check those projects out!
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Documentation has not been finished and is a work in progress. Any contributions would be appreciated!
|
||||
|
|
42
src/main.rs
Normal file
42
src/main.rs
Normal file
|
@ -0,0 +1,42 @@
|
|||
use std::{process::exit, time::Duration};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let Ok(player) = cross_usb::get_device(minidisc::netmd::DEVICE_IDS_CROSSUSB.to_vec()).await else {
|
||||
eprintln!("Could not find a MiniDisc device");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
let Ok(mut player) = minidisc::netmd::NetMDContext::new(player).await else {
|
||||
eprintln!("Could not open device!");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
let disc = player.list_content().await.expect("Could not retrieve player's contents");
|
||||
|
||||
for track in disc.tracks() {
|
||||
println!(
|
||||
"{:02}:\n Title: {} | {}\n Duration: {}\n Encoding: {}\n",
|
||||
track.index(),
|
||||
track.title(), track.full_width_title(),
|
||||
pretty_time(track.duration().as_duration()),
|
||||
track.encoding(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn pretty_time(dur: Duration) -> String {
|
||||
let mut string = String::new();
|
||||
if dur >= Duration::from_secs(3600) {
|
||||
string.push_str(&format!("{:02}", dur.as_secs() / 3600));
|
||||
string.push(':');
|
||||
}
|
||||
if dur >= Duration::from_secs(60) {
|
||||
string.push_str(&format!("{:02}", (dur.as_secs() / 60) % 3600).to_string());
|
||||
string.push(':');
|
||||
}
|
||||
if dur >= Duration::from_secs(60) {
|
||||
string.push_str(&format!("{:02}", dur.as_secs() % 60).to_string());
|
||||
}
|
||||
string
|
||||
}
|
|
@ -32,8 +32,8 @@ pub enum OperatingStatus {
|
|||
ReadyForTransfer = 65319,
|
||||
}
|
||||
|
||||
/// A representation of time in the same way NetMD devices do.
|
||||
#[derive(Debug, Clone)]
|
||||
/// A representation of time in the way a NetMD device uses internally.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct Time {
|
||||
pub minute: u16,
|
||||
pub second: u16,
|
||||
|
@ -41,7 +41,7 @@ pub struct Time {
|
|||
}
|
||||
|
||||
/// A representation of the current status of the device.
|
||||
#[derive(Debug, Clone)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct DeviceStatus {
|
||||
pub disc_present: bool,
|
||||
pub state: Option<OperatingStatus>,
|
||||
|
@ -50,7 +50,7 @@ pub struct DeviceStatus {
|
|||
}
|
||||
|
||||
/// Information about a single track
|
||||
#[derive(Debug, Clone)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Track {
|
||||
index: u16,
|
||||
title: String,
|
||||
|
@ -77,6 +77,34 @@ impl Track {
|
|||
usize::max(encoding_name_correction, full_width_length),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn index(&self) -> u16 {
|
||||
self.index
|
||||
}
|
||||
|
||||
pub fn title(&self) -> &String {
|
||||
&self.title
|
||||
}
|
||||
|
||||
pub fn full_width_title(&self) -> &String {
|
||||
&self.full_width_title
|
||||
}
|
||||
|
||||
pub fn duration(&self) -> RawTime {
|
||||
self.duration
|
||||
}
|
||||
|
||||
pub fn channels(&self) -> Channels {
|
||||
self.channel
|
||||
}
|
||||
|
||||
pub fn encoding(&self) -> Encoding {
|
||||
self.encoding
|
||||
}
|
||||
|
||||
pub fn protected(&self) -> TrackFlag {
|
||||
self.protected
|
||||
}
|
||||
}
|
||||
|
||||
/// Information about a single group on the disc, containing [`Track`]s
|
||||
|
|
|
@ -75,7 +75,7 @@ impl WireFormat {
|
|||
}
|
||||
|
||||
/// The encoding of the audio
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum Encoding {
|
||||
SP = 0x90,
|
||||
LP2 = 0x92,
|
||||
|
@ -93,7 +93,7 @@ impl std::fmt::Display for Encoding {
|
|||
}
|
||||
|
||||
/// The number of channels in the audio
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum Channels {
|
||||
Mono = 0x01,
|
||||
Stereo = 0x00,
|
||||
|
@ -114,7 +114,7 @@ enum ChannelCount {
|
|||
}
|
||||
|
||||
/// The protected flag on a track
|
||||
#[derive(Debug, Clone, Copy, FromPrimitive)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)]
|
||||
pub enum TrackFlag {
|
||||
Protected = 0x03,
|
||||
Unprotected = 0x00,
|
||||
|
|
Loading…
Reference in a new issue