diff --git a/crates/librqbit/src/api.rs b/crates/librqbit/src/api.rs index aea4aba7b..230274cae 100644 --- a/crates/librqbit/src/api.rs +++ b/crates/librqbit/src/api.rs @@ -4,7 +4,7 @@ use anyhow::Context; use buffers::ByteBufOwned; use dht::{DhtStats, Id20}; use http::StatusCode; -use librqbit_core::torrent_metainfo::TorrentMetaV1Info; +use librqbit_core::torrent_metainfo::{FileDetailsAttrs, TorrentMetaV1Info}; use serde::{Deserialize, Serialize}; use tokio::sync::mpsc::UnboundedSender; use tracing::warn; @@ -498,6 +498,7 @@ pub struct TorrentDetailsResponseFile { pub components: Vec, pub length: u64, pub included: bool, + pub attributes: FileDetailsAttrs, } #[derive(Default, Serialize)] @@ -551,6 +552,7 @@ fn make_torrent_details( components, length: d.len, included, + attributes: d.attrs(), } }) .collect(); diff --git a/crates/librqbit/src/storage/filesystem/fs.rs b/crates/librqbit/src/storage/filesystem/fs.rs index 791e01e1b..2f2cc14c2 100644 --- a/crates/librqbit/src/storage/filesystem/fs.rs +++ b/crates/librqbit/src/storage/filesystem/fs.rs @@ -156,21 +156,19 @@ impl TorrentStorage for FilesystemStorage { let relative_path = &file_details.relative_filename; full_path.push(relative_path); + if file_details.attrs.padding { + files.push(OpenedFile::new_dummy()); + continue; + }; std::fs::create_dir_all(full_path.parent().context("bug: no parent")?)?; - let file = if file_details.attrs.padding { - OpenedFile::new_dummy() - } else if meta.options.allow_overwrite { - OpenedFile::new( - OpenOptions::new() - .create(true) - .truncate(false) - .read(true) - .write(true) - .open(&full_path) - .with_context(|| { - format!("error opening {full_path:?} in read/write mode") - })?, - ) + let f = if meta.options.allow_overwrite { + OpenOptions::new() + .create(true) + .truncate(false) + .read(true) + .write(true) + .open(&full_path) + .with_context(|| format!("error opening {full_path:?} in read/write mode"))? } else { // create_new does not seem to work with read(true), so calling this twice. OpenOptions::new() @@ -183,9 +181,9 @@ impl TorrentStorage for FilesystemStorage { &full_path ) })?; - OpenedFile::new(OpenOptions::new().read(true).write(true).open(&full_path)?) + OpenOptions::new().read(true).write(true).open(&full_path)? }; - files.push(file); + files.push(OpenedFile::new(f)); } self.opened_files = files; diff --git a/crates/librqbit/webui/src/api-types.ts b/crates/librqbit/webui/src/api-types.ts index c62197aa0..58436e7f9 100644 --- a/crates/librqbit/webui/src/api-types.ts +++ b/crates/librqbit/webui/src/api-types.ts @@ -9,6 +9,14 @@ export interface TorrentFile { components: string[]; length: number; included: boolean; + attributes: TorrentFileAttributes; +} + +export interface TorrentFileAttributes { + symlink: boolean; + hidden: boolean; + padding: boolean; + executable: boolean; } // Interface for the Torrent Details API response diff --git a/crates/librqbit/webui/src/components/FileListInput.tsx b/crates/librqbit/webui/src/components/FileListInput.tsx index 323ba1c05..ba3c9dcfc 100644 --- a/crates/librqbit/webui/src/components/FileListInput.tsx +++ b/crates/librqbit/webui/src/components/FileListInput.tsx @@ -73,15 +73,20 @@ const newFileTree = ( return newFileTreeInner( "", "filetree-root", - torrentDetails.files.map((file, id) => { - return { - id, - filename: file.components[file.components.length - 1], - pathComponents: file.components, - length: file.length, - have_bytes: stats ? stats.file_progress[id] ?? 0 : 0, - }; - }), + torrentDetails.files + .map((file, id) => { + if (file.attributes.padding) { + return null; + } + return { + id, + filename: file.components[file.components.length - 1], + pathComponents: file.components, + length: file.length, + have_bytes: stats ? (stats.file_progress[id] ?? 0) : 0, + }; + }) + .filter((f) => f !== null), 0, ); }; @@ -156,10 +161,7 @@ const FileTreeComponent: React.FC<{ }; const fileLink = (file: TorrentFileForCheckbox) => { - if ( - allowStream && - torrentId != null - ) { + if (allowStream && torrentId != null) { return API.getTorrentStreamUrl(torrentId, file.id, file.filename); } }; diff --git a/crates/librqbit_core/src/torrent_metainfo.rs b/crates/librqbit_core/src/torrent_metainfo.rs index 89aa18502..2a22a90fe 100644 --- a/crates/librqbit_core/src/torrent_metainfo.rs +++ b/crates/librqbit_core/src/torrent_metainfo.rs @@ -185,7 +185,7 @@ where } } -#[derive(Default, Debug, Clone, Copy)] +#[derive(Serialize, Deserialize, Default, Debug, Clone, Copy)] pub struct FileDetailsAttrs { pub symlink: bool, pub hidden: bool,