Compare commits

..

107 Commits

Author SHA1 Message Date
0552561851 tsk-90: Add UserClaims (#91)
All checks were successful
Release Tagging / release (push) Successful in 32s
Rust Build / Check (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 34s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 33s
Rust Build / build (push) Successful in 34s
Closes #90

Reviewed-on: #91
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-30 19:24:37 +00:00
678d2c2b3d tsk-85: Add file_type to CoverArt (#89)
All checks were successful
Release Tagging / release (push) Successful in 32s
Rust Build / Check (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 1m1s
Rust Build / Clippy (push) Successful in 33s
Rust Build / build (push) Successful in 32s
Closes #85

Reviewed-on: #89
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-29 18:14:23 +00:00
b5429f80b0 tsk-86: Make MusicTypes and CoverArtTypes singular (#88)
All checks were successful
Release Tagging / release (push) Successful in 34s
Rust Build / Check (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 30s
Rust Build / Clippy (push) Successful in 34s
Rust Build / build (push) Successful in 32s
Closes #86

Reviewed-on: #88
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-29 18:00:56 +00:00
432078e3c2 tsk-83: Add None value for MusicTypes and CoverArtTypes (#87)
All checks were successful
Release Tagging / release (push) Successful in 33s
Rust Build / Check (push) Successful in 34s
Rust Build / Test Suite (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 32s
Rust Build / build (push) Successful in 32s
Closes #83

Reviewed-on: #87
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-28 17:05:13 +00:00
0a27b8ccb1 filename generation fix (#82)
All checks were successful
Rust Build / Check (push) Successful in 31s
Release Tagging / release (push) Successful in 35s
Rust Build / Test Suite (push) Successful in 42s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Successful in 35s
Rust Build / build (push) Successful in 42s
Reviewed-on: #82
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-24 17:21:07 +00:00
afc4ca21a2 tsk-76: Improve getting path of Song or CoverArt (#81)
All checks were successful
Rust Build / Test Suite (push) Successful in 28s
Release Tagging / release (push) Successful in 36s
Rust Build / Check (push) Successful in 43s
Rust Build / Rustfmt (push) Successful in 24s
Rust Build / build (push) Successful in 26s
Rust Build / Clippy (push) Successful in 35s
Closes #76

Reviewed-on: #81
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-24 16:51:08 +00:00
02b6157e0d tsk-79: Create function to generate CoverArt filename (#80)
All checks were successful
Release Tagging / release (push) Successful in 31s
Rust Build / Check (push) Successful in 34s
Rust Build / Test Suite (push) Successful in 50s
Rust Build / Rustfmt (push) Successful in 23s
Rust Build / Clippy (push) Successful in 33s
Rust Build / build (push) Successful in 43s
Closes #79

Reviewed-on: #80
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-24 16:19:38 +00:00
860d684e7b Merge pull request 'v0.8 Changes' (#75) from next-v0.8 into main
All checks were successful
Release Tagging / release (push) Successful in 1m0s
Rust Build / Rustfmt (push) Successful in 54s
Rust Build / build (push) Successful in 1m14s
Rust Build / Test Suite (push) Successful in 1m42s
Rust Build / Clippy (push) Successful in 1m39s
Rust Build / Check (push) Successful in 1m13s
Reviewed-on: #75
2025-10-20 01:47:05 +00:00
97783568e9 cargo update
All checks were successful
Rust Build / build (pull_request) Successful in 1m2s
Rust Build / Clippy (pull_request) Successful in 1m6s
Rust Build / Check (pull_request) Successful in 50s
Rust Build / Rustfmt (pull_request) Successful in 44s
Rust Build / Test Suite (pull_request) Successful in 1m12s
2025-10-19 21:25:30 -04:00
5a8118726b Version bump
All checks were successful
Rust Build / Check (pull_request) Successful in 43s
Rust Build / Test Suite (pull_request) Successful in 48s
Rust Build / Clippy (pull_request) Successful in 33s
Rust Build / Rustfmt (pull_request) Successful in 1m8s
Rust Build / build (pull_request) Successful in 39s
2025-10-19 21:23:32 -04:00
9dcf46ec0a Updated workflows
All checks were successful
Rust Build / Rustfmt (pull_request) Successful in 1m36s
Rust Build / Clippy (pull_request) Successful in 52s
Rust Build / build (pull_request) Successful in 54s
Rust Build / Check (pull_request) Successful in 1m16s
Rust Build / Test Suite (pull_request) Successful in 1m32s
2025-10-19 21:08:08 -04:00
44d08cdb1f tsk-71: Add token expiration checks (#78)
All checks were successful
Rust Build / Check (pull_request) Successful in 58s
Rust Build / Test Suite (pull_request) Successful in 45s
Rust Build / build (pull_request) Successful in 38s
Release Tagging / release (push) Successful in 36s
Rust Build / Rustfmt (pull_request) Successful in 1m3s
Rust Build / Clippy (pull_request) Successful in 36s
Closes #71

Reviewed-on: #78
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-19 02:18:29 +00:00
51c8b5c7b3 tsk-73: Change data type of song from string to date (#77)
All checks were successful
Release Tagging / release (push) Successful in 42s
Release Tagging / release (pull_request) Successful in 1m4s
Rust Build / Check (pull_request) Successful in 34s
Rust Build / Clippy (pull_request) Successful in 31s
Rust Build / Test Suite (pull_request) Successful in 58s
Rust Build / Rustfmt (pull_request) Successful in 1m2s
Rust Build / build (pull_request) Successful in 35s
Closes #73

Reviewed-on: #77
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-19 01:45:35 +00:00
8041dc6ff5 tsk-72: Separating directory and filename from path in coverart (#74)
All checks were successful
Rust Build / Check (pull_request) Successful in 46s
Rust Build / Test Suite (pull_request) Successful in 36s
Rust Build / Clippy (pull_request) Successful in 40s
Rust Build / Rustfmt (pull_request) Successful in 1m13s
Rust Build / build (pull_request) Successful in 37s
Release Tagging / release (pull_request) Successful in 44s
This will be a breaking change

Closes #72

Reviewed-on: #74
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-19 00:48:49 +00:00
11e5b1745c tsk-59 (#70)
All checks were successful
Rust Build / Check (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 34s
Rust Build / Test Suite (push) Successful in 1m19s
Rust Build / Clippy (push) Successful in 36s
Rust Build / build (push) Successful in 1m31s
Release Tagging / release (pull_request) Successful in 1m10s
Rust Build / Check (pull_request) Successful in 38s
Rust Build / Rustfmt (pull_request) Successful in 33s
Rust Build / Test Suite (pull_request) Successful in 1m25s
Rust Build / build (pull_request) Successful in 39s
Rust Build / Clippy (pull_request) Successful in 32s
Closes #59

Reviewed-on: #70
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-12 20:44:23 +00:00
4e649fa390 Dependency update (#69)
All checks were successful
Rust Build / Check (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 1m13s
Rust Build / Clippy (push) Successful in 40s
Rust Build / build (push) Successful in 50s
Reviewed-on: #69
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-12 20:34:46 +00:00
668d371f7f Merge pull request 'Coverart changes' (#65) from coverart_changes into main
All checks were successful
Rust Build / Check (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 31s
Rust Build / build (push) Successful in 31s
Rust Build / Test Suite (push) Successful in 33s
Release Tagging / release (pull_request) Successful in 31s
Rust Build / Check (pull_request) Successful in 30s
Rust Build / Test Suite (pull_request) Successful in 12m55s
Rust Build / Rustfmt (pull_request) Successful in 26m11s
Rust Build / Clippy (pull_request) Successful in 36s
Rust Build / build (pull_request) Successful in 35s
Reviewed-on: #65
2025-10-11 22:18:24 +00:00
eac7562b80 Coverart remove file (#68)
All checks were successful
Release Tagging / release (pull_request) Successful in 31s
Rust Build / Check (pull_request) Successful in 31s
Rust Build / Test Suite (pull_request) Successful in 34s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / Clippy (pull_request) Successful in 33s
Rust Build / build (pull_request) Successful in 31s
Reviewed-on: #68
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 22:14:10 +00:00
e3ca2c5781 Coverart save to filesystem (#67)
All checks were successful
Release Tagging / release (pull_request) Successful in 36s
Rust Build / Check (pull_request) Successful in 41s
Rust Build / Test Suite (pull_request) Successful in 43s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / Clippy (pull_request) Successful in 2m12s
Rust Build / build (pull_request) Successful in 2m18s
Reviewed-on: #67
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 20:30:39 +00:00
440caca7c2 Moved to_data (#66)
Some checks failed
Rust Build / Check (pull_request) Successful in 33s
Release Tagging / release (pull_request) Successful in 36s
Rust Build / Test Suite (pull_request) Successful in 45s
Rust Build / Rustfmt (pull_request) Successful in 33s
Rust Build / Clippy (pull_request) Failing after 44s
Rust Build / build (pull_request) Successful in 1m7s
Reviewed-on: #66
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 20:11:39 +00:00
0c0b4ba7ca Merge pull request 'Song changes' (#60) from song_changes into main
Some checks failed
Rust Build / Check (push) Successful in 30s
Rust Build / Rustfmt (push) Successful in 33s
Rust Build / Test Suite (push) Successful in 39s
Rust Build / Clippy (push) Failing after 36s
Rust Build / build (push) Successful in 35s
Rust Build / Check (pull_request) Successful in 32s
Release Tagging / release (pull_request) Failing after 36s
Rust Build / Test Suite (pull_request) Successful in 34s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / build (pull_request) Successful in 31s
Rust Build / Clippy (pull_request) Failing after 34s
Reviewed-on: #60
2025-10-11 19:49:52 +00:00
c263cedf28 Remove song (#64)
Some checks failed
Release Tagging / release (pull_request) Successful in 33s
Rust Build / Check (pull_request) Successful in 43s
Rust Build / Test Suite (pull_request) Successful in 44s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / Clippy (pull_request) Failing after 32s
Rust Build / build (pull_request) Successful in 38s
Reviewed-on: #64
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 19:46:00 +00:00
0637a9432e Changes to how song filenames are generated (#63)
Some checks failed
Rust Build / Test Suite (pull_request) Successful in 35s
Rust Build / Check (pull_request) Successful in 38s
Release Tagging / release (pull_request) Successful in 48s
Rust Build / Rustfmt (pull_request) Failing after 33s
Rust Build / Clippy (pull_request) Successful in 34s
Rust Build / build (pull_request) Successful in 35s
Reviewed-on: #63
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 19:20:57 +00:00
d7c078d95a Song to_data change (#62)
All checks were successful
Rust Build / Check (pull_request) Successful in 35s
Release Tagging / release (pull_request) Successful in 43s
Rust Build / Test Suite (pull_request) Successful in 46s
Rust Build / Rustfmt (pull_request) Successful in 33s
Rust Build / build (pull_request) Successful in 33s
Rust Build / Clippy (pull_request) Successful in 50s
Reviewed-on: #62
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 19:02:01 +00:00
00cada74e2 Copy song (#61)
Some checks failed
Rust Build / Check (pull_request) Successful in 42s
Release Tagging / release (pull_request) Successful in 44s
Rust Build / Test Suite (pull_request) Failing after 1m2s
Rust Build / Rustfmt (pull_request) Successful in 30s
Rust Build / Clippy (pull_request) Successful in 36s
Rust Build / build (pull_request) Successful in 50s
Reviewed-on: #61
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-10-11 18:53:13 +00:00
9436c9033a Added todo
All checks were successful
Release Tagging / release (pull_request) Successful in 44s
Rust Build / Test Suite (pull_request) Successful in 49s
Rust Build / Check (pull_request) Successful in 57s
Rust Build / Rustfmt (pull_request) Successful in 29s
Rust Build / Clippy (pull_request) Successful in 47s
Rust Build / build (pull_request) Successful in 59s
2025-10-11 14:23:23 -04:00
85d8f839f1 Code formatting
All checks were successful
Rust Build / Test Suite (pull_request) Successful in 1m38s
Rust Build / Rustfmt (pull_request) Successful in 32s
Release Tagging / release (pull_request) Successful in 2m17s
Rust Build / Check (pull_request) Successful in 2m30s
Rust Build / Clippy (pull_request) Successful in 57s
Rust Build / build (pull_request) Successful in 1m1s
2025-10-11 14:19:45 -04:00
16f633d563 Added test 2025-10-11 14:19:30 -04:00
0b53eb8208 Added more todos 2025-10-11 14:19:21 -04:00
73c8fd2634 Tweaked some changes 2025-10-11 14:17:32 -04:00
fa8643e73a Added function to save song to the filesystem 2025-10-11 14:08:20 -04:00
2d6b550ae6 tsk-57: Adding derive Schema to models (#58)
All checks were successful
Rust Build / Check (push) Successful in 31s
Rust Build / Test Suite (push) Successful in 1m0s
Rust Build / Rustfmt (push) Successful in 31s
Rust Build / Clippy (push) Successful in 37s
Rust Build / build (push) Successful in 46s
Closes #57

Reviewed-on: #58
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-08-24 23:42:04 +00:00
f43bcaa314 Merge pull request 'Release' (#50) from devel into main
All checks were successful
Rust Build / Test Suite (push) Successful in 35s
Rust Build / Rustfmt (push) Successful in 1s
Rust Build / Check (push) Successful in 14s
Rust Build / build (push) Successful in 9s
Rust Build / Clippy (push) Successful in 52s
Reviewed-on: #50
2025-08-17 18:36:04 +00:00
a6ef7d8a62 Removed devel branch references (#56)
All checks were successful
Release Tagging / release (pull_request) Successful in 10s
Rust Build / Check (pull_request) Successful in 12s
Rust Build / Test Suite (pull_request) Successful in 1m3s
Rust Build / Rustfmt (pull_request) Successful in -6s
Rust Build / Clippy (pull_request) Successful in 9s
Rust Build / build (pull_request) Successful in 53s
Reviewed-on: #56
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-08-17 18:31:05 +00:00
bd793db08e Add Id to token (#55)
All checks were successful
Release Tagging / release (push) Successful in 39s
Rust Build / Check (push) Successful in 41s
Rust Build / Rustfmt (push) Successful in 36s
Rust Build / Test Suite (push) Successful in 37s
Rust Build / Clippy (push) Successful in 33s
Rust Build / build (push) Successful in 34s
Rust Build / Test Suite (pull_request) Successful in 31s
Rust Build / Check (pull_request) Successful in 33s
Rust Build / Clippy (pull_request) Successful in 31s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / build (pull_request) Successful in 41s
Reviewed-on: #55
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-08-06 22:45:32 +00:00
1e95822b5a tsk-51: Do not serialize path field for CoverArt (#54)
All checks were successful
Rust Build / Check (push) Successful in 30s
Release Tagging / release (push) Successful in 33s
Rust Build / Test Suite (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 31s
Rust Build / build (push) Successful in 27s
Rust Build / Clippy (push) Successful in 32s
Rust Build / Test Suite (pull_request) Successful in 30s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 30s
Rust Build / Clippy (pull_request) Successful in 38s
Rust Build / build (pull_request) Successful in 28s
Reviewed-on: #54
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-08-01 20:18:09 +00:00
228ca67a16 Create token refactor (#53)
All checks were successful
Rust Build / Check (push) Successful in 29s
Release Tagging / release (push) Successful in 31s
Rust Build / Test Suite (push) Successful in 29s
Rust Build / Rustfmt (push) Successful in 30s
Rust Build / Clippy (push) Successful in 27s
Rust Build / build (push) Successful in 32s
Rust Build / Check (pull_request) Successful in 25s
Rust Build / Test Suite (pull_request) Successful in 32s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 32s
Rust Build / build (pull_request) Successful in 30s
Reviewed-on: #53
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-08-01 20:04:33 +00:00
d3251f935e add create token function (#52)
All checks were successful
Rust Build / Check (push) Successful in 31s
Release Tagging / release (push) Successful in 35s
Rust Build / Rustfmt (push) Successful in 30s
Rust Build / Test Suite (push) Successful in 40s
Rust Build / Clippy (push) Successful in 32s
Rust Build / build (push) Successful in 30s
Rust Build / Check (pull_request) Successful in 36s
Rust Build / Test Suite (pull_request) Successful in 44s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / build (pull_request) Successful in 30s
Rust Build / Clippy (pull_request) Successful in 45s
Reviewed-on: #52
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-07-31 01:13:02 +00:00
1c5de9dc26 coverart add song_id (#49)
All checks were successful
Rust Build / Check (push) Successful in 26s
Release Tagging / release (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 29s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 29s
Rust Build / Test Suite (pull_request) Successful in 26s
Rust Build / Check (pull_request) Successful in 30s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 32s
Rust Build / build (pull_request) Successful in 34s
Reviewed-on: #49
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-07-26 16:35:51 +00:00
569fb632e5 Merge pull request 'v0.5.X release' (#41) from devel into main
All checks were successful
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 30s
Rust Build / Rustfmt (push) Successful in 30s
Rust Build / Clippy (push) Successful in 31s
Rust Build / build (push) Successful in 27s
Reviewed-on: #41
2025-07-23 21:59:40 +00:00
7839c64561 Version bump (#48)
All checks were successful
Rust Build / build (push) Successful in 30s
Rust Build / Test Suite (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 26s
Rust Build / build (pull_request) Successful in 25s
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Successful in 27s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 26s
Reviewed-on: #48
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-07-23 21:54:10 +00:00
655d05dabb Coverart ignore data for json usage (#47)
All checks were successful
Release Tagging / release (push) Successful in 30s
Rust Build / Check (push) Successful in 25s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 27s
Rust Build / build (pull_request) Successful in 29s
Rust Build / Check (pull_request) Successful in 29s
Rust Build / Test Suite (pull_request) Successful in 28s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 27s
Reviewed-on: #47
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-07-14 23:57:00 +00:00
7958b89abc Update readme (#46)
All checks were successful
Release Tagging / release (push) Successful in 30s
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 28s
Rust Build / Rustfmt (push) Successful in 27s
Rust Build / Clippy (push) Successful in 29s
Rust Build / build (push) Successful in 27s
Rust Build / Check (pull_request) Successful in 38s
Rust Build / Test Suite (pull_request) Successful in 40s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 52s
Rust Build / build (pull_request) Successful in 43s
Reviewed-on: #46
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-06-29 18:14:18 +00:00
c0d23e0640 Version bump (#45)
All checks were successful
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 29s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 26s
Rust Build / build (push) Successful in 28s
Release Tagging / release (push) Successful in 31s
Rust Build / Check (pull_request) Successful in 25s
Rust Build / Test Suite (pull_request) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 28s
Reviewed-on: #45
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-06-29 18:02:23 +00:00
1a64b512f4 Removing some code (#44)
All checks were successful
Release Tagging / release (push) Successful in 30s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 27s
Rust Build / Check (pull_request) Successful in 28s
Rust Build / Test Suite (pull_request) Successful in 28s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 26s
Taking out code that wasn't being used and was commented.

Reviewed-on: #44
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-06-29 17:54:23 +00:00
e5082ea07d Updated dependencies (#43)
All checks were successful
Rust Build / Check (push) Successful in 25s
Rust Build / Test Suite (push) Successful in 26s
Rust Build / Rustfmt (push) Successful in 24s
Rust Build / Clippy (push) Successful in 27s
Rust Build / build (push) Successful in 25s
Rust Build / Check (pull_request) Successful in 25s
Rust Build / Test Suite (pull_request) Successful in 27s
Release Tagging / release (push) Successful in 29s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 27s
serde, serde_json, rand, uuid, and tempfile

Reviewed-on: #43
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-06-29 17:46:12 +00:00
f37c445908 rust std change (#42)
Some checks failed
Release Tagging / release (push) Failing after 29s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Successful in 26s
Rust Build / build (push) Successful in 24s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Test Suite (pull_request) Successful in 26s
Rust Build / build (pull_request) Successful in 26s
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 26s
Reviewed-on: #42
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-06-29 17:37:13 +00:00
6aa4c3d741 Merge pull request 'Next release' (#38) from devel into main
All checks were successful
Release Tagging / release (push) Successful in 42s
Rust Build / Check (push) Successful in 33s
Rust Build / Test Suite (push) Successful in 39s
Rust Build / Rustfmt (push) Successful in 31s
Rust Build / Clippy (push) Successful in 37s
Rust Build / build (push) Successful in 30s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Test Suite (pull_request) Successful in 25s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 27s
Rust Build / build (pull_request) Successful in 26s
Reviewed-on: #38
2025-04-10 23:49:19 +00:00
47475639b0 Version bump (#40)
All checks were successful
Release Tagging / release (push) Successful in 47s
Rust Build / Check (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 40s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 39s
Rust Build / build (push) Successful in 33s
Rust Build / Check (pull_request) Successful in 40s
Rust Build / Test Suite (pull_request) Successful in 42s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 40s
Rust Build / build (pull_request) Successful in 39s
Reviewed-on: #40
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-04-10 23:28:00 +00:00
73c17840ff Implemented functionality and wrote test for checking token scope (#39)
All checks were successful
Release Tagging / release (push) Successful in 54s
Rust Build / Check (push) Successful in 40s
Rust Build / Test Suite (push) Successful in 34s
Rust Build / Rustfmt (push) Successful in 36s
Rust Build / Clippy (push) Successful in 31s
Rust Build / build (push) Successful in 37s
Rust Build / Check (pull_request) Successful in 28s
Rust Build / Test Suite (pull_request) Successful in 41s
Rust Build / Rustfmt (pull_request) Successful in 33s
Rust Build / Clippy (pull_request) Successful in 37s
Rust Build / build (pull_request) Successful in 27s
Reviewed-on: #39
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-04-10 22:30:01 +00:00
2dbed9fec9 token_type_change (#37)
All checks were successful
Release Tagging / release (push) Successful in 33s
Rust Build / Check (push) Successful in 29s
Rust Build / Test Suite (push) Successful in 38s
Rust Build / Rustfmt (push) Successful in 31s
Rust Build / Clippy (push) Successful in 38s
Rust Build / build (push) Successful in 29s
Rust Build / Check (pull_request) Successful in 30s
Rust Build / Test Suite (pull_request) Successful in 37s
Rust Build / Rustfmt (pull_request) Successful in 29s
Rust Build / Clippy (pull_request) Successful in 36s
Rust Build / build (pull_request) Successful in 31s
Reviewed-on: #37
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-04-09 02:38:20 +00:00
97853a42c1 Merge pull request 'workflow_tag_fix (#33)' (#34) from devel into main
All checks were successful
Release Tagging / release (push) Successful in 32s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 33s
Reviewed-on: #34
2025-04-07 01:09:43 +00:00
6467521a02 Changed expiration field of LoginResult to i64 (#36)
All checks were successful
Rust Build / Test Suite (push) Successful in 29s
Rust Build / Clippy (push) Successful in 30s
Rust Build / Clippy (pull_request) Successful in 29s
Rust Build / build (pull_request) Successful in 35s
Release Tagging / release (push) Successful in 34s
Rust Build / Check (push) Successful in 28s
Rust Build / Rustfmt (push) Successful in 34s
Rust Build / build (push) Successful in 28s
Rust Build / Check (pull_request) Successful in 32s
Rust Build / Test Suite (pull_request) Successful in 31s
Rust Build / Rustfmt (pull_request) Successful in 27s
Reviewed-on: #36
Co-authored-by: phoenix <kundeng00@pm.me>
Co-committed-by: phoenix <kundeng00@pm.me>
2025-04-07 00:47:51 +00:00
6411133c95 workflow_tag_fix (#35)
All checks were successful
Release Tagging / release (push) Successful in 36s
Rust Build / Check (push) Successful in 31s
Rust Build / Test Suite (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 33s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 31s
Rust Build / Check (pull_request) Successful in 31s
Rust Build / Test Suite (pull_request) Successful in 30s
Rust Build / Rustfmt (pull_request) Successful in 28s
Rust Build / Clippy (pull_request) Successful in 34s
Rust Build / build (pull_request) Successful in 30s
Reviewed-on: #35
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 21:59:26 +00:00
8a08672423 workflow_tag_fix (#33)
Some checks failed
Release Tagging / release (push) Failing after 37s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 36s
Rust Build / Rustfmt (push) Successful in 29s
Rust Build / Clippy (push) Successful in 29s
Rust Build / build (push) Successful in 34s
Rust Build / Clippy (pull_request) Successful in 32s
Rust Build / build (pull_request) Successful in 28s
Rust Build / Check (pull_request) Successful in 26s
Rust Build / Test Suite (pull_request) Successful in 29s
Rust Build / Rustfmt (pull_request) Successful in 27s
Reviewed-on: #33
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 21:27:50 +00:00
fdae8056b1 Merge pull request 'Next release' (#30) from devel into main
All checks were successful
Rust Build / Check (push) Successful in 30s
Rust Build / Test Suite (push) Successful in 35s
Rust Build / Rustfmt (push) Successful in 29s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 30s
Release Tagging / release (push) Successful in 34s
Reviewed-on: #30
2025-04-05 18:38:37 +00:00
c555110367 rust_version_bump (#32)
All checks were successful
Rust Build / Rustfmt (push) Successful in 33s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 27s
Rust Build / build (pull_request) Successful in 27s
Release Tagging / release (push) Successful in 37s
Rust Build / Check (push) Successful in 30s
Rust Build / Test Suite (push) Successful in 30s
Rust Build / Clippy (push) Successful in 29s
Rust Build / build (push) Successful in 29s
Rust Build / Check (pull_request) Successful in 31s
Rust Build / Test Suite (pull_request) Successful in 29s
Reviewed-on: #32
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 18:13:28 +00:00
4b6f6cb67d rust_version (#31)
Some checks failed
Release Tagging / release (push) Failing after 31s
Rust Build / Test Suite (push) Failing after 29s
Rust Build / Rustfmt (push) Successful in 27s
Rust Build / Check (push) Failing after 30s
Rust Build / Check (pull_request) Failing after 32s
Rust Build / Test Suite (pull_request) Failing after 28s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / build (pull_request) Failing after 29s
Rust Build / Clippy (push) Failing after 28s
Rust Build / build (push) Failing after 27s
Rust Build / Clippy (pull_request) Failing after 33s
Reviewed-on: #31
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 17:30:16 +00:00
e9d73c391e user_change_again (#29)
All checks were successful
Release Tagging / release (push) Successful in 36s
Rust Build / Check (pull_request) Successful in 29s
Rust Build / Test Suite (pull_request) Successful in 31s
Rust Build / Rustfmt (pull_request) Successful in 31s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 28s
Rust Build / Check (push) Successful in 32s
Rust Build / Test Suite (push) Successful in 31s
Rust Build / Rustfmt (push) Successful in 28s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 33s
Reviewed-on: #29
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 16:58:52 +00:00
d476b128cb user_change (#28)
All checks were successful
Rust Build / Check (push) Successful in 34s
Rust Build / Test Suite (push) Successful in 30s
Rust Build / Rustfmt (push) Successful in 27s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 31s
Release Tagging / release (push) Successful in 31s
Reviewed-on: #28
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 16:25:57 +00:00
255aff414a user_and_salt (#27)
All checks were successful
Release Tagging / release (push) Successful in 31s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 32s
Rust Build / Rustfmt (push) Successful in 32s
Rust Build / Clippy (push) Successful in 31s
Rust Build / build (push) Successful in 33s
Reviewed-on: #27
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-05 15:39:44 +00:00
24aa60cb48 Merge pull request 'Next release' (#25) from devel into main
All checks were successful
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 35s
Rust Build / Rustfmt (push) Successful in 28s
Rust Build / Clippy (push) Successful in 31s
Rust Build / build (push) Successful in 30s
Release Tagging / release (push) Successful in 34s
Reviewed-on: #25
2025-04-04 04:08:03 +00:00
6a0135c6fa Id fix (#26)
All checks were successful
Release Tagging / release (push) Successful in 31s
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 29s
Rust Build / Check (pull_request) Successful in 42s
Rust Build / Test Suite (pull_request) Successful in 34s
Rust Build / Rustfmt (push) Successful in 29s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 36s
Rust Build / Clippy (pull_request) Successful in 31s
Rust Build / build (pull_request) Successful in 34s
Reviewed-on: #26
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-04 02:57:00 +00:00
8fbd92620e Added function to make coverart init easier (#24)
All checks were successful
Release Tagging / release (push) Successful in 32s
Rust Build / Check (push) Successful in 29s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 26s
Rust Build / build (push) Successful in 32s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 28s
Rust Build / Check (pull_request) Successful in 31s
Rust Build / Test Suite (pull_request) Successful in 38s
Reviewed-on: #24
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-04 02:21:31 +00:00
61ad88a258 First model change (#23)
All checks were successful
Release Tagging / release (push) Successful in 29s
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 26s
Rust Build / Rustfmt (push) Successful in 33s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 28s
Reviewed-on: #23
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-04-04 01:48:27 +00:00
d8eadb8187 Merge pull request 'v0.2.0 Release' (#20) from devel into main
Some checks failed
Rust Build / Check (push) Successful in 28s
Rust Build / Test Suite (push) Successful in 31s
Rust Build / Rustfmt (push) Successful in 31s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 27s
Release Tagging / release (push) Failing after 34s
Reviewed-on: phoenix/icarus-models#20
2025-03-30 17:21:27 +00:00
KD
a64d35d153 Version bump (#22)
All checks were successful
Release Tagging / release (push) Successful in 31s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 31s
Rust Build / Check (push) Successful in 38s
Rust Build / Test Suite (push) Successful in 30s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 30s
Rust Build / build (push) Successful in 37s
Rust Build / Test Suite (pull_request) Successful in 28s
Rust Build / Rustfmt (pull_request) Successful in 30s
Rust Build / build (pull_request) Successful in 28s
v0.1.16

Reviewed-on: phoenix/icarus-models#22
Co-authored-by: KD <kundeng94@gmail.com>
Co-committed-by: KD <kundeng94@gmail.com>
2025-03-30 17:14:13 +00:00
f6fdb717e9 Merge pull request 'Changing project name' (#21) from name_change into devel
Some checks failed
Rust Build / Rustfmt (push) Successful in 28s
Rust Build / Clippy (push) Successful in 28s
Rust Build / Test Suite (pull_request) Successful in 29s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Check (push) Successful in 34s
Rust Build / Test Suite (push) Successful in 30s
Rust Build / build (push) Successful in 32s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 30s
Rust Build / build (pull_request) Successful in 32s
Release Tagging / release (push) Has been cancelled
Reviewed-on: phoenix/icarus-models#21
2025-03-30 16:55:14 +00:00
e5c1eabe8c Removed main branch from tag release workflow (#19)
Some checks failed
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / build (pull_request) Successful in 28s
Rust Build / Check (pull_request) Successful in 28s
Rust Build / Test Suite (pull_request) Successful in 32s
Rust Build / Clippy (pull_request) Successful in 28s
Release Tagging / release (push) Has been cancelled
Rust Build / Check (push) Waiting to run
Rust Build / Test Suite (push) Waiting to run
Rust Build / Rustfmt (push) Waiting to run
Rust Build / Clippy (push) Waiting to run
Rust Build / build (push) Waiting to run
Reviewed-on: phoenix/icarus-models#19
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-30 16:53:17 +00:00
a8ffe80297 Changing project name
All checks were successful
Rust Build / Check (pull_request) Successful in 28s
Rust Build / Test Suite (pull_request) Successful in 30s
Rust Build / Rustfmt (pull_request) Successful in 28s
Rust Build / Clippy (pull_request) Successful in 33s
Rust Build / build (pull_request) Successful in 29s
Change name in the project settings and in other projects later
2025-03-29 19:35:02 -04:00
KD
56384fb371 Added file extension constant and updated constants module (#17)
All checks were successful
Rust Build / Check (push) Successful in 22s
Rust Build / Test Suite (push) Successful in 27s
Rust Build / Rustfmt (push) Successful in 23s
Rust Build / Clippy (push) Successful in 24s
Rust Build / build (push) Successful in 25s
Rust Build / Check (pull_request) Successful in 26s
Rust Build / Test Suite (pull_request) Successful in 28s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 29s
Rust Build / build (pull_request) Successful in 30s
Release Tagging / release (push) Successful in 29s
Reviewed-on: phoenix/icarus-models#17
Co-authored-by: KD <kundeng94@gmail.com>
Co-committed-by: KD <kundeng94@gmail.com>
2025-03-29 22:37:02 +00:00
bf5808a06a Added default to coverart model (#18)
Some checks failed
Rust Build / Clippy (push) Waiting to run
Rust Build / build (push) Waiting to run
Rust Build / Check (push) Waiting to run
Rust Build / Test Suite (push) Waiting to run
Rust Build / Rustfmt (push) Waiting to run
Release Tagging / release (push) Failing after 32s
Reviewed-on: phoenix/icarus-models#18
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-29 22:36:47 +00:00
2b2e96c02d Merge pull request 'devel' (#16) from devel into main
All checks were successful
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 26s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 26s
Rust Build / build (push) Successful in 26s
Release Tagging / release (push) Successful in 28s
Reviewed-on: phoenix/icarus-models#16
2025-03-22 21:24:15 +00:00
1c5c0ca70c Adding album tests (#13)
All checks were successful
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Successful in 26s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Successful in 27s
Rust Build / build (push) Successful in 26s
Rust Build / Check (pull_request) Successful in 27s
Rust Build / Test Suite (pull_request) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 27s
Rust Build / build (pull_request) Successful in 25s
Reviewed-on: phoenix/icarus-models#13
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-22 21:19:07 +00:00
bc3aace070 Added tests (#12)
All checks were successful
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Successful in 27s
Rust Build / Test Suite (push) Successful in 33s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Successful in 28s
Rust Build / build (push) Successful in 25s
Rust Build / Check (pull_request) Successful in 26s
Rust Build / Test Suite (pull_request) Successful in 26s
Rust Build / Rustfmt (pull_request) Successful in 25s
Rust Build / Clippy (pull_request) Successful in 26s
Rust Build / build (pull_request) Successful in 25s
Reviewed-on: phoenix/icarus-models#12
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-22 20:32:04 +00:00
ae2fd07229 Removing test (#14)
Some checks failed
Rust Build / Rustfmt (push) Waiting to run
Rust Build / Clippy (push) Waiting to run
Rust Build / build (push) Waiting to run
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Successful in 26s
Rust Build / Test Suite (push) Has been cancelled
Reviewed-on: phoenix/icarus-models#14
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-22 20:31:03 +00:00
e0617b3fb8 Workflow change (#15)
Some checks failed
Rust Build / Rustfmt (push) Waiting to run
Rust Build / Clippy (push) Waiting to run
Rust Build / build (push) Waiting to run
Release Tagging / release (push) Successful in 31s
Rust Build / Check (push) Successful in 25s
Rust Build / Test Suite (push) Has been cancelled
Reviewed-on: phoenix/icarus-models#15
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-22 20:30:00 +00:00
KD
351147cb64 Fixed some warnings (#11)
All checks were successful
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Successful in 25s
Rust Build / Test Suite (push) Successful in 26s
Rust Build / Rustfmt (push) Successful in 28s
Rust Build / Clippy (push) Successful in 29s
Rust Build / build (push) Successful in 26s
Rust Build / Check (pull_request) Successful in 26s
Rust Build / Test Suite (pull_request) Successful in 27s
Rust Build / Rustfmt (pull_request) Successful in 28s
Rust Build / Clippy (pull_request) Successful in 28s
Rust Build / build (pull_request) Successful in 27s
Reviewed-on: phoenix/icarus-models#11
Co-authored-by: KD <kundeng94@gmail.com>
Co-committed-by: KD <kundeng94@gmail.com>
2025-03-22 18:24:08 +00:00
d0e0d8fa2d Merge pull request 'Renamed branch' (#10) from updated_branch into devel
Some checks failed
Release Tagging / release (push) Successful in 28s
Rust Build / Check (push) Failing after 24s
Rust Build / Test Suite (push) Failing after 25s
Rust Build / Rustfmt (push) Successful in 25s
Rust Build / Clippy (push) Failing after 24s
Rust Build / build (push) Failing after 24s
Reviewed-on: phoenix/icarus-models#10
2025-03-22 01:25:02 +00:00
3f379cf454 Renamed branch
Some checks failed
Rust Build / Check (pull_request) Failing after 28s
Rust Build / Test Suite (pull_request) Failing after 26s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Failing after 26s
Rust Build / build (pull_request) Failing after 25s
2025-03-21 21:21:53 -04:00
64f936bb3c Added workflow (#6)
Some checks failed
Release Tagging / release (push) Successful in 29s
Rust Build / Check (push) Failing after 26s
Rust Build / Test Suite (push) Failing after 29s
Rust Build / Rustfmt (push) Successful in 26s
Rust Build / Clippy (push) Failing after 26s
Rust Build / build (push) Failing after 26s
Reviewed-on: phoenix/icarus-models#6
Co-authored-by: phoenix <kundeng94@gmail.com>
Co-committed-by: phoenix <kundeng94@gmail.com>
2025-03-22 01:12:29 +00:00
929dac6413 Merge pull request 'Enabled tag release' (#9) from enable_release_tagging into main
All checks were successful
Release Tagging / release (push) Successful in 29s
Reviewed-on: phoenix/icarus-models#9
2025-03-22 01:10:45 +00:00
b91d543097 Enabled tag release 2025-03-21 21:10:02 -04:00
9307f80274 Merge pull request 'Addressing variable in steps' (#8) from stamp into main
All checks were successful
Release Tagging / release (push) Successful in 29s
Reviewed-on: phoenix/icarus-models#8
2025-03-22 01:06:39 +00:00
49c732ef1b Addressing variable in steps 2025-03-21 21:05:59 -04:00
5fe0c4ccb4 Merge pull request 'Added tag release workflow' (#7) from stamp into main
All checks were successful
Release Tagging / release (push) Successful in 27s
Reviewed-on: phoenix/icarus-models#7
2025-03-22 01:02:31 +00:00
7d24ce51cf Added tag release workflow 2025-03-21 21:01:31 -04:00
KD
474391ea44 Merge branch 'dev' into 'main'
v0.1.14

See merge request kdeng00/icarus-models!39
2025-03-21 13:13:28 +00:00
KD
abbb37721f Merge branch 'version_bump' into 'dev'
Version bump to v0.1.14

See merge request kdeng00/icarus-models!41
2025-03-21 00:38:08 +00:00
e366202f24 Version bump to v0.1.14 2025-03-20 20:34:59 -04:00
KD
950a70ccad Merge branch 'coverart' into 'dev'
Added coverart struct

See merge request kdeng00/icarus-models!40
2025-03-21 00:18:38 +00:00
KD
7f8649ee38 Added coverart struct 2025-03-21 00:18:38 +00:00
KD
ab3e519f53 Merge branch 'album_model' into 'dev'
Added Album collection

See merge request kdeng00/icarus-models!38
2025-03-19 00:56:18 +00:00
KD
98c518e149 Added Album collection 2025-03-19 00:56:17 +00:00
KD
9d3098de6b Merge branch 'song_changes' into 'dev'
Song changes

See merge request kdeng00/icarus-models!37
2025-03-19 00:45:56 +00:00
KD
04f1ffb1ce Song changes 2025-03-19 00:45:56 +00:00
KD
47f336d04d Merge branch 'warning-fix' into 'dev'
Making some changes to address warnings

See merge request kdeng00/icarus-models!36
2025-03-16 22:25:19 +00:00
e497ce11e0 Making some changes to address warnings
Constants changed
2025-03-16 15:15:31 -04:00
KD
fac33c7987 Merge branch 'dev' into 'main'
Dev

See merge request kdeng00/icarus-models!30
2025-03-15 21:38:00 +00:00
KD
7f5f546f65 Merge branch 'version_bump' into 'dev'
Updated version

See merge request kdeng00/icarus-models!35
2025-03-15 21:30:10 +00:00
KD
05537a4f6d Merge branch 'enhance_song_model' into 'dev'
Added functions

See merge request kdeng00/icarus-models!34
2025-03-15 21:26:54 +00:00
KD
64402a0626 Added functions 2025-03-15 21:26:54 +00:00
a84d59a5f5 Updated version 2025-03-15 17:25:55 -04:00
KD
d1f63a04e4 Merge branch 'enhance_song' into 'dev'
Added functions to song

See merge request kdeng00/icarus-models!33
2025-03-15 02:30:08 +00:00
KD
842fe6302e Added functions to song 2025-03-15 02:30:08 +00:00
KD
b9c0ba0549 Merge branch 'extend_ver_hash' into 'dev'
Extended the hash

See merge request kdeng00/icarus-models!31
2025-03-15 02:01:42 +00:00
bef3a376bd Extended the hash 2025-03-14 21:24:58 -04:00
22 changed files with 1752 additions and 248 deletions

View File

@@ -0,0 +1,57 @@
name: Release Tagging
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
release:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@v5
with:
fetch-depth: 0 # Important for git describe --tags
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
toolchain: 1.90.0
components: cargo
- name: Extract Version from Cargo.toml
id: version
run: |
VERSION=$(grep '^version = "' Cargo.toml | sed -E 's/version = "([^"]+)"/\1/')
PROJECT_COMMIT_HASH=$(git rev-parse HEAD | cut -c 1-10)
BRANCH_REF="${{ gitea.ref }}"
BRANCH_NAME=$(echo "$BRANCH_REF" | cut -d '/' -f 3)
PROJECT_TAG_RELEASE="v$VERSION-$BRANCH_NAME-$PROJECT_COMMIT_HASH-111"
echo "::set-output name=project_tag_release::$PROJECT_TAG_RELEASE"
echo "Version: $VERSION"
echo "Hash: $PROJECT_COMMIT_HASH"
echo "Branh ref: $BRANCH_REF"
echo "Branch: $BRANCH_NAME"
echo "Tag Release: $PROJECT_TAG_RELEASE"
- name: Print version
id: Version
run: |
echo "Printing version"
echo "Version: ${{ steps.version.outputs.project_tag_release }}"
- name: Create GitHub Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.version.outputs.project_tag_release }}
release_name: Release ${{ steps.version.outputs.project_tag_release }}
body: |
Release of version ${{ steps.version.outputs.project_tag_release }}

View File

@@ -0,0 +1,62 @@
name: Rust Build
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
check:
name: Check
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
- run: cargo check
test:
name: Test Suite
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
- run: cargo test
fmt:
name: Rustfmt
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
- run: rustup component add rustfmt
- run: cargo fmt --all -- --check
clippy:
name: Clippy
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
- run: rustup component add clippy
- run: cargo clippy -- -D warnings
build:
name: build
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.90.0
- run: cargo build

View File

@@ -47,7 +47,7 @@ extract_version:
script:
- apk add --no-cache jq
- VERSION=$(grep 'version = "' Cargo.toml | awk -F'"' '{print $2}' | head -n 1)
- VER_HASH=${CI_COMMIT_SHA:0:5}
- VER_HASH=${CI_COMMIT_SHA:0:10}
- VERSION="$VERSION-$VER_HASH"
- if [ $? -ne 0 ]; then echo "Error extracting version"; exit 1; fi
- echo "Extracted version is"

687
Cargo.lock generated Normal file
View File

@@ -0,0 +1,687 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "adler2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "base64"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "bitflags"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
[[package]]
name = "bumpalo"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "cc"
version = "1.2.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2"
dependencies = [
"find-msvc-tools",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "crc32fast"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
dependencies = [
"cfg-if",
]
[[package]]
name = "deranged"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
"powerfmt",
"serde_core",
]
[[package]]
name = "equivalent"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "find-msvc-tools"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
[[package]]
name = "flate2"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "foreign-types"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
dependencies = [
"foreign-types-shared",
]
[[package]]
name = "foreign-types-shared"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "getrandom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"wasip2",
]
[[package]]
name = "hashbrown"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d"
[[package]]
name = "icarus_models"
version = "0.9.2"
dependencies = [
"josekit",
"rand",
"serde",
"serde_json",
"tempfile",
"time",
"utoipa",
"uuid",
]
[[package]]
name = "indexmap"
version = "2.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
dependencies = [
"equivalent",
"hashbrown",
"serde",
"serde_core",
]
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "josekit"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a808e078330e6af222eb0044b71d4b1ff981bfef43e7bc8133a88234e0c86a0c"
dependencies = [
"anyhow",
"base64",
"flate2",
"openssl",
"regex",
"serde",
"serde_json",
"thiserror",
"time",
]
[[package]]
name = "js-sys"
version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]]
name = "libc"
version = "0.2.177"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
[[package]]
name = "linux-raw-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "memchr"
version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
"simd-adler32",
]
[[package]]
name = "num-conv"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "openssl"
version = "0.10.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654"
dependencies = [
"bitflags",
"cfg-if",
"foreign-types",
"libc",
"once_cell",
"openssl-macros",
"openssl-sys",
]
[[package]]
name = "openssl-macros"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "openssl-sys"
version = "0.9.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "pkg-config"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "powerfmt"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy",
]
[[package]]
name = "proc-macro2"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
"getrandom",
]
[[package]]
name = "regex"
version = "1.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rustix"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"windows-sys",
]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.145"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
dependencies = [
"indexmap",
"itoa",
"memchr",
"ryu",
"serde",
"serde_core",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "simd-adler32"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "syn"
version = "2.0.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tempfile"
version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [
"fastrand",
"getrandom",
"once_cell",
"rustix",
"windows-sys",
]
[[package]]
name = "thiserror"
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "time"
version = "0.3.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d"
dependencies = [
"deranged",
"itoa",
"num-conv",
"powerfmt",
"serde",
"time-core",
"time-macros",
]
[[package]]
name = "time-core"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b"
[[package]]
name = "time-macros"
version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3"
dependencies = [
"num-conv",
"time-core",
]
[[package]]
name = "unicode-ident"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
[[package]]
name = "utoipa"
version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993"
dependencies = [
"indexmap",
"serde",
"serde_json",
"utoipa-gen",
]
[[package]]
name = "utoipa-gen"
version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b"
dependencies = [
"proc-macro2",
"quote",
"syn",
"uuid",
]
[[package]]
name = "uuid"
version = "1.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2"
dependencies = [
"getrandom",
"js-sys",
"serde",
"wasm-bindgen",
]
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "wasip2"
version = "1.0.1+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
dependencies = [
"wit-bindgen",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
dependencies = [
"unicode-ident",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "wit-bindgen"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "zerocopy"
version = "0.8.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
dependencies = [
"proc-macro2",
"quote",
"syn",
]

View File

@@ -1,10 +1,19 @@
[package]
name = "icarus-models"
version = "0.1.7"
name = "icarus_models"
version = "0.9.2"
edition = "2024"
rust-version = "1.90"
description = "models used for the icarus project"
license = "MIT"
[dependencies]
serde = { version = "1.0.218", features = ["derive"] }
serde_json = "1.0.139"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = { version = "1.0.145" }
rand = { version = "0.9.2" }
time = { version = "0.3.44", features = ["formatting", "macros", "parsing", "serde"] }
uuid = { version = "1.18.1", features = ["v4", "serde"] }
josekit = { version = "0.10.3" }
utoipa = { version = "5.4.0", features = ["uuid", "time"] }
[dev-dependencies]
tempfile = { version = "3.23.0" }

View File

@@ -0,0 +1,3 @@
A library containing commonly used structs, functions, enums, constants and other code
that is used throughout the icarus projects. Code from this library serves as the model
for other projects in the icarus project.

View File

@@ -2,41 +2,41 @@ use std::default::Default;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, Serialize, utoipa::ToSchema)]
pub struct AccessLevel {
pub id: i32,
pub id: uuid::Uuid,
pub level: String,
pub song_id: i32,
pub song_id: uuid::Uuid,
}
impl Default for AccessLevel {
fn default() -> Self {
AccessLevel {
id: -1,
id: uuid::Uuid::nil(),
level: String::new(),
song_id: -1,
song_id: uuid::Uuid::new_v4(),
}
}
}
pub fn default_level() -> AccessLevel {
return AccessLevel {
id: -1,
AccessLevel {
id: uuid::Uuid::nil(),
level: String::from("Public"),
song_id: -1,
};
song_id: uuid::Uuid::new_v4(),
}
}
pub fn private_level() -> AccessLevel {
return AccessLevel {
id: -1,
AccessLevel {
id: uuid::Uuid::new_v4(),
level: String::from("Private"),
song_id: -1,
};
song_id: uuid::Uuid::new_v4(),
}
}
impl AccessLevel {
pub fn _to_json(&self) -> Result<String, serde_json::Error> {
return serde_json::to_string_pretty(&self);
serde_json::to_string_pretty(&self)
}
}

43
src/album.rs Normal file
View File

@@ -0,0 +1,43 @@
pub mod collection {
use serde::{Deserialize, Serialize};
use std::default::Default;
use std::fs::File;
use std::io::BufReader;
use crate::init;
pub fn parse_album(filepath: &String) -> Result<Album, serde_json::Error> {
let file = File::open(filepath).expect("Failed to open file");
let reader = BufReader::new(file);
serde_json::from_reader(reader)
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Album {
#[serde(skip_serializing_if = "String::is_empty")]
#[serde(alias = "album")]
pub title: String,
#[serde(skip_serializing_if = "String::is_empty")]
#[serde(alias = "album_artist")]
pub artist: String,
pub genre: String,
pub year: i32,
pub track_count: i32,
#[serde(skip_serializing_if = "init::is_set")]
pub disc_count: i32,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tracks: Vec<Track>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Track {
pub title: String,
pub artist: String,
pub disc: i32,
pub track: i32,
// In seconds
pub duration: f64,
}
}

View File

@@ -1,5 +1,20 @@
pub const DEFAULT_MUSIC_EXTENSION: &str = FLAC_EXTENSION;
pub const FLAC_EXTENSION: &str = ".flac";
pub const WAV_EXTENSION: &str = ".wav";
pub const MPTHREE_EXTENSION: &str = ".mp3";
pub const JPG_EXTENSION: &str = ".jpg";
pub mod file_extensions {
pub mod audio {
pub const DEFAULTMUSICEXTENSION: &str = FLACEXTENSION;
pub const FLACEXTENSION: &str = ".flac";
pub const WAVEXTENSION: &str = ".wav";
pub const MPTHREEEXTENSION: &str = ".mp3";
}
pub mod image {
pub const JPGEXTENSION: &str = ".jpg";
pub const JPEGEXTENSION: &str = ".jpeg";
pub const PNGEXTENSION: &str = ".png";
}
}
pub mod error {
pub const DIRECTORY_NOT_INITIALIZED: &str = "Directory has not been initialized";
pub const FILENAME_NOT_INITIALIZED: &str = "Filename has not bee initialized";
pub const LAST_CHARACTER_IN_DIRECTORY: &str = "Could not access last character of directory";
}

162
src/coverart.rs Normal file
View File

@@ -0,0 +1,162 @@
use std::io::Write;
use rand::Rng;
const FILENAME_LENGTH: i32 = 16;
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct CoverArt {
pub id: uuid::Uuid,
pub title: String,
#[serde(skip)]
pub directory: String,
pub filename: String,
pub file_type: String,
#[serde(skip)]
pub data: Vec<u8>,
pub song_id: uuid::Uuid,
}
pub mod init {
/// Initializes the CoverArt with just the directory and filename
pub fn init_coverart_dir_and_filename(directory: &str, filename: &str) -> super::CoverArt {
super::CoverArt {
directory: String::from(directory),
filename: String::from(filename),
..Default::default()
}
}
}
impl CoverArt {
/// Saves the coverart to the filesystem
pub fn save_to_filesystem(&self) -> Result<(), std::io::Error> {
match self.get_path() {
Ok(path) => match std::fs::File::create(&path) {
Ok(mut file) => match file.write_all(&self.data) {
Ok(_) => Ok(()),
Err(err) => Err(err),
},
Err(err) => Err(err),
},
Err(err) => Err(err),
}
}
/// Removes the coverart from the filesystem
pub fn remove_from_filesystem(&self) -> Result<(), std::io::Error> {
match self.get_path() {
Ok(path) => {
let p = std::path::Path::new(&path);
if p.exists() {
match std::fs::remove_file(p) {
Ok(_) => Ok(()),
Err(err) => Err(err),
}
} else {
Err(std::io::Error::other(
"Cannot delete file that does not exist",
))
}
}
Err(err) => Err(err),
}
}
/// Gets the path of the CoverArt
pub fn get_path(&self) -> Result<String, std::io::Error> {
if self.directory.is_empty() {
return Err(std::io::Error::other(
crate::constants::error::DIRECTORY_NOT_INITIALIZED,
));
} else if self.filename.is_empty() {
return Err(std::io::Error::other(
crate::constants::error::FILENAME_NOT_INITIALIZED,
));
}
let directory = &self.directory;
let last_index = directory.len() - 1;
match crate::util::concatenate_path(directory, &self.filename, last_index) {
Ok(path) => Ok(path),
Err(err) => Err(err),
}
}
}
/// Generates filename for a CoverArt
pub fn generate_filename(
typ: crate::types::CoverArtType,
randomize: bool,
) -> Result<String, std::io::Error> {
let file_extension = match typ {
crate::types::CoverArtType::PngExtension => {
String::from(crate::constants::file_extensions::image::PNGEXTENSION)
}
crate::types::CoverArtType::JpegExtension => {
String::from(crate::constants::file_extensions::image::JPEGEXTENSION)
}
crate::types::CoverArtType::JpgExtension => {
String::from(crate::constants::file_extensions::image::JPGEXTENSION)
}
crate::types::CoverArtType::None => {
return Err(std::io::Error::other("Unsupported CoverArtTypes"));
}
};
let filename: String = if randomize {
let mut filename: String = String::from("coverart-");
let some_chars: String = String::from("abcdefghij0123456789");
let some_chars_length = some_chars.len();
let mut rng = rand::rng();
for _ in 0..FILENAME_LENGTH {
let index = rng.random_range(0..=some_chars_length);
let rando_char = some_chars.chars().nth(index);
if let Some(c) = rando_char {
filename.push(c);
}
}
format!("{filename}{file_extension}")
} else {
format!("coverart-output{file_extension}")
};
Ok(filename)
}
pub mod io {
use std::io::Read;
/// Gets the raw data of the cover art
pub fn to_data(coverart: &super::CoverArt) -> Result<Vec<u8>, std::io::Error> {
match coverart.get_path() {
Ok(path) => {
let mut file = std::fs::File::open(path)?;
let mut buffer = Vec::new();
match file.read_to_end(&mut buffer) {
Ok(_) => Ok(buffer),
Err(err) => Err(err),
}
}
Err(err) => Err(err),
}
}
}
#[cfg(test)]
mod tests {
use crate::coverart;
#[test]
fn test_cover_art_image() {
let dir = String::from("./");
let filename = String::from("CoverArt.png");
let coverart = coverart::init::init_coverart_dir_and_filename(&dir, &filename);
assert_eq!(dir, coverart.directory);
assert_eq!(filename, coverart.filename);
}
}

View File

@@ -1,22 +1,32 @@
pub mod access_level;
pub mod album;
pub mod constants;
pub mod coverart;
pub mod login_result;
pub mod song;
pub mod token;
pub mod types;
pub mod user;
pub mod util;
pub fn add(left: u64, right: u64) -> u64 {
left + right
pub mod init {
pub fn is_id_valid(num: &i32) -> bool {
*num > 0
}
#[cfg(test)]
mod tests {
use super::*;
pub fn is_uuid_nil(uuid: &uuid::Uuid) -> bool {
uuid.is_nil()
}
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
pub fn is_zero(num: &i32) -> bool {
*num == 0
}
pub fn is_dur_not_set(num: &i32) -> bool {
*num == 0
}
pub fn is_set(num: &i32) -> bool {
*num >= 0
}
}

View File

@@ -2,30 +2,24 @@ use std::default::Default;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)]
pub struct LoginResult {
pub id: i32,
pub id: uuid::Uuid,
pub username: String,
pub token: String,
#[serde(alias = "token_type")]
pub token_type: String,
pub expiration: i32,
}
impl Default for LoginResult {
fn default() -> Self {
LoginResult {
id: -1,
username: String::new(),
token: String::new(),
token_type: String::new(),
expiration: -1,
}
}
pub expiration: i64,
}
impl LoginResult {
pub fn _to_json(&self) -> Result<String, serde_json::Error> {
return serde_json::to_string_pretty(&self);
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(&self)
}
pub fn token_expired(&self) -> bool {
let current_time = time::OffsetDateTime::now_utc();
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap();
current_time > expired
}
}

View File

@@ -1,13 +1,20 @@
use std::default::Default;
use std::io::Read;
use std::io::Write;
use rand::Rng;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
use crate::constants;
use crate::init;
use crate::types;
/// Length of characters of a filename to be generated
const FILENAME_LENGTH: i32 = 16;
#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)]
pub struct Song {
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_uuid_nil")]
#[serde(alias = "id")]
pub id: i32,
pub id: uuid::Uuid,
#[serde(skip_serializing_if = "String::is_empty")]
pub title: String,
#[serde(skip_serializing_if = "String::is_empty")]
@@ -18,171 +25,195 @@ pub struct Song {
pub album_artist: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub genre: String,
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_zero")]
pub year: i32,
#[serde(skip_serializing_if = "is_dur_not_set")]
#[serde(skip_serializing_if = "init::is_dur_not_set")]
pub duration: i32,
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_zero")]
pub track: i32,
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_zero")]
pub disc: i32,
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_zero")]
pub disc_count: i32,
#[serde(skip_serializing_if = "is_zero")]
#[serde(skip_serializing_if = "init::is_zero")]
pub track_count: i32,
#[serde(skip_serializing_if = "String::is_empty")]
pub audio_type: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub date_created: String,
#[serde(with = "time::serde::rfc3339::option")]
pub date_created: Option<time::OffsetDateTime>,
#[serde(skip_serializing_if = "String::is_empty")]
pub filename: String,
#[serde(skip_serializing_if = "is_zero")]
pub user_id: i32,
#[serde(skip_serializing_if = "init::is_uuid_nil")]
pub user_id: uuid::Uuid,
#[serde(skip)]
pub data: Vec<u8>,
#[serde(skip)]
pub directory: String,
#[serde(skip)]
pub album_id: i32,
#[serde(skip)]
pub artist_id: i32,
#[serde(skip)]
pub genre_id: i32,
#[serde(skip)]
pub coverart_id: i32,
}
fn is_zero(num: &i32) -> bool {
*num == 0
}
fn is_dur_not_set(num: &i32) -> bool {
*num == 0
}
impl Default for Song {
fn default() -> Self {
Song {
id: 0,
title: String::new(),
artist: String::new(),
album: String::new(),
album_artist: String::new(),
genre: String::new(),
year: 0,
duration: 0,
track: 0,
disc: 0,
disc_count: 0,
track_count: 0,
audio_type: String::new(),
date_created: String::new(),
filename: String::new(),
user_id: 0,
data: Vec::new(),
directory: String::new(),
album_id: 0,
artist_id: 0,
genre_id: 0,
coverart_id: 0,
}
}
// TODO: Think about what to do with this
// #[serde(skip)]
// pub album_id: i32,
// #[serde(skip)]
// pub artist_id: i32,
// #[serde(skip)]
// pub genre_id: i32,
// #[serde(skip)]
// pub coverart_id: i32,
}
impl Song {
// TODO: Implement
pub fn to_metadata_json(&self) -> Result<String, serde_json::Error> {
return serde_json::to_string_pretty(&self);
pub fn to_metadata_json(&self, pretty: bool) -> Result<String, serde_json::Error> {
if pretty {
serde_json::to_string_pretty(&self)
} else {
serde_json::to_string(&self)
}
}
mod embedded {
use serde::{Deserialize, Serialize};
// The song's duration is a floating point in seconds
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Song {
#[serde(skip_serializing_if = "is_embed_zero")]
#[serde(alias = "id")]
pub id: i32,
#[serde(skip_serializing_if = "String::is_empty")]
pub title: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub artist: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub album: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub album_artist: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub genre: String,
#[serde(skip_serializing_if = "is_embed_zero")]
pub year: i32,
#[serde(skip_serializing_if = "is_embed_dur_not_set")]
pub duration: f64,
#[serde(skip_serializing_if = "is_embed_zero")]
pub track: i32,
#[serde(skip_serializing_if = "is_embed_zero")]
pub disc: i32,
#[serde(skip_serializing_if = "is_embed_zero")]
pub disc_count: i32,
#[serde(skip_serializing_if = "is_embed_zero")]
pub track_count: i32,
#[serde(skip_serializing_if = "String::is_empty")]
pub audio_type: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub date_created: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub filename: String,
#[serde(skip_serializing_if = "is_embed_zero")]
pub user_id: i32,
#[serde(skip)]
pub data: Vec<u8>,
#[serde(skip)]
pub directory: String,
#[serde(skip)]
pub album_id: i32,
#[serde(skip)]
pub artist_id: i32,
#[serde(skip)]
pub genre_id: i32,
#[serde(skip)]
pub coverart_id: i32,
/// Gets the path of a Song
pub fn song_path(&self) -> Result<String, std::io::Error> {
if self.directory.is_empty() {
return Err(std::io::Error::other(
crate::constants::error::DIRECTORY_NOT_INITIALIZED,
));
} else if self.filename.is_empty() {
return Err(std::io::Error::other(
crate::constants::error::FILENAME_NOT_INITIALIZED,
));
}
fn is_embed_zero(num: &i32) -> bool {
*num == 0
let directory = &self.directory;
let last_index = directory.len() - 1;
match crate::util::concatenate_path(directory, &self.filename, last_index) {
Ok(path) => Ok(path),
Err(err) => Err(err),
}
}
fn is_embed_dur_not_set(num: &f64) -> bool {
*num == 0.0
/// Saves the song to the filesystem using the song's data
pub fn save_to_filesystem(&self) -> Result<(), std::io::Error> {
match self.song_path() {
Ok(song_path) => match std::fs::File::create(&song_path) {
Ok(mut file) => match file.write_all(&self.data) {
Ok(_res) => Ok(()),
Err(err) => Err(err),
},
Err(err) => Err(err),
},
Err(err) => Err(err),
}
}
impl Default for Song {
fn default() -> Self {
Song {
id: 0,
title: String::new(),
artist: String::new(),
album: String::new(),
album_artist: String::new(),
genre: String::new(),
year: 0,
duration: 0.0,
track: 0,
disc: 0,
disc_count: 0,
track_count: 0,
audio_type: String::new(),
date_created: String::new(),
filename: String::new(),
user_id: 0,
data: Vec::new(),
directory: String::new(),
album_id: 0,
artist_id: 0,
genre_id: 0,
coverart_id: 0,
/// Removes the song from the filesystem
pub fn remove_from_filesystem(&self) -> Result<(), std::io::Error> {
match self.song_path() {
Ok(song_path) => {
let p = std::path::Path::new(&song_path);
if p.exists() {
match std::fs::remove_file(p) {
Ok(_) => Ok(()),
Err(err) => Err(err),
}
} else {
Err(std::io::Error::other(
"Cannot delete file that does not exist",
))
}
}
Err(err) => Err(err),
}
}
}
/// Generates a filename. In order to save a song to the filesystem
pub fn generate_filename(typ: types::MusicType, randomize: bool) -> Result<String, std::io::Error> {
let file_extension = match typ {
types::MusicType::DefaultMusicExtension => {
String::from(constants::file_extensions::audio::DEFAULTMUSICEXTENSION)
}
types::MusicType::WavExtension => {
String::from(constants::file_extensions::audio::WAVEXTENSION)
}
types::MusicType::FlacExtension => {
String::from(constants::file_extensions::audio::FLACEXTENSION)
}
types::MusicType::MPThreeExtension => {
String::from(constants::file_extensions::audio::MPTHREEEXTENSION)
}
types::MusicType::None => return Err(std::io::Error::other("Unsupported MusicTypes")),
};
let filename: String = if randomize {
let mut filename: String = String::from("track-");
let some_chars: String = String::from("abcdefghij0123456789");
let some_chars_length = some_chars.len();
let mut rng = rand::rng();
for _ in 0..FILENAME_LENGTH {
let index = rng.random_range(0..=some_chars_length);
let rando_char = some_chars.chars().nth(index);
if let Some(c) = rando_char {
filename.push(c);
}
}
format!("{filename}{file_extension}")
} else {
format!("track-output{file_extension}")
};
Ok(filename)
}
/// I/O operations for songs
pub mod io {
use std::io::Read;
/// Copies a song using the source song's data
pub fn copy_song(
song_source: &super::Song,
song_target: &mut super::Song,
) -> Result<(), std::io::Error> {
match song_target.song_path() {
Ok(songpath) => {
let p = std::path::Path::new(&songpath);
if p.exists() {
Err(std::io::Error::other(
"Cannot copy song over to one that already exists",
))
} else {
if song_target.data.is_empty() {
song_target.data = song_source.data.clone();
} else {
song_target.data.clear();
song_target.data = song_source.data.clone();
}
match song_target.save_to_filesystem() {
Ok(_) => Ok(()),
Err(err) => Err(err),
}
}
}
Err(err) => Err(err),
}
}
/// Gets the raw file data of a song from the filesystem
pub fn to_data(song: &super::Song) -> Result<Vec<u8>, std::io::Error> {
match song.song_path() {
Ok(path) => {
let mut file = std::fs::File::open(path)?;
let mut buffer: Vec<u8> = Vec::new();
file.read_to_end(&mut buffer)?;
if buffer.is_empty() {
Err(std::io::Error::other("File is empty"))
} else {
Ok(buffer)
}
}
Err(er) => Err(er),
}
}
}

View File

@@ -1,20 +1,20 @@
use std::default::Default;
use serde::{Deserialize, Serialize};
use serde::Deserialize;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Default, Deserialize, serde::Serialize)]
pub struct Token {
pub scope: String,
pub expiration: i32,
pub expiration: i64,
pub audience: String,
pub issuer: String,
pub issued: i32,
pub issued: i64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, serde::Serialize)]
pub struct AccessToken {
#[serde(alias = "user_id")]
pub user_id: i32,
#[serde(alias = "init::is_uuid_nil")]
pub user_id: uuid::Uuid,
#[serde(alias = "username")]
pub username: String,
#[serde(alias = "token")]
@@ -22,43 +22,208 @@ pub struct AccessToken {
#[serde(alias = "token_type")]
pub token_type: String,
#[serde(alias = "expiration")]
pub expiration: i32,
pub expiration: i64,
#[serde(alias = "message")]
pub message: String,
}
impl Default for Token {
fn default() -> Self {
Token {
scope: String::new(),
expiration: -1,
audience: String::new(),
issuer: String::new(),
issued: -1,
}
}
#[derive(Clone, Debug, serde::Serialize, Deserialize)]
pub struct UserClaims {
pub iss: String,
pub aud: String, // Audience
pub sub: String, // Subject (user ID)
#[serde(deserialize_with = "deserialize_i64_from_f64")]
pub exp: i64, // Expiration time (UTC timestamp)
#[serde(deserialize_with = "deserialize_i64_from_f64")]
pub iat: i64, // Issued at (UTC timestamp)
// pub azp: String,
// pub gty: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<String>>, // Optional roles
}
impl AccessToken {
/// Get the token fit for Bearer authentication
pub fn bearer_token(&self) -> String {
let mut token: String = String::from("Bearer ");
token += &self.token.clone();
return token;
format!("Bearer {}", self.token)
}
pub fn token_expired(&self) -> bool {
let current_time = time::OffsetDateTime::now_utc();
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap();
current_time > expired
}
}
impl Token {
pub fn _to_json(&self) -> Result<String, serde_json::Error> {
return serde_json::to_string_pretty(&self);
serde_json::to_string_pretty(&self)
}
// TODO: Implement
pub fn token_expired(&self) -> bool {
return false;
let current_time = time::OffsetDateTime::now_utc();
let expired = time::OffsetDateTime::from_unix_timestamp(self.expiration).unwrap();
current_time > expired
}
// TODO: Implement
pub fn contains_scope(&self, des_scope: String) -> bool {
return false;
pub fn contains_scope(&self, des_scope: &String) -> bool {
self.scope.contains(des_scope)
}
}
fn deserialize_i64_from_f64<'de, D>(deserializer: D) -> Result<i64, D::Error>
where
D: serde::Deserializer<'de>,
{
let val = f64::deserialize(deserializer)?;
// Handle NaN and infinity cases
if val.is_nan() || val.is_infinite() {
return Err(serde::de::Error::custom("invalid float value"));
}
// Round to nearest integer and convert
let rounded = val.round();
// Check if the rounded value can fit in i64
if rounded < (i64::MIN as f64) || rounded > (i64::MAX as f64) {
Err(serde::de::Error::custom("float out of i64 range"))
} else {
Ok(rounded as i64)
}
}
pub fn get_issued() -> time::Result<time::OffsetDateTime> {
Ok(time::OffsetDateTime::now_utc())
}
mod util {
pub fn time_to_std_time(
provided_time: &time::OffsetDateTime,
) -> Result<std::time::SystemTime, std::time::SystemTimeError> {
let converted = std::time::SystemTime::from(*provided_time);
Ok(converted)
}
}
#[derive(Debug)]
pub struct TokenResource {
pub message: String,
pub issuer: String,
pub audiences: Vec<String>,
pub id: uuid::Uuid,
}
pub const TOKEN_TYPE: &str = "JWT";
pub fn create_token(
key: &String,
token_resource: &TokenResource,
duration: time::Duration,
) -> Result<(String, i64), josekit::JoseError> {
let mut header = josekit::jws::JwsHeader::new();
header.set_token_type(TOKEN_TYPE);
let mut payload = josekit::jwt::JwtPayload::new();
let message = &token_resource.message;
let issuer = &token_resource.issuer;
let audiences: &Vec<String> = &token_resource.audiences;
payload.set_subject(message);
payload.set_issuer(issuer);
payload.set_audience(audiences.clone());
if !token_resource.id.is_nil() {
match payload.set_claim("id", Some(serde_json::json!(token_resource.id))) {
Ok(_) => {}
Err(err) => {
return Err(err);
}
}
}
match get_issued() {
Ok(issued) => {
let expire = issued + duration;
payload.set_issued_at(&util::time_to_std_time(&issued).unwrap());
payload.set_expires_at(&util::time_to_std_time(&expire).unwrap());
let signer = josekit::jws::alg::hmac::HmacJwsAlgorithm::Hs256
.signer_from_bytes(key.as_bytes())
.unwrap();
Ok((
josekit::jwt::encode_with_signer(&payload, &header, &signer).unwrap(),
(expire - time::OffsetDateTime::UNIX_EPOCH).whole_seconds(),
))
}
Err(e) => Err(josekit::JoseError::InvalidClaim(e.into())),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn test_key() -> String {
String::from("c3092urmc2219ix320i40m293ic29IM09IN0u879Y8B98YB8yb86TN7B55R4yv4RCVU6Bi8YO8U")
}
fn test_resource() -> TokenResource {
TokenResource {
issuer: String::from("icarus_auth_test"),
message: String::from("Authorization"),
audiences: vec![String::from("icarus_test")],
id: uuid::Uuid::nil(),
}
}
#[test]
fn test_token_scope_check() {
let mut token = Token::default();
token.scope = String::from("song:read song:upload song:download");
let check_scope = String::from("song:download");
let result = token.contains_scope(&check_scope);
assert!(
result,
"Error: The scope {:?} was not found in the token's scope {:?}",
check_scope, token.scope
);
}
#[test]
fn test_token_creation() {
let key = test_key();
let test_token_resource = test_resource();
let token_expiration_duration = time::Duration::hours(2);
match create_token(&key, &test_token_resource, token_expiration_duration) {
Ok((token, expire_duration)) => {
assert_eq!(false, token.is_empty(), "Error: Token is empty");
assert!(
expire_duration > 0,
"Token expire duration is invalid {expire_duration:?}"
);
}
Err(err) => {
assert!(false, "Error: {err:?}");
}
}
}
#[test]
fn test_token_creation_with_id() {
let key = test_key();
let mut test_token_resource = test_resource();
test_token_resource.id = uuid::Uuid::new_v4();
let token_expiration_duration = time::Duration::hours(2);
match create_token(&key, &test_token_resource, token_expiration_duration) {
Ok((token, expire_duration)) => {
assert_eq!(false, token.is_empty(), "Error: Token is empty");
assert!(
expire_duration > 0,
"Token expire duration is invalid {expire_duration:?}"
);
}
Err(err) => {
assert!(false, "Error: {err:?}");
}
}
}
}

View File

@@ -1,9 +1,16 @@
use std::default::Default;
#[derive(Debug)]
pub enum MusicType {
DefaultMusicExtension,
WavExtension,
FlacExtension,
MPThreeExtension,
None,
}
mod types {
pub enum Types {
WAV_EXTENSION,
FLAC_EXTENSION,
MP_EXTENSION,
}
#[derive(Debug)]
pub enum CoverArtType {
PngExtension,
JpegExtension,
JpgExtension,
None,
}

View File

@@ -1,11 +1,13 @@
use std::default::Default;
use crate::init;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, Serialize, utoipa::ToSchema)]
pub struct User {
#[serde(skip_serializing_if = "is_id_valid")]
pub id: i32,
#[serde(skip_serializing_if = "init::is_uuid_nil")]
pub id: uuid::Uuid,
#[serde(skip_serializing_if = "String::is_empty")]
pub username: String,
#[serde(skip_serializing_if = "String::is_empty")]
@@ -19,22 +21,20 @@ pub struct User {
#[serde(skip_serializing_if = "String::is_empty")]
pub lastname: String,
pub email_verified: bool,
#[serde(skip_serializing_if = "String::is_empty")]
pub date_created: String,
#[serde(with = "time::serde::rfc3339::option")]
pub date_created: Option<time::OffsetDateTime>,
#[serde(skip_serializing_if = "String::is_empty")]
pub status: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub last_login: String,
}
fn is_id_valid(num: &i32) -> bool {
*num > 0
#[serde(with = "time::serde::rfc3339::option")]
pub last_login: Option<time::OffsetDateTime>,
#[serde(skip_serializing_if = "init::is_uuid_nil")]
pub salt_id: uuid::Uuid,
}
impl Default for User {
fn default() -> Self {
User {
id: -1,
id: uuid::Uuid::new_v4(),
username: String::new(),
password: String::new(),
email: String::new(),
@@ -42,9 +42,10 @@ impl Default for User {
firstname: String::new(),
lastname: String::new(),
email_verified: false,
date_created: String::new(),
date_created: None,
status: String::new(),
last_login: String::new(),
last_login: None,
salt_id: uuid::Uuid::nil(),
}
}
}
@@ -52,9 +53,35 @@ impl Default for User {
impl User {
pub fn to_json(&self, output_pretty: bool) -> Result<String, serde_json::Error> {
if output_pretty {
return serde_json::to_string_pretty(&self);
serde_json::to_string_pretty(&self)
} else {
return serde_json::to_string(&self);
serde_json::to_string(&self)
}
}
}
pub mod salt {
use std::default::Default;
use crate::init;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct Salt {
#[serde(skip_serializing_if = "init::is_uuid_nil")]
pub id: uuid::Uuid,
#[serde(skip_serializing_if = "String::is_empty")]
pub salt: String,
}
impl Salt {
pub fn to_json(&self, output_pretty: bool) -> Result<String, serde_json::Error> {
if output_pretty {
serde_json::to_string_pretty(&self)
} else {
serde_json::to_string(&self)
}
}
}
}

19
src/util/mod.rs Normal file
View File

@@ -0,0 +1,19 @@
pub fn concatenate_path(
directory: &str,
filename: &str,
last_index: usize,
) -> Result<String, std::io::Error> {
if let Some(character) = directory.chars().nth(last_index) {
let buffer: String = if character != '/' {
format!("{directory}/")
} else {
String::from(directory)
};
Ok(format!("{buffer}{filename}"))
} else {
Err(std::io::Error::other(
crate::constants::error::LAST_CHARACTER_IN_DIRECTORY,
))
}
}

31
tests/album.json Normal file
View File

@@ -0,0 +1,31 @@
{
"album": "Sample Tracks! Yes",
"album_artist": "KD",
"genre": "Country",
"year": 2025,
"track_count": 3,
"disc_count": 1,
"tracks": [
{
"title": "E less",
"artist": "KD",
"disc": 1,
"track": 1,
"duration": 31
},
{
"title": "Aaaaaye",
"artist": "KD",
"disc": 1,
"track": 2,
"duration": 33
},
{
"title": "Check D out",
"artist": "KD",
"disc": 1,
"track": 3,
"duration": 22
}
]
}

182
tests/tests.rs Normal file
View File

@@ -0,0 +1,182 @@
mod utils {
use std::fs;
use std::io::Read;
use std::path::Path;
pub fn get_tests_directory() -> String {
String::from(env!("CARGO_MANIFEST_DIR").to_owned() + "/tests/")
}
pub fn does_directory_exists(directory: &String) -> bool {
let path = Path::new(directory);
if let Ok(dir_i) = fs::metadata(path) {
dir_i.is_dir()
} else {
false
}
}
pub fn extract_data_from_file(filepath: &String) -> Result<Vec<u8>, std::io::Error> {
match std::fs::File::open(filepath) {
Ok(mut file) => {
let mut buffer: Vec<u8> = Vec::new();
let _ = file.read_to_end(&mut buffer);
Ok(buffer)
}
Err(err) => Err(err),
}
}
}
#[cfg(test)]
mod song_tests {
use tempfile::tempdir;
use crate::utils;
use icarus_models::song;
use icarus_models::types;
#[test]
fn test_song_to_data() {
println!("Test");
let some_val = true;
println!("Checking if some_val is true");
assert_eq!(true, some_val);
println!("Getting track");
let mut song = song::Song::default();
song.directory = utils::get_tests_directory();
song.filename = String::from("track01.flac");
assert!(
utils::does_directory_exists(&song.directory),
"Directory does not exist"
);
println!("Directory: {}", song.directory);
match song.song_path() {
Ok(filepath) => match utils::extract_data_from_file(&filepath) {
Ok(buffer) => {
assert_eq!(buffer.is_empty(), false);
match song::io::to_data(&song) {
Ok(song_data) => {
println!("Both files match");
assert_eq!(buffer, song_data);
}
Err(err) => {
assert!(false, "Error producing song data: {:?}", err);
}
};
}
Err(err) => {
assert!(false, "Failed to open file: {:?}", err);
}
},
Err(err) => {
assert!(false, "Could not get song path: {:?}", err);
}
}
}
#[test]
fn test_song_path_check() {
let mut song = song::Song::default();
song.directory = utils::get_tests_directory();
song.filename = String::from("track01.flac");
assert!(
utils::does_directory_exists(&song.directory),
"Directory does not exist"
);
}
#[test]
fn test_song_generate_filename() {
let mut song = song::Song::default();
song.directory = utils::get_tests_directory();
song.filename = String::from("track01.flac");
let mut song_cpy = song.clone();
let temp_dir = tempdir().expect("Failed to create temp dir");
song_cpy.directory = match temp_dir.path().to_str() {
Some(s) => String::from(s),
None => String::new(),
};
assert_eq!(song.directory.is_empty(), false);
match song::generate_filename(types::MusicType::FlacExtension, true) {
Ok(filename) => {
song_cpy.filename = filename;
}
Err(err) => {
assert!(false, "Error generatig filename: {err:?}");
}
};
println!("Directory: {:?}", song_cpy.directory);
println!("File to be created: {:?}", song_cpy.filename);
match song::io::copy_song(&song, &mut song_cpy) {
Ok(_) => {
println!("Song copied");
}
Err(err) => {
assert!(false, "Error copying song: Error: {err:?}")
}
}
}
#[test]
fn test_save_song_to_filesystem_and_remove() {
let mut song = song::Song::default();
song.directory = utils::get_tests_directory();
song.filename = String::from("track02.flac");
let mut copied_song = song::Song {
directory: utils::get_tests_directory(),
filename: String::from("track02-coppied.flac"),
..Default::default()
};
match song::io::copy_song(&song, &mut copied_song) {
Ok(_) => match copied_song.remove_from_filesystem() {
Ok(_) => {}
Err(err) => {
assert!(false, "Error: {err:?}")
}
},
Err(err) => {
assert!(false, "Error: {err:?}")
}
}
}
}
#[cfg(test)]
mod album_tests {
use crate::utils;
use icarus_models::album;
#[test]
fn parse_album() {
let test_dir = utils::get_tests_directory();
if utils::does_directory_exists(&test_dir) {
let album_file: String = test_dir + &String::from("album.json");
println!("Album file: {:?}", album_file);
match album::collection::parse_album(&album_file) {
Ok(album) => {
println!("Album title: {}", album.title);
assert_eq!(album.title.is_empty(), false);
assert_eq!(album.artist.is_empty(), false);
assert_eq!(album.tracks.is_empty(), false);
}
Err(err) => {
assert!(false, "Error parsing album json file: {:?}", err);
}
}
}
}
}

BIN
tests/track01.flac Normal file

Binary file not shown.

BIN
tests/track02.flac Normal file

Binary file not shown.

BIN
tests/track03.flac Normal file

Binary file not shown.