Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
87f401f5cf | |||
caa7d4c5a7 | |||
dff668c760 | |||
38b50ccf4d | |||
216688e63e | |||
1eca609a2d | |||
d104354966 |
15 changed files with 1196 additions and 25 deletions
1
.envrc
Normal file
1
.envrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
use flake
|
54
.github/workflows/build.yml
vendored
Normal file
54
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
name: build-plugin
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
paths:
|
||||||
|
- "src/**"
|
||||||
|
- Cargo.lock
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- flake.nix
|
||||||
|
- flake.lock
|
||||||
|
- shell.nix
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
paths:
|
||||||
|
- "src/**"
|
||||||
|
- Cargo.lock
|
||||||
|
- rust-toolchain.toml
|
||||||
|
- flake.nix
|
||||||
|
- flake.lock
|
||||||
|
- shell.nix
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
profile: [ "dev", "release" ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
BUILD_NAME: ${{ matrix.profile == 'dev' && 'debug' || matrix.profile }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Nix
|
||||||
|
uses: nixbuild/nix-quick-install-action@v28
|
||||||
|
|
||||||
|
- name: Check
|
||||||
|
run: nix develop --command cargo clippy --profile ${{ matrix.profile }} -- -D warnings
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: nix develop --command cargo build --profile ${{ matrix.profile }}
|
||||||
|
|
||||||
|
- name: Upload build
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: mpv-rpc_${{ env.BUILD_NAME }}
|
||||||
|
path: target/${{ env.BUILD_NAME }}/libmpv_rpc.so
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,2 +1,2 @@
|
||||||
/target
|
/target
|
||||||
/Cargo.lock
|
/.direnv
|
||||||
|
|
1005
Cargo.lock
generated
Normal file
1005
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
65
flake.lock
Normal file
65
flake.lock
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"fenix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"rust-analyzer-src": "rust-analyzer-src"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720938532,
|
||||||
|
"narHash": "sha256-Q2ldXS7ZUJWDqdF+GjgRQPlDfdM6NyJ1aw7xUdzjY+4=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "fenix",
|
||||||
|
"rev": "e761b522381d124fdc3ba20cecb2be2abec1d8cf",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "fenix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720955038,
|
||||||
|
"narHash": "sha256-GaliJqfFwyYxReFywxAa8orCO+EnDq2NK2F+5aSc8vo=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "aa247c0c90ecf4ae7a032c54fdc21b91ca274062",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"fenix": "fenix",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-analyzer-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720717809,
|
||||||
|
"narHash": "sha256-6I+fm+nTLF/iaj7ffiFGlSY7POmubwUaPA/Wq0Bm53M=",
|
||||||
|
"owner": "rust-lang",
|
||||||
|
"repo": "rust-analyzer",
|
||||||
|
"rev": "ffbc5ad993d5cd2f3b8bcf9a511165470944ab91",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rust-lang",
|
||||||
|
"ref": "nightly",
|
||||||
|
"repo": "rust-analyzer",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
32
flake.nix
Normal file
32
flake.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
|
|
||||||
|
fenix = {
|
||||||
|
url = "github:nix-community/fenix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, fenix }:
|
||||||
|
let
|
||||||
|
overlays = [ fenix.overlays.default ];
|
||||||
|
|
||||||
|
getPkgsFor = (system: import nixpkgs {
|
||||||
|
inherit system overlays;
|
||||||
|
});
|
||||||
|
|
||||||
|
forEachSystem = func: nixpkgs.lib.genAttrs [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
|
||||||
|
"aarch64-darwin"
|
||||||
|
"x86_64-darwin"
|
||||||
|
] (system: func (getPkgsFor system));
|
||||||
|
|
||||||
|
in {
|
||||||
|
devShells = forEachSystem (pkgs: {
|
||||||
|
default = pkgs.callPackage ./shell.nix {};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
4
rust-toolchain.toml
Normal file
4
rust-toolchain.toml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "stable"
|
||||||
|
profile = "default"
|
||||||
|
targets = ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"]
|
12
shell.nix
Normal file
12
shell.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{ mkShell, fenix }:
|
||||||
|
|
||||||
|
let
|
||||||
|
toolchain = fenix.fromToolchainFile {
|
||||||
|
file = ./rust-toolchain.toml;
|
||||||
|
sha256 = "Ngiz76YP4HTY75GGdH2P+APE/DEIx2R/Dn+BwwOyzZU=";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
mkShell {
|
||||||
|
packages = [ toolchain ];
|
||||||
|
}
|
|
@ -265,7 +265,7 @@ impl MpvEventHandler for DiscordClient {
|
||||||
MpvEvent::FileLoaded(file_info) => self.set_presence(file_info),
|
MpvEvent::FileLoaded(file_info) => self.set_presence(file_info),
|
||||||
MpvEvent::Seek(remaining_time) => self.set_timestamps(remaining_time),
|
MpvEvent::Seek(remaining_time) => self.set_timestamps(remaining_time),
|
||||||
MpvEvent::Play(remaining_time) => self.set_timestamps(remaining_time),
|
MpvEvent::Play(remaining_time) => self.set_timestamps(remaining_time),
|
||||||
MpvEvent::Pause(_) => self.clear_timestamps(),
|
MpvEvent::Pause => self.clear_timestamps(),
|
||||||
MpvEvent::Buffering => self.clear_timestamps(),
|
MpvEvent::Buffering => self.clear_timestamps(),
|
||||||
MpvEvent::Toggle => self.toggle_activity(),
|
MpvEvent::Toggle => self.toggle_activity(),
|
||||||
MpvEvent::Exit => self.close(),
|
MpvEvent::Exit => self.close(),
|
||||||
|
|
|
@ -17,7 +17,7 @@ fn get_track_cover_art(artist: &Option<String>, title: &Option<String>) -> Optio
|
||||||
if let Some(ref artist) = artist {
|
if let Some(ref artist) = artist {
|
||||||
// Some artist fields might contain + characters
|
// Some artist fields might contain + characters
|
||||||
// Pointing at multiple artists
|
// Pointing at multiple artists
|
||||||
for part in artist.split("+") {
|
for part in artist.split('+') {
|
||||||
builder.and().artist(part);
|
builder.and().artist(part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ fn get_album_cover_art(album_artist: &Option<String>, album: &Option<String>) -
|
||||||
if let Some(ref album_artist) = album_artist {
|
if let Some(ref album_artist) = album_artist {
|
||||||
// Some artist fields might contain + characters
|
// Some artist fields might contain + characters
|
||||||
// Pointing at multiple artists
|
// Pointing at multiple artists
|
||||||
for part in album_artist.split("+") {
|
for part in album_artist.split('+') {
|
||||||
builder.and().artist(part);
|
builder.and().artist(part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ fn get_cover_art_from_query(query: String) -> Option<String> {
|
||||||
Err(_) => return None
|
Err(_) => return None
|
||||||
};
|
};
|
||||||
|
|
||||||
let release = match result.entities.get(0) {
|
let release = match result.entities.first() {
|
||||||
Some(group) => group,
|
Some(group) => group,
|
||||||
None => return None
|
None => return None
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,5 +22,5 @@ fn mpv_open_cplugin(handle: *mut mpv_handle) -> std::os::raw::c_int {
|
||||||
};
|
};
|
||||||
|
|
||||||
plugin.run();
|
plugin.run();
|
||||||
return 0;
|
0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
pub mod macros;
|
pub mod macros;
|
||||||
|
|
||||||
|
#[allow(unused_imports)]
|
||||||
pub use macros::{error, warning, info};
|
pub use macros::{error, warning, info};
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
@ -40,7 +42,7 @@ impl Logger {
|
||||||
pub fn from_env() -> Self {
|
pub fn from_env() -> Self {
|
||||||
let level = env::var("MPV_RPC_LOG").unwrap_or_default();
|
let level = env::var("MPV_RPC_LOG").unwrap_or_default();
|
||||||
let level: u32 = level.parse().unwrap_or(LogLevel::Error as u32);
|
let level: u32 = level.parse().unwrap_or(LogLevel::Error as u32);
|
||||||
|
|
||||||
let log_level = LogLevel::from(level);
|
let log_level = LogLevel::from(level);
|
||||||
Self {
|
Self {
|
||||||
log_level
|
log_level
|
||||||
|
@ -49,19 +51,19 @@ impl Logger {
|
||||||
|
|
||||||
pub fn info(&self, message: &str) {
|
pub fn info(&self, message: &str) {
|
||||||
if self.log_level >= LogLevel::Info {
|
if self.log_level >= LogLevel::Info {
|
||||||
println!("[mpv-rpc (INFO)] {}", message);
|
println!("[mpv-rpc (INFO)] {message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn warning(&self, message: &str) {
|
pub fn warning(&self, message: &str) {
|
||||||
if self.log_level >= LogLevel::Warn {
|
if self.log_level >= LogLevel::Warn {
|
||||||
println!("[mpv-rpc (WARN)] {}", message);
|
println!("[mpv-rpc (WARN)] {message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn error(&self, message: &str) {
|
pub fn error(&self, message: &str) {
|
||||||
if self.log_level >= LogLevel::Error {
|
if self.log_level >= LogLevel::Error {
|
||||||
println!("[mpv-rpc (ERROR)] {}", message);
|
println!("[mpv-rpc (ERROR)] {message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,17 +15,17 @@ pub struct MpvEventQueue {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MpvEventQueue {
|
impl MpvEventQueue {
|
||||||
pub fn new(mpv: Handle,logger: Rc<Logger>) -> Result<Self, &'static str> {
|
pub fn new(mpv: Handle,logger: Rc<Logger>) -> Result<Self, &'static str> {
|
||||||
let new_self = Self {
|
let new_self = Self {
|
||||||
mpv,
|
mpv,
|
||||||
logger,
|
logger,
|
||||||
};
|
};
|
||||||
|
|
||||||
new_self.initialize()?;
|
new_self.initialize()?;
|
||||||
Ok(new_self)
|
Ok(new_self)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_ptr<'a>(handle: *mut mpv_handle, logger: Rc<Logger>) -> Result<Self, &'static str> {
|
pub fn from_ptr(handle: *mut mpv_handle, logger: Rc<Logger>) -> Result<Self, &'static str> {
|
||||||
MpvEventQueue::new(Handle::from_ptr(handle), logger)
|
MpvEventQueue::new(Handle::from_ptr(handle), logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +42,7 @@ impl MpvEventQueue {
|
||||||
|
|
||||||
pub fn next_event(&mut self) -> Option<MpvEvent> {
|
pub fn next_event(&mut self) -> Option<MpvEvent> {
|
||||||
let event = self.mpv.wait_event(-1.0);
|
let event = self.mpv.wait_event(-1.0);
|
||||||
let mpv_event = self.convert_event(event);
|
self.convert_event(event)
|
||||||
mpv_event
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_request(&self, request: MpvRequest) -> Result<(), &'static str> {
|
pub fn handle_request(&self, request: MpvRequest) -> Result<(), &'static str> {
|
||||||
|
@ -51,7 +50,7 @@ impl MpvEventQueue {
|
||||||
MpvRequest::OSDMessage(message) => self.display_osd_message(message)
|
MpvRequest::OSDMessage(message) => self.display_osd_message(message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn display_osd_message(&self, message: &str) -> Result<(), &'static str> {
|
pub fn display_osd_message(&self, message: &str) -> Result<(), &'static str> {
|
||||||
match self.mpv.osd_message(message, Duration::from_secs(1)) {
|
match self.mpv.osd_message(message, Duration::from_secs(1)) {
|
||||||
Ok(()) => Ok(()),
|
Ok(()) => Ok(()),
|
||||||
|
@ -112,7 +111,7 @@ impl MpvEventQueue {
|
||||||
let time = self.get_remaining_time();
|
let time = self.get_remaining_time();
|
||||||
match pause {
|
match pause {
|
||||||
false => Some(MpvEvent::Play(time)),
|
false => Some(MpvEvent::Play(time)),
|
||||||
true => Some(MpvEvent::Pause(time))
|
true => Some(MpvEvent::Pause)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +133,7 @@ impl MpvEventQueue {
|
||||||
fn get_toggle_event(&self, message: ClientMessage) -> Option<MpvEvent> {
|
fn get_toggle_event(&self, message: ClientMessage) -> Option<MpvEvent> {
|
||||||
let command = message.args().join(" ");
|
let command = message.args().join(" ");
|
||||||
logging::info!(self.logger, "Client message: {command}");
|
logging::info!(self.logger, "Client message: {command}");
|
||||||
|
|
||||||
if command.starts_with("key-binding toggle-rpc d-") {
|
if command.starts_with("key-binding toggle-rpc d-") {
|
||||||
Some(MpvEvent::Toggle)
|
Some(MpvEvent::Toggle)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ pub enum MpvEvent {
|
||||||
Exit,
|
Exit,
|
||||||
FileLoaded(FileInfo),
|
FileLoaded(FileInfo),
|
||||||
Play(i64),
|
Play(i64),
|
||||||
Pause(i64),
|
Pause,
|
||||||
Seek(i64)
|
Seek(i64)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,5 +30,5 @@ pub trait MpvEventHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait MpvRequester {
|
pub trait MpvRequester {
|
||||||
fn next_request<'a>(&mut self) -> Option<MpvRequest>;
|
fn next_request(&mut self) -> Option<MpvRequest>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,10 +48,7 @@ impl RPCPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_event(&mut self, event: MpvEvent) -> bool {
|
fn handle_event(&mut self, event: MpvEvent) -> bool {
|
||||||
let exit = match event {
|
let exit = matches!(event, MpvEvent::Exit);
|
||||||
MpvEvent::Exit => true,
|
|
||||||
_ => false
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Err(e) = self.discord.handle_event(event) {
|
if let Err(e) = self.discord.handle_event(event) {
|
||||||
logging::error!(self.logger, "Failed to handle event: {e}");
|
logging::error!(self.logger, "Failed to handle event: {e}");
|
||||||
|
|
Loading…
Reference in a new issue