|
1 | | -use mlua::UserData; |
| 1 | +use mlua::{MetaMethod, UserData}; |
2 | 2 | use rmpc_mpd::commands::Song as MpdSong; |
3 | 3 |
|
4 | 4 | use crate::lua::lualib::mpd::types::{MetadataTag, MetadataTagExt}; |
5 | 5 |
|
6 | 6 | #[derive(Debug, PartialEq, Eq, Clone)] |
7 | 7 | pub struct Song { |
| 8 | + pub id: u32, |
8 | 9 | pub file: String, |
9 | 10 | pub duration: u128, |
10 | 11 | pub artist: Option<MetadataTag>, |
@@ -44,9 +45,67 @@ pub struct Song { |
44 | 45 | pub musicbrainz_workid: Option<MetadataTag>, |
45 | 46 | } |
46 | 47 |
|
| 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 | + |
47 | 105 | impl From<&MpdSong> for Song { |
48 | 106 | fn from(value: &MpdSong) -> Self { |
49 | 107 | Self { |
| 108 | + id: value.id, |
50 | 109 | file: value.file.clone(), |
51 | 110 | duration: value.duration.map(|d| d.as_millis()).unwrap_or_default(), |
52 | 111 | artist: value.metadata.get("artist").to_metadata_tag(), |
@@ -101,7 +160,12 @@ impl From<&MpdSong> for Song { |
101 | 160 | } |
102 | 161 |
|
103 | 162 | 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 | + |
104 | 167 | fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) { |
| 168 | + fields.add_field_method_get("id", |_, this| Ok(this.id)); |
105 | 169 | fields.add_field_method_get("file", |_, this| Ok(this.file.clone())); |
106 | 170 | fields.add_field_method_get("duration", |_, this| Ok(this.duration)); |
107 | 171 | fields.add_field_method_get("artist", |_, this| Ok(this.artist.clone())); |
|
0 commit comments