122 lines
3.4 KiB
Protocol Buffer
122 lines
3.4 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package archive_control.v1;
|
|
|
|
import "google/protobuf/timestamp.proto";
|
|
|
|
// ResourceId models BitTorrent v1, v2, and hybrid torrent identity. Hex values
|
|
// are lowercase and have exact SHA-1/SHA-256 lengths. At least one is required.
|
|
message ResourceId {
|
|
string info_hash_v1_hex = 1;
|
|
string info_hash_v2_hex = 2;
|
|
}
|
|
|
|
// FileIndexRange is inclusive at both ends. Ranges in a SelectionSet must be
|
|
// sorted, non-overlapping, and coalesced.
|
|
message FileIndexRange {
|
|
uint32 first = 1;
|
|
uint32 last = 2;
|
|
}
|
|
|
|
message SelectionSet {
|
|
repeated FileIndexRange ranges = 1;
|
|
}
|
|
|
|
enum TorrentRuntimeState {
|
|
TORRENT_RUNTIME_STATE_UNSPECIFIED = 0;
|
|
TORRENT_RUNTIME_STATE_STOPPED = 1;
|
|
TORRENT_RUNTIME_STATE_QUEUED = 2;
|
|
TORRENT_RUNTIME_STATE_CHECKING = 3;
|
|
TORRENT_RUNTIME_STATE_DOWNLOADING = 4;
|
|
TORRENT_RUNTIME_STATE_SEEDING = 5;
|
|
TORRENT_RUNTIME_STATE_STALLED = 6;
|
|
TORRENT_RUNTIME_STATE_ERROR = 7;
|
|
TORRENT_RUNTIME_STATE_MISSING = 8;
|
|
}
|
|
|
|
enum ContentEntryType {
|
|
CONTENT_ENTRY_TYPE_UNSPECIFIED = 0;
|
|
CONTENT_ENTRY_TYPE_FILE = 1;
|
|
CONTENT_ENTRY_TYPE_DIRECTORY = 2;
|
|
CONTENT_ENTRY_TYPE_PADDING_FILE = 3;
|
|
}
|
|
|
|
message TorrentFile {
|
|
uint32 file_index = 1;
|
|
string canonical_path = 2;
|
|
uint64 logical_bytes = 3;
|
|
uint64 allocated_bytes = 4;
|
|
uint64 completed_bytes = 5;
|
|
bool selected = 6;
|
|
bool sparse = 7;
|
|
bool padding = 8;
|
|
}
|
|
|
|
// ContentTreeEntry is a flat tree record. Directory selections are expanded by
|
|
// the source into available_file_indices before a job is created.
|
|
message ContentTreeEntry {
|
|
string canonical_path = 1;
|
|
string parent_path = 2;
|
|
string display_name = 3;
|
|
ContentEntryType type = 4;
|
|
optional uint32 file_index = 5;
|
|
SelectionSet available_file_indices = 6;
|
|
uint64 available_logical_bytes = 7;
|
|
uint32 available_file_count = 8;
|
|
// Present for FILE and PADDING_FILE entries. The duplicated canonical_path
|
|
// must match this tree entry; receivers reject inconsistent records.
|
|
TorrentFile file = 9;
|
|
}
|
|
|
|
message ResourceSummary {
|
|
ResourceId resource_id = 1;
|
|
// qb_torrent_id is meaningful only to the reporting qBittorrent instance.
|
|
string qb_torrent_id = 2;
|
|
string display_name = 3;
|
|
TorrentRuntimeState runtime_state = 4;
|
|
SelectionSet selected_files = 5;
|
|
SelectionSet selected_complete_files = 6;
|
|
uint64 selected_logical_bytes = 7;
|
|
uint64 selected_complete_bytes = 8;
|
|
uint64 total_logical_bytes = 9;
|
|
uint32 total_file_count = 10;
|
|
string content_revision = 11;
|
|
bool canonical_paths = 12;
|
|
google.protobuf.Timestamp observed_at = 13;
|
|
}
|
|
|
|
// ResourceStateFingerprint is an optimistic concurrency token for active jobs.
|
|
message ResourceStateFingerprint {
|
|
ResourceId resource_id = 1;
|
|
string client_id = 2;
|
|
string qb_torrent_id = 3;
|
|
string content_revision = 4;
|
|
SelectionSet selected_files = 5;
|
|
SelectionSet selected_complete_files = 6;
|
|
TorrentRuntimeState runtime_state = 7;
|
|
string save_path_fingerprint = 8;
|
|
google.protobuf.Timestamp observed_at = 9;
|
|
}
|
|
|
|
enum PlacementState {
|
|
PLACEMENT_STATE_UNSPECIFIED = 0;
|
|
PLACEMENT_STATE_PRESENT = 1;
|
|
PLACEMENT_STATE_MERGING = 2;
|
|
PLACEMENT_STATE_EVICTING = 3;
|
|
PLACEMENT_STATE_ABSENT = 4;
|
|
PLACEMENT_STATE_ERROR = 5;
|
|
PLACEMENT_STATE_UNKNOWN = 6;
|
|
}
|
|
|
|
message Placement {
|
|
ResourceId resource_id = 1;
|
|
string client_id = 2;
|
|
PlacementState state = 3;
|
|
SelectionSet verified_files = 4;
|
|
uint64 verified_logical_bytes = 5;
|
|
uint64 generation = 6;
|
|
ResourceStateFingerprint fingerprint = 7;
|
|
google.protobuf.Timestamp verified_at = 8;
|
|
string created_by_job_id = 9;
|
|
}
|