odl 1.1.0

flexible download library and CLI intended to be fast, reliable, and easy to use.
Documentation
syntax = "proto3";

package odl.download_metadata;

// what we want to do is to know how many parts initially were aiming for
// in case user increases the connection count compared to the initial settings,
// we need to increase the parts as well,
// but if user decreases the connection count, we need to keep the parts count the same
// we will just finish downloading each part and then concatenate them at the end

message DownloadMetadata {
  string url = 1;
  string filename = 2;
  string save_dir = 3;
  bool is_resumable = 4;
  bool use_server_time = 5;
  optional int64 last_modified = 6;
  optional string last_etag = 7;
  // final size reported by server
  optional uint64 size = 8;
  // file checksums provided by server
  repeated FileChecksum checksums = 9;
  bool requires_auth = 10;
  bool requires_basic_auth = 11;
  map<string, string> headers = 12;
  uint64 max_connections = 13;
  map<string, PartDetails> parts = 14; // ulid -> PartDetails
  bool finished = 15;
}

message PartDetails {
  uint64 offset = 1;
  uint64 size = 2;
  string ulid = 3; // file name = `ulid` + `'.part'`
  bool finished = 4; // important for failure detection (Unexpected crashes, power loss, etc.)
}

message FileChecksum {
  ChecksumAlgorithm algorithm = 1;
  string digest = 2;
  ChecksumEncoding encoding = 3;
}

enum ChecksumAlgorithm { 
  sha512 = 0;
  sha384 = 1; 
  sha256 = 2; 
  sha1 = 3; 
  md5 = 4; 
}

enum ChecksumEncoding {
  hex = 0;
  base64 = 1;
}