diff --git a/Cargo.lock b/Cargo.lock
index 0b6e7db..0634ffe 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -71,9 +71,9 @@ dependencies = [
 
 [[package]]
 name = "async-trait"
-version = "0.1.86"
+version = "0.1.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
+checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -146,8 +146,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
 [[package]]
 name = "based"
 version = "0.1.0"
-source = "git+https://git.hydrar.de/jmarya/based#4688968a32a6812d4751a013ad1b605232fe12f8"
+source = "git+https://git.hydrar.de/jmarya/based#c2380f4e03c024c9e896dcfb6343856f942ad69c"
 dependencies = [
+ "async-stream",
  "bcrypt 0.16.0",
  "chrono",
  "dashmap",
@@ -246,9 +247,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
 
 [[package]]
 name = "bytemuck"
-version = "1.21.0"
+version = "1.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
+checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
 
 [[package]]
 name = "byteorder"
@@ -958,9 +959,9 @@ dependencies = [
 
 [[package]]
 name = "httparse"
-version = "1.10.0"
+version = "1.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
 
 [[package]]
 name = "httpdate"
@@ -1218,9 +1219,9 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.14"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
 
 [[package]]
 name = "js-sys"
@@ -1655,9 +1656,9 @@ dependencies = [
 
 [[package]]
 name = "pkg-config"
-version = "0.3.31"
+version = "0.3.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
 
 [[package]]
 name = "powerfmt"
@@ -1699,9 +1700,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.93"
+version = "1.0.94"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
+checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
 dependencies = [
  "unicode-ident",
 ]
@@ -1721,9 +1722,9 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.38"
+version = "1.0.39"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
+checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801"
 dependencies = [
  "proc-macro2",
 ]
@@ -1780,27 +1781,27 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.5.9"
+version = "0.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f"
+checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
 dependencies = [
  "bitflags 2.9.0",
 ]
 
 [[package]]
 name = "ref-cast"
-version = "1.0.23"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931"
+checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf"
 dependencies = [
  "ref-cast-impl",
 ]
 
 [[package]]
 name = "ref-cast-impl"
-version = "1.0.23"
+version = "1.0.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6"
+checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2055,15 +2056,15 @@ dependencies = [
 
 [[package]]
 name = "rustversion"
-version = "1.0.19"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
 
 [[package]]
 name = "ryu"
-version = "1.0.19"
+version = "1.0.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
 
 [[package]]
 name = "same-file"
@@ -2140,9 +2141,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.139"
+version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
+checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
 dependencies = [
  "itoa",
  "memchr",
@@ -2519,9 +2520,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
 
 [[package]]
 name = "syn"
-version = "2.0.98"
+version = "2.0.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
+checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2611,18 +2612,18 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "2.0.11"
+version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
+checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "2.0.11"
+version = "2.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
+checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2682,9 +2683,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.8.1"
+version = "1.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8"
+checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -2915,9 +2916,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.17"
+version = "1.0.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
 
 [[package]]
 name = "unicode-normalization"
diff --git a/src/library/track.rs b/src/library/track.rs
index 85f4296..675d26d 100644
--- a/src/library/track.rs
+++ b/src/library/track.rs
@@ -222,7 +222,7 @@ impl Track {
     ///
     /// # Returns
     ///
-    /// A `String` representing the path to the transceded audio file, or `None` if the transcoding failed.
+    /// A `String` representing the path to the transcoded audio file, or `None` if the transcoding failed.
     pub fn get_opus(&self, bitrate: u32) -> Option<String> {
         self.transcode("libopus", bitrate, "opus")
     }
diff --git a/src/route/album.rs b/src/route/album.rs
index 9f6ca24..802648a 100644
--- a/src/route/album.rs
+++ b/src/route/album.rs
@@ -40,23 +40,15 @@ pub async fn album_cover_route(
     lib: &State<Libary>,
     cache: &State<RouteCache>,
 ) -> Option<DataResponse> {
-    let mut buf = Vec::new();
-    tokio::fs::File::open(
-        cache
-            .get_option("album_cover_route", album_id, || async {
-                let album = lib.get_album_by_id(&to_uuid(album_id).unwrap()).await?;
-                album.get_cover().await
-            })
-            .await?,
-    )
-    .await
-    .ok()?
-    .read(&mut buf)
-    .await
-    .ok()?;
+    let path = cache
+        .get_option("album_cover_route", album_id, || async {
+            let album = lib.get_album_by_id(&to_uuid(album_id).unwrap()).await?;
+            album.get_cover().await
+        })
+        .await?;
 
-    Some(DataResponse::new(
-        buf,
+    Some(DataResponse::new_file(
+        &path,
         "image/png".to_string(),
         Some(60 * 60 * 24 * 5),
     ))
diff --git a/src/route/artist.rs b/src/route/artist.rs
index ccde805..8a0041c 100644
--- a/src/route/artist.rs
+++ b/src/route/artist.rs
@@ -22,16 +22,8 @@ pub async fn artist_image_route(id: &str, cache: &State<RouteCache>) -> Option<D
         })
         .await?;
 
-    let mut buf = Vec::new();
-    tokio::fs::File::open(image)
-        .await
-        .ok()?
-        .read(&mut buf)
-        .await
-        .ok()?;
-
-    Some(DataResponse::new(
-        buf,
+    Some(DataResponse::new_file(
+        &image,
         "image/png".to_string(),
         Some(60 * 60 * 24 * 5),
     ))
diff --git a/src/route/track.rs b/src/route/track.rs
index 4cc20e6..afa2fb5 100644
--- a/src/route/track.rs
+++ b/src/route/track.rs
@@ -43,16 +43,8 @@ pub async fn track_reload_meta_route(
 pub async fn track_audio_route(track_id: &str, lib: &State<Libary>) -> Option<DataResponse> {
     let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?;
 
-    let mut buf = Vec::new();
-    tokio::fs::File::open(track.path)
-        .await
-        .ok()?
-        .read(&mut buf)
-        .await
-        .ok()?;
-
-    Some(DataResponse::new(
-        buf,
+    Some(DataResponse::new_file(
+        &track.path,
         "audio/ogg".to_string(),
         Some(60 * 60 * 24 * 5),
     ))
@@ -65,16 +57,10 @@ pub async fn track_audio_opus128_route(
 ) -> Option<DataResponse> {
     let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?;
 
-    let mut buf = Vec::new();
-    tokio::fs::File::open(track.get_opus(128)?)
-        .await
-        .ok()?
-        .read(&mut buf)
-        .await
-        .ok()?;
+    let path = track.get_opus(128)?;
 
-    Some(DataResponse::new(
-        buf,
+    Some(DataResponse::new_file(
+        &path,
         "audio/opus".to_string(),
         Some(60 * 60 * 24 * 5),
     ))
@@ -84,16 +70,10 @@ pub async fn track_audio_opus128_route(
 pub async fn track_audio_aac128_route(track_id: &str, lib: &State<Libary>) -> Option<DataResponse> {
     let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?;
 
-    let mut buf = Vec::new();
-    tokio::fs::File::open(track.get_aac(128)?)
-        .await
-        .ok()?
-        .read(&mut buf)
-        .await
-        .ok()?;
+    let path = track.get_aac(128)?;
 
-    Some(DataResponse::new(
-        buf,
+    Some(DataResponse::new_file(
+        &path,
         "audio/aac".to_string(),
         Some(60 * 60 * 24 * 5),
     ))