Limit active pieces and expose file list
This commit is contained in:
parent
ff8e0f5f5b
commit
6dc711cf57
6 changed files with 117 additions and 3 deletions
|
|
@ -278,6 +278,25 @@ static json_t *torrent_json(torrent_task *task) {
|
|||
}
|
||||
json_object_set_new(result, "trackers", trackers);
|
||||
}
|
||||
json_t *files = json_array();
|
||||
if (files) {
|
||||
uint32_t file_count = task->stats.file_count;
|
||||
if (file_count > NAUT_SWARM_MAX_FILE_STATS)
|
||||
file_count = NAUT_SWARM_MAX_FILE_STATS;
|
||||
for (uint32_t i = 0; i < file_count; i++) {
|
||||
const naut_swarm_file_stats *file =
|
||||
&task->stats.file_stats[i];
|
||||
json_t *item = json_pack(
|
||||
"{s:s,s:I,s:f,s:i,s:f}",
|
||||
"name", file->path,
|
||||
"size", (json_int_t)file->size,
|
||||
"progress", file->progress,
|
||||
"priority", file->priority,
|
||||
"availability", file->availability);
|
||||
if (item) json_array_append_new(files, item);
|
||||
}
|
||||
json_object_set_new(result, "files", files);
|
||||
}
|
||||
json_object_set_new(result, "elapsed_seconds",
|
||||
json_real(task->stats.elapsed_seconds));
|
||||
json_object_set_new(result, "pending_moves",
|
||||
|
|
|
|||
|
|
@ -285,6 +285,51 @@ static void snapshot_tracker_stats(naut_swarm_stats *stats,
|
|||
stats->tracker_stats[i] = trackers[i];
|
||||
}
|
||||
|
||||
static void snapshot_file_stats(naut_swarm_stats *stats,
|
||||
const naut_download *download,
|
||||
const naut_metainfo *metainfo) {
|
||||
if (!stats || !metainfo || !metainfo->files) return;
|
||||
uint64_t offset = 0;
|
||||
uint32_t count = 0;
|
||||
for (size_t i = 0;
|
||||
i < metainfo->num_files && count < NAUT_SWARM_MAX_FILE_STATS;
|
||||
i++) {
|
||||
const naut_file *file = &metainfo->files[i];
|
||||
uint64_t size = file->length > 0 ? (uint64_t)file->length : 0;
|
||||
uint64_t done = 0;
|
||||
if (download && size > 0) {
|
||||
uint64_t start = offset;
|
||||
uint64_t end = offset + size;
|
||||
uint32_t first = (uint32_t)(start / (uint64_t)metainfo->piece_length);
|
||||
uint32_t last = (uint32_t)((end - 1) /
|
||||
(uint64_t)metainfo->piece_length);
|
||||
for (uint32_t p = first; p <= last; p++) {
|
||||
if (!naut_download_have(download, p)) continue;
|
||||
uint64_t piece_start = (uint64_t)p *
|
||||
(uint64_t)metainfo->piece_length;
|
||||
uint64_t piece_end = piece_start +
|
||||
(uint64_t)metainfo->piece_length;
|
||||
if (piece_end > (uint64_t)metainfo->total_length)
|
||||
piece_end = (uint64_t)metainfo->total_length;
|
||||
uint64_t lo = piece_start > start ? piece_start : start;
|
||||
uint64_t hi = piece_end < end ? piece_end : end;
|
||||
if (hi > lo) done += hi - lo;
|
||||
}
|
||||
}
|
||||
naut_swarm_file_stats *out = &stats->file_stats[count++];
|
||||
memset(out, 0, sizeof(*out));
|
||||
snprintf(out->path, sizeof out->path, "%s",
|
||||
file->path ? file->path : "");
|
||||
out->size = size;
|
||||
out->progress = size ? (double)done / (double)size : 1.0;
|
||||
if (out->progress > 1.0) out->progress = 1.0;
|
||||
out->priority = 1;
|
||||
out->availability = 1.0;
|
||||
offset += size;
|
||||
}
|
||||
stats->file_count = count;
|
||||
}
|
||||
|
||||
static void report_progress(const naut_swarm_config *config,
|
||||
const naut_download *download,
|
||||
const naut_metainfo *metainfo,
|
||||
|
|
@ -308,6 +353,7 @@ static void report_progress(const naut_swarm_config *config,
|
|||
};
|
||||
snapshot_peer_stats(&stats, peers, npeers, metainfo->num_pieces);
|
||||
snapshot_tracker_stats(&stats, trackers, tracker_count);
|
||||
snapshot_file_stats(&stats, download, metainfo);
|
||||
if (download) {
|
||||
stats.piece_state_count = (uint32_t)naut_download_piece_states(
|
||||
download, stats.piece_states, NAUT_SWARM_MAX_PIECE_STATS);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue