Merge pull request #162 from izderadicka/add_content_type_to_stream
Add content type to streams
This commit is contained in:
commit
c86e663f24
6 changed files with 61 additions and 7 deletions
|
|
@ -74,6 +74,7 @@ rlimit = "0.10.1"
|
|||
async-stream = "0.3.5"
|
||||
memmap2 = { version = "0.9.4" }
|
||||
lru = { version = "0.12.3", optional = true }
|
||||
mime_guess = { version = "2.0.5", default-features = false}
|
||||
|
||||
[dev-dependencies]
|
||||
futures = { version = "0.3" }
|
||||
|
|
|
|||
|
|
@ -78,6 +78,12 @@ impl Api {
|
|||
make_torrent_details(&info_hash, &handle.info().info, only_files.as_deref())
|
||||
}
|
||||
|
||||
pub fn torrent_file_mime_type(&self, idx: TorrentId, file_idx: usize) -> Result<&'static str> {
|
||||
let handle = self.mgr_handle(idx)?;
|
||||
let info = &handle.info().info;
|
||||
torrent_file_mime_type(info, file_idx)
|
||||
}
|
||||
|
||||
pub fn api_peer_stats(
|
||||
&self,
|
||||
idx: TorrentId,
|
||||
|
|
@ -320,3 +326,23 @@ fn make_torrent_details(
|
|||
files,
|
||||
})
|
||||
}
|
||||
|
||||
fn torrent_file_mime_type(
|
||||
info: &TorrentMetaV1Info<ByteBufOwned>,
|
||||
file_idx: usize,
|
||||
) -> Result<&'static str> {
|
||||
info.iter_filenames_and_lengths()?
|
||||
.nth(file_idx)
|
||||
.and_then(|(f, _)| {
|
||||
f.iter_components()
|
||||
.last()
|
||||
.and_then(|r| r.ok())
|
||||
.and_then(|s| mime_guess::from_path(s).first_raw())
|
||||
})
|
||||
.ok_or_else(|| {
|
||||
ApiError::new_from_text(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"cannot determine mime type for file",
|
||||
)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -167,6 +167,13 @@ impl HttpApi {
|
|||
let mut output_headers = HeaderMap::new();
|
||||
output_headers.insert("Accept-Ranges", HeaderValue::from_static("bytes"));
|
||||
|
||||
if let Ok(mime) = state.torrent_file_mime_type(idx, file_id) {
|
||||
output_headers.insert(
|
||||
http::header::CONTENT_TYPE,
|
||||
HeaderValue::from_str(mime).context("bug - invalid MIME")?,
|
||||
);
|
||||
}
|
||||
|
||||
let range_header = headers.get(http::header::RANGE);
|
||||
trace!(torrent_id=idx, file_id=file_id, range=?range_header, "request for HTTP stream");
|
||||
|
||||
|
|
@ -199,12 +206,12 @@ impl HttpApi {
|
|||
))
|
||||
.context("bug")?,
|
||||
);
|
||||
} else {
|
||||
output_headers.insert(
|
||||
http::header::CONTENT_LENGTH,
|
||||
HeaderValue::from_str(&format!("{}", stream.len())).context("bug")?,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
output_headers.insert(
|
||||
http::header::CONTENT_LENGTH,
|
||||
HeaderValue::from_str(&format!("{}", stream.len())).context("bug")?,
|
||||
);
|
||||
}
|
||||
|
||||
let s = tokio_util::io::ReaderStream::new(stream);
|
||||
|
|
|
|||
|
|
@ -158,8 +158,7 @@ const FileTreeComponent: React.FC<{
|
|||
const fileLink = (file: TorrentFileForCheckbox) => {
|
||||
if (
|
||||
allowStream &&
|
||||
torrentId != null &&
|
||||
/\.(mp4|mkv|avi)$/.test(file.filename)
|
||||
torrentId != null
|
||||
) {
|
||||
return API.getTorrentStreamUrl(torrentId, file.id, file.filename);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ export const FormCheckbox: React.FC<{
|
|||
{labelLink ? (
|
||||
<a
|
||||
href={labelLink}
|
||||
target="_blank"
|
||||
className="text-blue-600 dark:text-blue-500 hover:underline"
|
||||
>
|
||||
{label}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue