fix margins

This commit is contained in:
Hanashi
2026-08-10 23:18:48 -04:00
parent c01f1fd860
commit 5d869b9918
9 changed files with 913 additions and 913 deletions
@@ -242,10 +242,10 @@ mod tests {
#[test] #[test]
fn explicit_4k_without_video_reference() { fn explicit_4k_without_video_reference() {
assert_eq!(artcraft_4k_cents(4, 1, false), 347); assert_eq!(artcraft_4k_cents(4, 1, false), 358);
assert_eq!(artcraft_4k_cents(5, 1, false), 433); assert_eq!(artcraft_4k_cents(5, 1, false), 447);
assert_eq!(artcraft_4k_cents(10, 1, false), 866); assert_eq!(artcraft_4k_cents(10, 1, false), 893);
assert_eq!(artcraft_4k_cents(15, 1, false), 1299); assert_eq!(artcraft_4k_cents(15, 1, false), 1340);
} }
#[test] #[test]
@@ -513,9 +513,9 @@ mod tests {
#[test] #[test]
fn refs_cost_more_at_4k() { fn refs_cost_more_at_4k() {
assert_ref_delta(CommonResolution::FourK, 5, 433, 569, 136); assert_ref_delta(CommonResolution::FourK, 5, 447, 569, 122);
assert_ref_delta(CommonResolution::FourK, 10, 866, 1138, 272); assert_ref_delta(CommonResolution::FourK, 10, 893, 1138, 245);
assert_ref_delta(CommonResolution::FourK, 15, 1299, 1707, 408); assert_ref_delta(CommonResolution::FourK, 15, 1340, 1707, 367);
} }
/// Price the same generation with and without a reference video; pin /// Price the same generation with and without a reference video; pin
@@ -65,18 +65,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 14); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 15);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 36);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 50); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 54);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 17); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 21); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 23);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 42); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 45);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 63); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 68);
} }
} }
@@ -85,18 +85,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 35); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 37);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 46);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 88); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 91);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 131); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 137);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 42); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 44);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 53); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 55);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 105); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 110);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 158); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 165);
} }
#[test] #[test]
@@ -112,31 +112,31 @@ mod tests {
/// apply). Once, batch 8 executed in full but billed as batch 4. /// apply). Once, batch 8 executed in full but billed as batch 4.
#[test] #[test]
fn every_batch_size_720p_5s() { fn every_batch_size_720p_5s() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 46);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 88); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 91);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 131); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 137);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 175); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 182);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 219); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 228);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 262); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 273);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 306); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 319);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 349); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 364);
} }
#[test] #[test]
fn every_batch_size_480p_5s() { fn every_batch_size_480p_5s() {
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 36);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 50); assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 54);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 66); assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 71);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 82); assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 89);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 99); assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 107);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 115); assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 125);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 131); assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 142);
} }
#[test] #[test]
fn batch_eight_with_video_reference() { fn batch_eight_with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 419); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 438);
} }
#[test] #[test]
@@ -65,18 +65,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 14); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 15);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 36);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 50); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 54);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 17); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 21); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 23);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 42); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 45);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 63); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 68);
} }
} }
@@ -85,18 +85,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 35); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 37);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 46);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 88); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 91);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 131); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 137);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 42); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 44);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 53); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 55);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 105); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 110);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 158); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 165);
} }
#[test] #[test]
@@ -112,31 +112,31 @@ mod tests {
/// apply). Once, batch 8 executed in full but billed as batch 4. /// apply). Once, batch 8 executed in full but billed as batch 4.
#[test] #[test]
fn every_batch_size_720p_5s() { fn every_batch_size_720p_5s() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 46);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 88); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 91);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 131); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 137);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 175); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 182);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 219); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 228);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 262); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 273);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 306); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 319);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 349); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 364);
} }
#[test] #[test]
fn every_batch_size_480p_5s() { fn every_batch_size_480p_5s() {
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 36);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 50); assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 54);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 66); assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 71);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 82); assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 89);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 99); assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 107);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 115); assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 125);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 131); assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 142);
} }
#[test] #[test]
fn batch_eight_with_video_reference() { fn batch_eight_with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 419); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 438);
} }
#[test] #[test]
@@ -13,7 +13,7 @@ use crate::generate::generate_video::providers::artcraft::seedance_2p0_fast::req
/// ///
/// Kept as f64 because per-second rates are fractional; rounding happens /// Kept as f64 because per-second rates are fractional; rounding happens
/// once at the end after multiplying by duration * batch. /// once at the end after multiplying by duration * batch.
const CENTS_PER_SECOND_480P: f64 = 5.181; const CENTS_PER_SECOND_480P: f64 = 6.40;
const CENTS_PER_SECOND_720P: f64 = 12.727; const CENTS_PER_SECOND_720P: f64 = 12.727;
/// USD cents per second, in hundredths of a cent, when one or more /// USD cents per second, in hundredths of a cent, when one or more
@@ -149,25 +149,25 @@ mod tests {
#[test] #[test]
fn batch_1() { fn batch_1() {
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 4, 1), 21); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 4, 1), 26);
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 1), 26); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 1), 32);
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 10, 1), 52); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 10, 1), 64);
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 15, 1), 78); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 15, 1), 96);
} }
#[test] #[test]
fn batch_2() { fn batch_2() {
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 2), 52); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 2), 64);
} }
#[test] #[test]
fn batch_3() { fn batch_3() {
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 3), 78); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 3), 96);
} }
#[test] #[test]
fn batch_4() { fn batch_4() {
assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 4), 104); assert_eq!(cost_cents(Some(RouterResolution::FourEightyP), 5, 4), 128);
} }
} }
@@ -65,18 +65,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 13); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, false), 14);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, false), 35);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 49); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, false), 52);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 17); assert_eq!(cents(RouterResolution::FourEightyP, 4, 1, true), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 21); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, true), 22);
assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 42); assert_eq!(cents(RouterResolution::FourEightyP, 10, 1, true), 44);
assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 62); assert_eq!(cents(RouterResolution::FourEightyP, 15, 1, true), 66);
} }
} }
@@ -85,18 +85,18 @@ mod tests {
#[test] #[test]
fn without_video_reference() { fn without_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 35); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, false), 36);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 45);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 87); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, false), 89);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 130); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, false), 134);
} }
#[test] #[test]
fn with_video_reference() { fn with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 42); assert_eq!(cents(RouterResolution::SevenTwentyP, 4, 1, true), 43);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 52); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, true), 54);
assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 104); assert_eq!(cents(RouterResolution::SevenTwentyP, 10, 1, true), 108);
assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 156); assert_eq!(cents(RouterResolution::SevenTwentyP, 15, 1, true), 161);
} }
#[test] #[test]
@@ -112,31 +112,31 @@ mod tests {
/// apply). Once, batch 8 executed in full but billed as batch 4. /// apply). Once, batch 8 executed in full but billed as batch 4.
#[test] #[test]
fn every_batch_size_720p_5s() { fn every_batch_size_720p_5s() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 44); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 1, false), 45);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 87); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 2, false), 89);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 130); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 3, false), 134);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 173); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 4, false), 178);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 217); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 5, false), 223);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 260); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 6, false), 267);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 303); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 7, false), 312);
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 346); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, false), 356);
} }
#[test] #[test]
fn every_batch_size_480p_5s() { fn every_batch_size_480p_5s() {
assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 17); assert_eq!(cents(RouterResolution::FourEightyP, 5, 1, false), 18);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 33); assert_eq!(cents(RouterResolution::FourEightyP, 5, 2, false), 35);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 49); assert_eq!(cents(RouterResolution::FourEightyP, 5, 3, false), 52);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 65); assert_eq!(cents(RouterResolution::FourEightyP, 5, 4, false), 69);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 82); assert_eq!(cents(RouterResolution::FourEightyP, 5, 5, false), 87);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 98); assert_eq!(cents(RouterResolution::FourEightyP, 5, 6, false), 104);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 114); assert_eq!(cents(RouterResolution::FourEightyP, 5, 7, false), 121);
assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 130); assert_eq!(cents(RouterResolution::FourEightyP, 5, 8, false), 138);
} }
#[test] #[test]
fn batch_eight_with_video_reference() { fn batch_eight_with_video_reference() {
assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 415); assert_eq!(cents(RouterResolution::SevenTwentyP, 5, 8, true), 429);
} }
#[test] #[test]
@@ -11,8 +11,8 @@ use kinovi_web_client::generate::video::generate_seedance_2p5::{
// in hundredths of a USD cent per second so the math is exact integer arithmetic // in hundredths of a USD cent per second so the math is exact integer arithmetic
// (no floating point), then rounded up to whole cents. // (no floating point), then rounded up to whole cents.
/// 4K output price, in hundredths of a USD cent per second (86.60 ¢/s). /// 4K output price, in hundredths of a USD cent per second (89.30 ¢/s).
const FOUR_K_CENTI_CENTS_PER_SECOND: u64 = 8660; const FOUR_K_CENTI_CENTS_PER_SECOND: u64 = 8930;
/// ArtCraft's price (USD cents) for Seedance 2.0 at 4K with no reference /// ArtCraft's price (USD cents) for Seedance 2.0 at 4K with no reference
/// videos attached. Each model prices reference videos through its own /// videos attached. Each model prices reference videos through its own
@@ -40,22 +40,22 @@ pub fn seedance_2p0_four_k_usd_cents(
// rate sets and helpers below. // rate sets and helpers below.
/// Regular Mini — 480p price, USD cents per second. /// Regular Mini — 480p price, USD cents per second.
const MINI_CENTS_PER_SECOND_480P: f64 = 3.24074074; const MINI_CENTS_PER_SECOND_480P: f64 = 3.45;
/// Regular Mini — 480p reference-video surcharge, USD cents per second. /// Regular Mini — 480p reference-video surcharge, USD cents per second.
const MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_480P: f64 = 0.86419753; const MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_480P: f64 = 0.90;
/// Regular Mini — 720p price, USD cents per second. /// Regular Mini — 720p price, USD cents per second.
const MINI_CENTS_PER_SECOND_720P: f64 = 8.64197531; const MINI_CENTS_PER_SECOND_720P: f64 = 8.90;
/// Regular Mini — 720p reference-video surcharge, USD cents per second. /// Regular Mini — 720p reference-video surcharge, USD cents per second.
const MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_720P: f64 = 1.72839506; const MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_720P: f64 = 1.80;
/// BytePlus / BytePlus Ultra Mini — 480p price, USD cents per second. /// BytePlus / BytePlus Ultra Mini — 480p price, USD cents per second.
const BYTEPLUS_MINI_CENTS_PER_SECOND_480P: f64 = 3.27160494; const BYTEPLUS_MINI_CENTS_PER_SECOND_480P: f64 = 3.55;
/// BytePlus / BytePlus Ultra Mini — 480p reference-video surcharge, USD cents per second. /// BytePlus / BytePlus Ultra Mini — 480p reference-video surcharge, USD cents per second.
const BYTEPLUS_MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_480P: f64 = 0.87242798; const BYTEPLUS_MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_480P: f64 = 0.95;
/// BytePlus / BytePlus Ultra Mini — 720p price, USD cents per second. /// BytePlus / BytePlus Ultra Mini — 720p price, USD cents per second.
const BYTEPLUS_MINI_CENTS_PER_SECOND_720P: f64 = 8.72427984; const BYTEPLUS_MINI_CENTS_PER_SECOND_720P: f64 = 9.10;
/// BytePlus / BytePlus Ultra Mini — 720p reference-video surcharge, USD cents per second. /// BytePlus / BytePlus Ultra Mini — 720p reference-video surcharge, USD cents per second.
const BYTEPLUS_MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_720P: f64 = 1.74485597; const BYTEPLUS_MINI_VIDEO_REFERENCE_SURCHARGE_CENTS_PER_SECOND_720P: f64 = 1.85;
/// ArtCraft's price (USD cents) for the regular Seedance 2.0 Mini. /// ArtCraft's price (USD cents) for the regular Seedance 2.0 Mini.
/// ///
@@ -273,16 +273,16 @@ mod tests {
#[test] #[test]
fn four_k_base_prices() { fn four_k_base_prices() {
assert_eq!(seedance_2p0_four_k_usd_cents(4, 1), 347); assert_eq!(seedance_2p0_four_k_usd_cents(4, 1), 358);
assert_eq!(seedance_2p0_four_k_usd_cents(5, 1), 433); assert_eq!(seedance_2p0_four_k_usd_cents(5, 1), 447);
assert_eq!(seedance_2p0_four_k_usd_cents(10, 1), 866); assert_eq!(seedance_2p0_four_k_usd_cents(10, 1), 893);
assert_eq!(seedance_2p0_four_k_usd_cents(15, 1), 1299); assert_eq!(seedance_2p0_four_k_usd_cents(15, 1), 1340);
} }
#[test] #[test]
fn batch_count_multiplies() { fn batch_count_multiplies() {
assert_eq!(seedance_2p0_four_k_usd_cents(5, 2), 866); assert_eq!(seedance_2p0_four_k_usd_cents(5, 2), 893);
assert_eq!(seedance_2p0_four_k_usd_cents(5, 4), 1732); assert_eq!(seedance_2p0_four_k_usd_cents(5, 4), 1786);
} }
// ── Seedance 2.0 Mini ── // ── Seedance 2.0 Mini ──
@@ -299,34 +299,34 @@ mod tests {
#[test] #[test]
fn four_eighty_p_without_video_reference() { fn four_eighty_p_without_video_reference() {
assert_eq!(cents(CommonResolution::FourEightyP, 4, false), 13); assert_eq!(cents(CommonResolution::FourEightyP, 4, false), 14);
assert_eq!(cents(CommonResolution::FourEightyP, 5, false), 17); assert_eq!(cents(CommonResolution::FourEightyP, 5, false), 18);
assert_eq!(cents(CommonResolution::FourEightyP, 10, false), 33); assert_eq!(cents(CommonResolution::FourEightyP, 10, false), 35);
assert_eq!(cents(CommonResolution::FourEightyP, 15, false), 49); assert_eq!(cents(CommonResolution::FourEightyP, 15, false), 52);
} }
#[test] #[test]
fn four_eighty_p_with_video_reference() { fn four_eighty_p_with_video_reference() {
assert_eq!(cents(CommonResolution::FourEightyP, 4, true), 17); assert_eq!(cents(CommonResolution::FourEightyP, 4, true), 18);
assert_eq!(cents(CommonResolution::FourEightyP, 5, true), 21); assert_eq!(cents(CommonResolution::FourEightyP, 5, true), 22);
assert_eq!(cents(CommonResolution::FourEightyP, 10, true), 42); assert_eq!(cents(CommonResolution::FourEightyP, 10, true), 44);
assert_eq!(cents(CommonResolution::FourEightyP, 15, true), 62); assert_eq!(cents(CommonResolution::FourEightyP, 15, true), 66);
} }
#[test] #[test]
fn seven_twenty_p_without_video_reference() { fn seven_twenty_p_without_video_reference() {
assert_eq!(cents(CommonResolution::SevenTwentyP, 4, false), 35); assert_eq!(cents(CommonResolution::SevenTwentyP, 4, false), 36);
assert_eq!(cents(CommonResolution::SevenTwentyP, 5, false), 44); assert_eq!(cents(CommonResolution::SevenTwentyP, 5, false), 45);
assert_eq!(cents(CommonResolution::SevenTwentyP, 10, false), 87); assert_eq!(cents(CommonResolution::SevenTwentyP, 10, false), 89);
assert_eq!(cents(CommonResolution::SevenTwentyP, 15, false), 130); assert_eq!(cents(CommonResolution::SevenTwentyP, 15, false), 134);
} }
#[test] #[test]
fn seven_twenty_p_with_video_reference() { fn seven_twenty_p_with_video_reference() {
assert_eq!(cents(CommonResolution::SevenTwentyP, 4, true), 42); assert_eq!(cents(CommonResolution::SevenTwentyP, 4, true), 43);
assert_eq!(cents(CommonResolution::SevenTwentyP, 5, true), 52); assert_eq!(cents(CommonResolution::SevenTwentyP, 5, true), 54);
assert_eq!(cents(CommonResolution::SevenTwentyP, 10, true), 104); assert_eq!(cents(CommonResolution::SevenTwentyP, 10, true), 108);
assert_eq!(cents(CommonResolution::SevenTwentyP, 15, true), 156); assert_eq!(cents(CommonResolution::SevenTwentyP, 15, true), 161);
} }
#[test] #[test]
@@ -353,9 +353,9 @@ mod tests {
fn batch_count_scales_the_total() { fn batch_count_scales_the_total() {
// Batch is baked in before the single round-up, so batched totals can be // Batch is baked in before the single round-up, so batched totals can be
// a cent under N× the single price. // a cent under N× the single price.
assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 2, false), 87); assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 2, false), 89);
assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 4, false), 173); assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 4, false), 178);
assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::FourEightyP, 5, 2, false), 33); assert_eq!(seedance_2p0_mini_usd_cents(CommonResolution::FourEightyP, 5, 2, false), 35);
} }
} }
@@ -373,34 +373,34 @@ mod tests {
#[test] #[test]
fn four_eighty_p_without_video_reference() { fn four_eighty_p_without_video_reference() {
assert_eq!(cents(CommonResolution::FourEightyP, 4, false), 14); assert_eq!(cents(CommonResolution::FourEightyP, 4, false), 15);
assert_eq!(cents(CommonResolution::FourEightyP, 5, false), 17); assert_eq!(cents(CommonResolution::FourEightyP, 5, false), 18);
assert_eq!(cents(CommonResolution::FourEightyP, 10, false), 33); assert_eq!(cents(CommonResolution::FourEightyP, 10, false), 36);
assert_eq!(cents(CommonResolution::FourEightyP, 15, false), 50); assert_eq!(cents(CommonResolution::FourEightyP, 15, false), 54);
} }
#[test] #[test]
fn four_eighty_p_with_video_reference() { fn four_eighty_p_with_video_reference() {
assert_eq!(cents(CommonResolution::FourEightyP, 4, true), 17); assert_eq!(cents(CommonResolution::FourEightyP, 4, true), 18);
assert_eq!(cents(CommonResolution::FourEightyP, 5, true), 21); assert_eq!(cents(CommonResolution::FourEightyP, 5, true), 23);
assert_eq!(cents(CommonResolution::FourEightyP, 10, true), 42); assert_eq!(cents(CommonResolution::FourEightyP, 10, true), 45);
assert_eq!(cents(CommonResolution::FourEightyP, 15, true), 63); assert_eq!(cents(CommonResolution::FourEightyP, 15, true), 68);
} }
#[test] #[test]
fn seven_twenty_p_without_video_reference() { fn seven_twenty_p_without_video_reference() {
assert_eq!(cents(CommonResolution::SevenTwentyP, 4, false), 35); assert_eq!(cents(CommonResolution::SevenTwentyP, 4, false), 37);
assert_eq!(cents(CommonResolution::SevenTwentyP, 5, false), 44); assert_eq!(cents(CommonResolution::SevenTwentyP, 5, false), 46);
assert_eq!(cents(CommonResolution::SevenTwentyP, 10, false), 88); assert_eq!(cents(CommonResolution::SevenTwentyP, 10, false), 91);
assert_eq!(cents(CommonResolution::SevenTwentyP, 15, false), 131); assert_eq!(cents(CommonResolution::SevenTwentyP, 15, false), 137);
} }
#[test] #[test]
fn seven_twenty_p_with_video_reference() { fn seven_twenty_p_with_video_reference() {
assert_eq!(cents(CommonResolution::SevenTwentyP, 4, true), 42); assert_eq!(cents(CommonResolution::SevenTwentyP, 4, true), 44);
assert_eq!(cents(CommonResolution::SevenTwentyP, 5, true), 53); assert_eq!(cents(CommonResolution::SevenTwentyP, 5, true), 55);
assert_eq!(cents(CommonResolution::SevenTwentyP, 10, true), 105); assert_eq!(cents(CommonResolution::SevenTwentyP, 10, true), 110);
assert_eq!(cents(CommonResolution::SevenTwentyP, 15, true), 158); assert_eq!(cents(CommonResolution::SevenTwentyP, 15, true), 165);
} }
#[test] #[test]
@@ -428,9 +428,9 @@ mod tests {
#[test] #[test]
fn batch_count_scales_the_total() { fn batch_count_scales_the_total() {
assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 2, false), 88); assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 2, false), 91);
assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 4, false), 175); assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::SevenTwentyP, 5, 4, false), 182);
assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::FourEightyP, 5, 2, false), 33); assert_eq!(seedance_2p0_byteplus_mini_usd_cents(CommonResolution::FourEightyP, 5, 2, false), 36);
} }
} }
} }
@@ -31,18 +31,18 @@ mod seedance_2p0_fast {
let harness = TestHarness::create().await; let harness = TestHarness::create().await;
let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[ let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[
(Some(CommonResolution::FourEightyP), Seconds(4), Batch(1), ExpectedCredits(21)), (Some(CommonResolution::FourEightyP), Seconds(4), Batch(1), ExpectedCredits(26)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(26)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(32)),
(Some(CommonResolution::FourEightyP), Seconds(6), Batch(1), ExpectedCredits(31)), (Some(CommonResolution::FourEightyP), Seconds(6), Batch(1), ExpectedCredits(38)),
(Some(CommonResolution::FourEightyP), Seconds(7), Batch(1), ExpectedCredits(36)), (Some(CommonResolution::FourEightyP), Seconds(7), Batch(1), ExpectedCredits(45)),
(Some(CommonResolution::FourEightyP), Seconds(8), Batch(1), ExpectedCredits(41)), (Some(CommonResolution::FourEightyP), Seconds(8), Batch(1), ExpectedCredits(51)),
(Some(CommonResolution::FourEightyP), Seconds(9), Batch(1), ExpectedCredits(47)), (Some(CommonResolution::FourEightyP), Seconds(9), Batch(1), ExpectedCredits(58)),
(Some(CommonResolution::FourEightyP), Seconds(10), Batch(1), ExpectedCredits(52)), (Some(CommonResolution::FourEightyP), Seconds(10), Batch(1), ExpectedCredits(64)),
(Some(CommonResolution::FourEightyP), Seconds(11), Batch(1), ExpectedCredits(57)), (Some(CommonResolution::FourEightyP), Seconds(11), Batch(1), ExpectedCredits(70)),
(Some(CommonResolution::FourEightyP), Seconds(12), Batch(1), ExpectedCredits(62)), (Some(CommonResolution::FourEightyP), Seconds(12), Batch(1), ExpectedCredits(77)),
(Some(CommonResolution::FourEightyP), Seconds(13), Batch(1), ExpectedCredits(67)), (Some(CommonResolution::FourEightyP), Seconds(13), Batch(1), ExpectedCredits(83)),
(Some(CommonResolution::FourEightyP), Seconds(14), Batch(1), ExpectedCredits(73)), (Some(CommonResolution::FourEightyP), Seconds(14), Batch(1), ExpectedCredits(90)),
(Some(CommonResolution::FourEightyP), Seconds(15), Batch(1), ExpectedCredits(78)), (Some(CommonResolution::FourEightyP), Seconds(15), Batch(1), ExpectedCredits(96)),
(Some(CommonResolution::SevenTwentyP), Seconds(4), Batch(1), ExpectedCredits(51)), (Some(CommonResolution::SevenTwentyP), Seconds(4), Batch(1), ExpectedCredits(51)),
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64)),
(Some(CommonResolution::SevenTwentyP), Seconds(6), Batch(1), ExpectedCredits(76)), (Some(CommonResolution::SevenTwentyP), Seconds(6), Batch(1), ExpectedCredits(76)),
@@ -97,16 +97,16 @@ mod seedance_2p0_fast {
let harness = TestHarness::create().await; let harness = TestHarness::create().await;
let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[ let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(26)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(32)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(2), ExpectedCredits(52)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(2), ExpectedCredits(64)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(3), ExpectedCredits(78)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(3), ExpectedCredits(96)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(4), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(4), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(5), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(5), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(6), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(6), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(7), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(7), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(8), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(8), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(9), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(9), ExpectedCredits(128)),
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(10), ExpectedCredits(104)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(10), ExpectedCredits(128)),
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64)),
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(2), ExpectedCredits(127)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(2), ExpectedCredits(127)),
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(3), ExpectedCredits(191)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(3), ExpectedCredits(191)),
@@ -153,12 +153,12 @@ mod seedance_2p0_fast {
let harness = TestHarness::create().await; let harness = TestHarness::create().await;
let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[ let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits)] = &[
(Some(CommonResolution::FourEightyP), Seconds(6), Batch(2), ExpectedCredits(62)), (Some(CommonResolution::FourEightyP), Seconds(6), Batch(2), ExpectedCredits(77)),
(Some(CommonResolution::FourEightyP), Seconds(7), Batch(3), ExpectedCredits(109)), (Some(CommonResolution::FourEightyP), Seconds(7), Batch(3), ExpectedCredits(134)),
(Some(CommonResolution::FourEightyP), Seconds(9), Batch(4), ExpectedCredits(187)), (Some(CommonResolution::FourEightyP), Seconds(9), Batch(4), ExpectedCredits(230)),
(Some(CommonResolution::FourEightyP), Seconds(11), Batch(5), ExpectedCredits(228)), (Some(CommonResolution::FourEightyP), Seconds(11), Batch(5), ExpectedCredits(282)),
(Some(CommonResolution::FourEightyP), Seconds(13), Batch(8), ExpectedCredits(269)), (Some(CommonResolution::FourEightyP), Seconds(13), Batch(8), ExpectedCredits(333)),
(Some(CommonResolution::FourEightyP), Seconds(15), Batch(10), ExpectedCredits(311)), (Some(CommonResolution::FourEightyP), Seconds(15), Batch(10), ExpectedCredits(384)),
(Some(CommonResolution::SevenTwentyP), Seconds(6), Batch(2), ExpectedCredits(153)), (Some(CommonResolution::SevenTwentyP), Seconds(6), Batch(2), ExpectedCredits(153)),
(Some(CommonResolution::SevenTwentyP), Seconds(7), Batch(3), ExpectedCredits(267)), (Some(CommonResolution::SevenTwentyP), Seconds(7), Batch(3), ExpectedCredits(267)),
(Some(CommonResolution::SevenTwentyP), Seconds(9), Batch(4), ExpectedCredits(458)), (Some(CommonResolution::SevenTwentyP), Seconds(9), Batch(4), ExpectedCredits(458)),
@@ -1115,7 +1115,7 @@ mod premium {
let harness = TestHarness::create().await; let harness = TestHarness::create().await;
let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits, ExpectedCredits, CreditsDelta)] = &[ let cases: &[(Option<CommonResolution>, Seconds, Batch, ExpectedCredits, ExpectedCredits, CreditsDelta)] = &[
(Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(26), ExpectedCredits(45), CreditsDelta(19)), (Some(CommonResolution::FourEightyP), Seconds(5), Batch(1), ExpectedCredits(32), ExpectedCredits(45), CreditsDelta(13)),
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64), ExpectedCredits(100), CreditsDelta(36)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(1), ExpectedCredits(64), ExpectedCredits(100), CreditsDelta(36)),
(Some(CommonResolution::SevenTwentyP), Seconds(10), Batch(1), ExpectedCredits(127), ExpectedCredits(200), CreditsDelta(73)), (Some(CommonResolution::SevenTwentyP), Seconds(10), Batch(1), ExpectedCredits(127), ExpectedCredits(200), CreditsDelta(73)),
]; ];
@@ -70,18 +70,18 @@ mod seedance_2p0 {
(Some(CommonResolution::TenEightyP), Seconds(13), Batch(1), ExpectedCredits(606)), (Some(CommonResolution::TenEightyP), Seconds(13), Batch(1), ExpectedCredits(606)),
(Some(CommonResolution::TenEightyP), Seconds(14), Batch(1), ExpectedCredits(653)), (Some(CommonResolution::TenEightyP), Seconds(14), Batch(1), ExpectedCredits(653)),
(Some(CommonResolution::TenEightyP), Seconds(15), Batch(1), ExpectedCredits(699)), (Some(CommonResolution::TenEightyP), Seconds(15), Batch(1), ExpectedCredits(699)),
(Some(CommonResolution::FourK), Seconds(4), Batch(1), ExpectedCredits(347)), (Some(CommonResolution::FourK), Seconds(4), Batch(1), ExpectedCredits(358)),
(Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(433)), (Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(447)),
(Some(CommonResolution::FourK), Seconds(6), Batch(1), ExpectedCredits(520)), (Some(CommonResolution::FourK), Seconds(6), Batch(1), ExpectedCredits(536)),
(Some(CommonResolution::FourK), Seconds(7), Batch(1), ExpectedCredits(607)), (Some(CommonResolution::FourK), Seconds(7), Batch(1), ExpectedCredits(626)),
(Some(CommonResolution::FourK), Seconds(8), Batch(1), ExpectedCredits(693)), (Some(CommonResolution::FourK), Seconds(8), Batch(1), ExpectedCredits(715)),
(Some(CommonResolution::FourK), Seconds(9), Batch(1), ExpectedCredits(780)), (Some(CommonResolution::FourK), Seconds(9), Batch(1), ExpectedCredits(804)),
(Some(CommonResolution::FourK), Seconds(10), Batch(1), ExpectedCredits(866)), (Some(CommonResolution::FourK), Seconds(10), Batch(1), ExpectedCredits(893)),
(Some(CommonResolution::FourK), Seconds(11), Batch(1), ExpectedCredits(953)), (Some(CommonResolution::FourK), Seconds(11), Batch(1), ExpectedCredits(983)),
(Some(CommonResolution::FourK), Seconds(12), Batch(1), ExpectedCredits(1040)), (Some(CommonResolution::FourK), Seconds(12), Batch(1), ExpectedCredits(1072)),
(Some(CommonResolution::FourK), Seconds(13), Batch(1), ExpectedCredits(1126)), (Some(CommonResolution::FourK), Seconds(13), Batch(1), ExpectedCredits(1161)),
(Some(CommonResolution::FourK), Seconds(14), Batch(1), ExpectedCredits(1213)), (Some(CommonResolution::FourK), Seconds(14), Batch(1), ExpectedCredits(1251)),
(Some(CommonResolution::FourK), Seconds(15), Batch(1), ExpectedCredits(1299)), (Some(CommonResolution::FourK), Seconds(15), Batch(1), ExpectedCredits(1340)),
]; ];
for (resolution, seconds, batch, expected) in cases { for (resolution, seconds, batch, expected) in cases {
@@ -129,16 +129,16 @@ mod seedance_2p0 {
(Some(CommonResolution::TenEightyP), Seconds(5), Batch(8), ExpectedCredits(933)), (Some(CommonResolution::TenEightyP), Seconds(5), Batch(8), ExpectedCredits(933)),
(Some(CommonResolution::TenEightyP), Seconds(5), Batch(9), ExpectedCredits(933)), (Some(CommonResolution::TenEightyP), Seconds(5), Batch(9), ExpectedCredits(933)),
(Some(CommonResolution::TenEightyP), Seconds(5), Batch(10), ExpectedCredits(933)), (Some(CommonResolution::TenEightyP), Seconds(5), Batch(10), ExpectedCredits(933)),
(Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(433)), (Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(447)),
(Some(CommonResolution::FourK), Seconds(5), Batch(2), ExpectedCredits(866)), (Some(CommonResolution::FourK), Seconds(5), Batch(2), ExpectedCredits(893)),
(Some(CommonResolution::FourK), Seconds(5), Batch(3), ExpectedCredits(1299)), (Some(CommonResolution::FourK), Seconds(5), Batch(3), ExpectedCredits(1340)),
(Some(CommonResolution::FourK), Seconds(5), Batch(4), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(4), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(5), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(5), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(6), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(6), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(7), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(7), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(8), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(8), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(9), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(9), ExpectedCredits(1786)),
(Some(CommonResolution::FourK), Seconds(5), Batch(10), ExpectedCredits(1732)), (Some(CommonResolution::FourK), Seconds(5), Batch(10), ExpectedCredits(1786)),
]; ];
for (resolution, seconds, batch, expected) in cases { for (resolution, seconds, batch, expected) in cases {
@@ -173,12 +173,12 @@ mod seedance_2p0 {
(Some(CommonResolution::TenEightyP), Seconds(11), Batch(5), ExpectedCredits(2052)), (Some(CommonResolution::TenEightyP), Seconds(11), Batch(5), ExpectedCredits(2052)),
(Some(CommonResolution::TenEightyP), Seconds(13), Batch(8), ExpectedCredits(2425)), (Some(CommonResolution::TenEightyP), Seconds(13), Batch(8), ExpectedCredits(2425)),
(Some(CommonResolution::TenEightyP), Seconds(15), Batch(10), ExpectedCredits(2798)), (Some(CommonResolution::TenEightyP), Seconds(15), Batch(10), ExpectedCredits(2798)),
(Some(CommonResolution::FourK), Seconds(6), Batch(2), ExpectedCredits(1040)), (Some(CommonResolution::FourK), Seconds(6), Batch(2), ExpectedCredits(1072)),
(Some(CommonResolution::FourK), Seconds(7), Batch(3), ExpectedCredits(1819)), (Some(CommonResolution::FourK), Seconds(7), Batch(3), ExpectedCredits(1876)),
(Some(CommonResolution::FourK), Seconds(9), Batch(4), ExpectedCredits(3118)), (Some(CommonResolution::FourK), Seconds(9), Batch(4), ExpectedCredits(3215)),
(Some(CommonResolution::FourK), Seconds(11), Batch(5), ExpectedCredits(3811)), (Some(CommonResolution::FourK), Seconds(11), Batch(5), ExpectedCredits(3930)),
(Some(CommonResolution::FourK), Seconds(13), Batch(8), ExpectedCredits(4504)), (Some(CommonResolution::FourK), Seconds(13), Batch(8), ExpectedCredits(4644)),
(Some(CommonResolution::FourK), Seconds(15), Batch(10), ExpectedCredits(5196)), (Some(CommonResolution::FourK), Seconds(15), Batch(10), ExpectedCredits(5358)),
]; ];
for (resolution, seconds, batch, expected) in cases { for (resolution, seconds, batch, expected) in cases {
@@ -1147,10 +1147,10 @@ mod premium {
// Batch 8 is accepted but downgrades to the platform max of 4 on both // Batch 8 is accepted but downgrades to the platform max of 4 on both
// execution and billing, so it prices identically to batch 4. // execution and billing, so it prices identically to batch 4.
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(8), ExpectedCredits(320), ExpectedCredits(500), CreditsDelta(180)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(8), ExpectedCredits(320), ExpectedCredits(500), CreditsDelta(180)),
// 4K premium: the base tier prices at 86.6 cents/s while the BytePlus // 4K premium: the base tier prices at 89.3 cents/s while the BytePlus
// tiers price at 95.0 cents/s. // tiers price at 95.0 cents/s.
(Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(433), ExpectedCredits(475), CreditsDelta(42)), (Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(447), ExpectedCredits(475), CreditsDelta(28)),
(Some(CommonResolution::FourK), Seconds(15), Batch(4), ExpectedCredits(5196), ExpectedCredits(5700), CreditsDelta(504)), (Some(CommonResolution::FourK), Seconds(15), Batch(4), ExpectedCredits(5358), ExpectedCredits(5700), CreditsDelta(342)),
]; ];
for (resolution, seconds, batch, base, variant, delta) in cases { for (resolution, seconds, batch, base, variant, delta) in cases {
@@ -1178,10 +1178,10 @@ mod premium {
// Batch 8 is accepted but downgrades to the platform max of 4 on both // Batch 8 is accepted but downgrades to the platform max of 4 on both
// execution and billing, so it prices identically to batch 4. // execution and billing, so it prices identically to batch 4.
(Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(8), ExpectedCredits(320), ExpectedCredits(500), CreditsDelta(180)), (Some(CommonResolution::SevenTwentyP), Seconds(5), Batch(8), ExpectedCredits(320), ExpectedCredits(500), CreditsDelta(180)),
// 4K premium: the base tier prices at 86.6 cents/s while the BytePlus // 4K premium: the base tier prices at 89.3 cents/s while the BytePlus
// tiers price at 95.0 cents/s. // tiers price at 95.0 cents/s.
(Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(433), ExpectedCredits(475), CreditsDelta(42)), (Some(CommonResolution::FourK), Seconds(5), Batch(1), ExpectedCredits(447), ExpectedCredits(475), CreditsDelta(28)),
(Some(CommonResolution::FourK), Seconds(15), Batch(4), ExpectedCredits(5196), ExpectedCredits(5700), CreditsDelta(504)), (Some(CommonResolution::FourK), Seconds(15), Batch(4), ExpectedCredits(5358), ExpectedCredits(5700), CreditsDelta(342)),
]; ];
for (resolution, seconds, batch, base, variant, delta) in cases { for (resolution, seconds, batch, base, variant, delta) in cases {