Skip to content

Commit 5cb3372

Browse files
authored
fix: rmpcd - correct song id in typedef, make all songs userdata (#994)
1 parent 5930e4d commit 5cb3372

7 files changed

Lines changed: 82 additions & 12 deletions

File tree

rmpcd/src/lua/lualib/mpd/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ use rmpc_mpd::{
77
mpd_client::MpdClient,
88
};
99

10-
use crate::{async_client::AsyncClient, lua::lualib::mpd::types::Status};
10+
use crate::{
11+
async_client::AsyncClient,
12+
lua::lualib::mpd::types::{Song, Status},
13+
};
1114

1215
mod c2c;
1316
mod playback;
@@ -68,7 +71,7 @@ pub fn create(lua: &Lua, client: &Arc<AsyncClient>) -> Result<Table> {
6871
let client = Arc::clone(&c);
6972
async move {
7073
match client.run(move |c| c.find_one(&[Filter::new(Tag::File, uri.as_str())])).await {
71-
Ok(song) => lua.to_value(&song).into_lua_multi(&lua),
74+
Ok(song) => song.map(Song::from).into_lua_multi(&lua),
7275
Err(err) => {
7376
tracing::error!(err = ?err, "Failed to get song by uri");
7477
(Value::Nil, Some(err.to_string())).into_lua_multi(&lua)
@@ -82,7 +85,7 @@ pub fn create(lua: &Lua, client: &Arc<AsyncClient>) -> Result<Table> {
8285
let client = Arc::clone(&c);
8386
async move {
8487
match client.run(move |c| c.playlist_id(id)).await {
85-
Ok(song) => lua.to_value(&song).into_lua_multi(&lua),
88+
Ok(song) => song.map(Song::from).into_lua_multi(&lua),
8689
Err(err) => {
8790
tracing::error!(err = ?err, "Failed to get song by id");
8891
(Value::Nil, Some(err.to_string())).into_lua_multi(&lua)
@@ -96,7 +99,7 @@ pub fn create(lua: &Lua, client: &Arc<AsyncClient>) -> Result<Table> {
9699
let client = Arc::clone(&c);
97100
async move {
98101
match client.run(move |c| c.get_current_song()).await {
99-
Ok(song) => lua.to_value(&song).into_lua_multi(&lua),
102+
Ok(song) => song.map(Song::from).into_lua_multi(&lua),
100103
Err(err) => {
101104
tracing::error!(err = ?err, "Failed to get current song");
102105
(Value::Nil, Some(err.to_string())).into_lua_multi(&lua)

rmpcd/src/lua/lualib/mpd/types/song.rs

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
use mlua::UserData;
1+
use mlua::{MetaMethod, UserData};
22
use rmpc_mpd::commands::Song as MpdSong;
33

44
use crate::lua::lualib::mpd::types::{MetadataTag, MetadataTagExt};
55

66
#[derive(Debug, PartialEq, Eq, Clone)]
77
pub struct Song {
8+
pub id: u32,
89
pub file: String,
910
pub duration: u128,
1011
pub artist: Option<MetadataTag>,
@@ -44,9 +45,67 @@ pub struct Song {
4445
pub musicbrainz_workid: Option<MetadataTag>,
4546
}
4647

48+
impl From<MpdSong> for Song {
49+
fn from(mut value: MpdSong) -> Self {
50+
Self {
51+
id: value.id,
52+
file: value.file,
53+
duration: value.duration.map(|d| d.as_millis()).unwrap_or_default(),
54+
artist: value.metadata.remove("artist").to_metadata_tag(),
55+
artistsort: value.metadata.remove("artistsort").to_metadata_tag(),
56+
album: value.metadata.remove("album").to_metadata_tag(),
57+
albumsort: value.metadata.remove("albumsort").to_metadata_tag(),
58+
albumartist: value.metadata.remove("albumartist").to_metadata_tag(),
59+
albumartistsort: value.metadata.remove("albumartistsort").to_metadata_tag(),
60+
title: value.metadata.remove("title").to_metadata_tag(),
61+
titlesort: value.metadata.remove("titlesort").to_metadata_tag(),
62+
track: value.metadata.remove("track").to_metadata_tag(),
63+
name: value.metadata.remove("name").to_metadata_tag(),
64+
genre: value.metadata.remove("genre").to_metadata_tag(),
65+
mood: value.metadata.remove("mood").to_metadata_tag(),
66+
date: value.metadata.remove("date").to_metadata_tag(),
67+
originaldate: value.metadata.remove("originaldate").to_metadata_tag(),
68+
composer: value.metadata.remove("composer").to_metadata_tag(),
69+
composersort: value.metadata.remove("composersort").to_metadata_tag(),
70+
performer: value.metadata.remove("performer").to_metadata_tag(),
71+
conductor: value.metadata.remove("conductor").to_metadata_tag(),
72+
work: value.metadata.remove("work").to_metadata_tag(),
73+
ensemble: value.metadata.remove("ensemble").to_metadata_tag(),
74+
movement: value.metadata.remove("movement").to_metadata_tag(),
75+
movementnumber: value.metadata.remove("movementnumber").to_metadata_tag(),
76+
showmovement: value
77+
.metadata
78+
.remove("showmovement")
79+
.and_then(|v| v.first().parse::<bool>().ok()),
80+
location: value.metadata.remove("location").to_metadata_tag(),
81+
grouping: value.metadata.remove("grouping").to_metadata_tag(),
82+
comment: value.metadata.remove("comment").to_metadata_tag(),
83+
disc: value.metadata.remove("disc").to_metadata_tag(),
84+
label: value.metadata.remove("label").to_metadata_tag(),
85+
musicbrainz_artistid: value.metadata.remove("musicbrainz_artistid").to_metadata_tag(),
86+
musicbrainz_albumid: value.metadata.remove("musicbrainz_albumid").to_metadata_tag(),
87+
musicbrainz_albumartistid: value
88+
.metadata
89+
.remove("musicbrainz_albumartistid")
90+
.to_metadata_tag(),
91+
musicbrainz_trackid: value.metadata.remove("musicbrainz_trackid").to_metadata_tag(),
92+
musicbrainz_releasegroupid: value
93+
.metadata
94+
.remove("musicbrainz_releasegroupid")
95+
.to_metadata_tag(),
96+
musicbrainz_releasetrackid: value
97+
.metadata
98+
.remove("musicbrainz_releasetrackid")
99+
.to_metadata_tag(),
100+
musicbrainz_workid: value.metadata.remove("musicbrainz_workid").to_metadata_tag(),
101+
}
102+
}
103+
}
104+
47105
impl From<&MpdSong> for Song {
48106
fn from(value: &MpdSong) -> Self {
49107
Self {
108+
id: value.id,
50109
file: value.file.clone(),
51110
duration: value.duration.map(|d| d.as_millis()).unwrap_or_default(),
52111
artist: value.metadata.get("artist").to_metadata_tag(),
@@ -101,7 +160,12 @@ impl From<&MpdSong> for Song {
101160
}
102161

103162
impl UserData for Song {
163+
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
164+
methods.add_meta_method(MetaMethod::ToString, |_, this, ()| Ok(format!("{this:?}")));
165+
}
166+
104167
fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
168+
fields.add_field_method_get("id", |_, this| Ok(this.id));
105169
fields.add_field_method_get("file", |_, this| Ok(this.file.clone()));
106170
fields.add_field_method_get("duration", |_, this| Ok(this.duration));
107171
fields.add_field_method_get("artist", |_, this| Ok(this.artist.clone()));

rmpcd/src/lua/lualib/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use tracing::info;
66
pub fn create(lua: &Lua) -> mlua::Result<Table> {
77
let tbl = lua.create_table()?;
88

9-
let dump_table = lua.create_function(|_, tbl: Table| {
9+
let dump_table = lua.create_function(|_, val: Value| {
1010
let mut seen = HashSet::new();
11-
info!("{}", dump(&mlua::Value::Table(tbl), 0, &mut seen));
11+
info!("{}", dump(&val, 0, &mut seen));
1212
Ok(())
1313
})?;
1414

rmpcd/src/lua/plugin/lua_plugin.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ impl LuaPlugin {
215215
}
216216
PluginEvent::SongChange { old, new } => {
217217
trace!(name, ON_SONG_CHANGE, "Running plugin callback");
218-
let old = old.clone().into_lua(lua)?;
219-
let new = new.clone().into_lua(lua)?;
218+
let old = old.into_lua(lua)?;
219+
let new = new.into_lua(lua)?;
220220

221221
let func: mlua::Function = state.get(ON_SONG_CHANGE)?;
222222

rmpcd/src/lua/types/rmpcd.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
---@class RmpcdPlugin<Args>
1212
---@field subscribed_channels string[]|nil
1313
---@field setup fun(self, args: Args)|nil
14-
---@field song_change fun(self, old_song: Song|nil, new_song: Song|nil)|nil
14+
---@field song_change fun(self, old_song: QueuedSong|nil, new_song: QueuedSong|nil)|nil
1515
---@field state_change fun(self, old_state: PlaybackState, new_state: PlaybackState)|nil
1616
---@field message fun(self, channel: string, message: string)|nil
1717
---@field idle_event fun(self, event: IdleEvent)|nil

rmpcd/src/lua/types/rmpcd/mpd/init.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
---@field send_message fun(channel: string, message: string): (boolean, string|nil)
2929
---@field read_messages fun(): (table<string, string[]>|nil, string|nil)
3030
---@field get_song fun(uri: string): (Song|nil, nil|string)
31-
---@field get_song_by_id fun(id: number): (Song|nil, nil|string)
32-
---@field get_current_song fun(): (Song|nil, nil|string)
31+
---@field get_song_by_id fun(id: number): (QueuedSong|nil, nil|string)
32+
---@field get_current_song fun(): (QueuedSong|nil, nil|string)
3333

3434
---@alias ValueChange string e.g. "+5", "-10", "50"
3535

rmpcd/src/lua/types/rmpcd/mpd/song.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
---@field musicbrainz_release_track_id? MetadataValue
3838
---@field musicbrainz_work_id? MetadataValue
3939

40+
---@class QueuedSong: Song
41+
---@field id number
42+
4043
---@class MetadataValue
4144
---Represents a tag that may contain one or many values.
4245
---@field first fun(self: MetadataValue): string

0 commit comments

Comments
 (0)