@@ -11,16 +11,31 @@ use crate::{
1111} ;
1212
1313#[ derive( Debug , Default , Clone , Serialize , Deserialize , JsonSchema , TS ) ]
14+ #[ serde( default , rename_all = "camelCase" ) ]
1415#[ cfg_attr( feature = "gen-binds" , ts( export) ) ]
1516pub struct Wallpaper {
1617 pub id : WallpaperId ,
1718 pub metadata : ResourceMetadata ,
19+ pub r#type : WallpaperKind ,
1820 pub url : Option < Url > ,
1921 pub thumbnail_url : Option < Url > ,
2022 pub filename : Option < String > ,
23+ #[ serde( alias = "thumbnail_filename" ) ]
2124 pub thumbnail_filename : Option < String > ,
2225}
2326
27+ #[ derive( Debug , Default , Clone , Copy , PartialEq , Eq , Serialize , Deserialize , JsonSchema , TS ) ]
28+ #[ ts( repr( enum = name) ) ]
29+ pub enum WallpaperKind {
30+ #[ serde( alias = "image" ) ]
31+ Image ,
32+ #[ serde( alias = "video" ) ]
33+ Video ,
34+ /// used for wallpapers created before v2.4.9, will be changed on sanitization
35+ #[ default]
36+ Unsupported ,
37+ }
38+
2439impl SluResource for Wallpaper {
2540 const KIND : ResourceKind = ResourceKind :: Wallpaper ;
2641
@@ -31,6 +46,33 @@ impl SluResource for Wallpaper {
3146 fn metadata_mut ( & mut self ) -> & mut ResourceMetadata {
3247 & mut self . metadata
3348 }
49+
50+ fn sanitize ( & mut self ) {
51+ // migration step for old wallpapers
52+ if WallpaperKind :: Unsupported == self . r#type {
53+ if let Some ( filename) = & self . filename {
54+ if Self :: SUPPORTED_VIDEOS
55+ . iter ( )
56+ . any ( |ext| filename. ends_with ( ext) )
57+ {
58+ self . r#type = WallpaperKind :: Video ;
59+ }
60+ if Self :: SUPPORTED_IMAGES
61+ . iter ( )
62+ . any ( |ext| filename. ends_with ( ext) )
63+ {
64+ self . r#type = WallpaperKind :: Image ;
65+ }
66+ }
67+ }
68+ }
69+
70+ fn validate ( & self ) -> Result < ( ) > {
71+ if self . r#type == WallpaperKind :: Unsupported {
72+ return Err ( "Unsupported wallpaper extension" . into ( ) ) ;
73+ }
74+ Ok ( ( ) )
75+ }
3476}
3577
3678impl Wallpaper {
@@ -74,16 +116,26 @@ impl Wallpaper {
74116 std:: fs:: rename ( path, folder_to_store. join ( & filename) ) ?;
75117 }
76118
119+ let r#type = if Self :: SUPPORTED_IMAGES . contains ( & ext. as_str ( ) ) {
120+ WallpaperKind :: Image
121+ } else if Self :: SUPPORTED_VIDEOS . contains ( & ext. as_str ( ) ) {
122+ WallpaperKind :: Video
123+ } else {
124+ WallpaperKind :: Unsupported
125+ } ;
126+
77127 let wallpaper = Self {
78128 id,
79129 metadata,
130+ r#type,
131+ url : None ,
132+ thumbnail_url : None ,
80133 filename : Some ( filename. clone ( ) ) ,
81134 thumbnail_filename : if Self :: SUPPORTED_IMAGES . contains ( & ext. as_str ( ) ) {
82135 Some ( filename)
83136 } else {
84137 None
85138 } ,
86- ..Default :: default ( )
87139 } ;
88140 wallpaper. save ( ) ?;
89141
0 commit comments