From 537f664c067a122e31c06c196d354dc4bfd7fed3 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:14:57 +0100 Subject: [PATCH 1/7] fix v_in in custom filter, add audio only mode --- assets/ffplayout.yml | 1 + ffplayout-engine/src/output/desktop.rs | 2 +- lib/src/filter/custom.rs | 4 ++ lib/src/filter/mod.rs | 97 ++++++++++++++++---------- lib/src/utils/config.rs | 47 ++++++++----- 5 files changed, 93 insertions(+), 58 deletions(-) diff --git a/assets/ffplayout.yml b/assets/ffplayout.yml index fef4fc79..200434a8 100644 --- a/assets/ffplayout.yml +++ b/assets/ffplayout.yml @@ -57,6 +57,7 @@ processing: With 'custom_filter' it is possible, to apply further filters. The filter outputs should end with [c_v_out] for video filter, and [c_a_out] for audio filter. mode: playlist + audio_only: false width: 1024 height: 576 aspect: 1.778 diff --git a/ffplayout-engine/src/output/desktop.rs b/ffplayout-engine/src/output/desktop.rs index 71757848..0443f789 100644 --- a/ffplayout-engine/src/output/desktop.rs +++ b/ffplayout-engine/src/output/desktop.rs @@ -23,7 +23,7 @@ pub fn output(config: &PlayoutConfig, log_format: &str) -> process::Child { "ffplayout" ]; - if config.text.add_text && !config.text.text_from_filename { + if config.text.add_text && !config.text.text_from_filename && !config.processing.audio_only { if let Some(socket) = config.text.zmq_stream_socket.clone() { debug!( "Using drawtext filter, listening on address: {}", diff --git a/lib/src/filter/custom.rs b/lib/src/filter/custom.rs index fe45fd3e..e2f14f6d 100644 --- a/lib/src/filter/custom.rs +++ b/lib/src/filter/custom.rs @@ -35,5 +35,9 @@ pub fn filter_node(filter: &str) -> (String, String) { error!("Custom filter is not well formatted, use correct out link names (\"[c_v_out]\" and/or \"[c_a_out]\"). Filter skipped!") } + if filter.starts_with("[v_in]") { + video_filter = format!("[v_in]{video_filter}"); + } + (video_filter, audio_filter) } diff --git a/lib/src/filter/mod.rs b/lib/src/filter/mod.rs index 6ba745e6..2812b0c1 100644 --- a/lib/src/filter/mod.rs +++ b/lib/src/filter/mod.rs @@ -138,7 +138,10 @@ impl Filters { let mut cmd = vec![]; if !a_chain.is_empty() { - f_chain.push(';'); + if !f_chain.is_empty() { + f_chain.push(';'); + } + f_chain.push_str(&a_chain); } @@ -153,7 +156,7 @@ impl Filters { pub fn map(&mut self) -> Vec { let mut o_map = self.output_map.clone(); - if self.video_last == -1 { + if self.video_last == -1 && !self.video_chain.is_empty() { let v_map = "0:v".to_string(); if !o_map.contains(&v_map) { @@ -412,9 +415,19 @@ fn aspect_calc(aspect_string: &Option, config: &PlayoutConfig) -> f64 { } /// This realtime filter is important for HLS output to stay in sync. -fn realtime(node: &mut Media, chain: &mut Filters, config: &PlayoutConfig) { +fn realtime( + node: &mut Media, + chain: &mut Filters, + config: &PlayoutConfig, + filter_type: FilterType, +) { if config.general.generate.is_none() && config.out.mode == HLS { - let mut speed_filter = "realtime=speed=1".to_string(); + let prefix = match filter_type { + Audio => "a", + Video => "", + }; + + let mut speed_filter = format!("{prefix}realtime=speed=1"); if let Some(begin) = &node.begin { let (delta, _) = get_delta(config, begin); @@ -424,12 +437,12 @@ fn realtime(node: &mut Media, chain: &mut Filters, config: &PlayoutConfig) { let speed = duration / (duration + delta); if speed > 0.0 && speed < 1.1 && delta < config.general.stop_threshold { - speed_filter = format!("realtime=speed={speed}"); + speed_filter = format!("{prefix}realtime=speed={speed}"); } } } - chain.add_filter(&speed_filter, 0, Video); + chain.add_filter(&speed_filter, 0, filter_type); } } @@ -504,54 +517,62 @@ pub fn filter_chains( let mut filters = Filters::new(config.processing.audio_tracks, 0); if node.unit == Encoder { - add_text(node, &mut filters, config, filter_chain); + if !config.processing.audio_only { + add_text(node, &mut filters, config, filter_chain); + } if let Some(f) = config.out.output_filter.clone() { process_output_filters(config, &mut filters, &f) - } else if config.out.output_count > 1 { + } else if config.out.output_count > 1 && !config.processing.audio_only { split_filter(&mut filters, config.out.output_count, 0, Video); } return filters; } - if let Some(probe) = node.probe.as_ref() { - if Path::new(&node.audio).is_file() { - filters.audio_position = 1; + if !config.processing.audio_only { + if let Some(probe) = node.probe.as_ref() { + if Path::new(&node.audio).is_file() { + filters.audio_position = 1; + } + + if let Some(v_stream) = &probe.video_streams.get(0) { + let aspect = aspect_calc(&v_stream.display_aspect_ratio, config); + let frame_per_sec = fps_calc(&v_stream.r_frame_rate, 1.0); + + deinterlace(&v_stream.field_order, &mut filters); + pad(aspect, &mut filters, v_stream, config); + fps(frame_per_sec, &mut filters, config); + scale( + v_stream.width, + v_stream.height, + aspect, + &mut filters, + config, + ); + } + + extend_video(node, &mut filters); + } else { + fps(0.0, &mut filters, config); + scale(None, None, 1.0, &mut filters, config); } - if let Some(v_stream) = &probe.video_streams.get(0) { - let aspect = aspect_calc(&v_stream.display_aspect_ratio, config); - let frame_per_sec = fps_calc(&v_stream.r_frame_rate, 1.0); - - deinterlace(&v_stream.field_order, &mut filters); - pad(aspect, &mut filters, v_stream, config); - fps(frame_per_sec, &mut filters, config); - scale( - v_stream.width, - v_stream.height, - aspect, - &mut filters, - config, - ); - } - - extend_video(node, &mut filters); - } else { - fps(0.0, &mut filters, config); - scale(None, None, 1.0, &mut filters, config); + add_text(node, &mut filters, config, filter_chain); + fade(node, &mut filters, 0, Video); + overlay(node, &mut filters, config); + realtime(node, &mut filters, config, Video); } - add_text(node, &mut filters, config, filter_chain); - fade(node, &mut filters, 0, Video); - overlay(node, &mut filters, config); - realtime(node, &mut filters, config); - let (proc_vf, proc_af) = custom::filter_node(&config.processing.custom_filter); let (list_vf, list_af) = custom::filter_node(&node.custom_filter); - custom(&proc_vf, &mut filters, 0, Video); - custom(&list_vf, &mut filters, 0, Video); + if config.processing.audio_only { + realtime(node, &mut filters, config, Audio); + } else { + custom(&proc_vf, &mut filters, 0, Video); + custom(&list_vf, &mut filters, 0, Video); + } for i in 0..config.processing.audio_tracks { if node diff --git a/lib/src/utils/config.rs b/lib/src/utils/config.rs index 709310a2..dc12798f 100644 --- a/lib/src/utils/config.rs +++ b/lib/src/utils/config.rs @@ -19,7 +19,7 @@ pub const IMAGE_FORMAT: [&str; 21] = [ ]; // Some well known errors can be safely ignore -pub const FFMPEG_IGNORE_ERRORS: [&str; 10] = [ +pub const FFMPEG_IGNORE_ERRORS: [&str; 11] = [ "ac-tex damaged", "codec s302m, is muxed as a private data stream", "corrupt decoded frame in stream", @@ -30,6 +30,7 @@ pub const FFMPEG_IGNORE_ERRORS: [&str; 10] = [ "skipped MB in I-frame at", "Thread message queue blocking", "Warning MVs not available", + "frame size not set", ]; #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] @@ -156,6 +157,8 @@ pub struct Logging { pub struct Processing { pub help_text: String, pub mode: ProcessMode, + #[serde(default)] + pub audio_only: bool, pub width: i64, pub height: i64, pub aspect: f64, @@ -328,24 +331,30 @@ impl PlayoutConfig { (config.processing.width * config.processing.height / 16) / 2 ); - let mut process_cmd = vec_strings![ - "-pix_fmt", - "yuv420p", - "-r", - &config.processing.fps, - "-c:v", - "mpeg2video", - "-g", - "1", - "-b:v", - &bitrate, - "-minrate", - &bitrate, - "-maxrate", - &bitrate, - "-bufsize", - &buff_size - ]; + let mut process_cmd = vec_strings![]; + + if config.processing.audio_only { + process_cmd.append(&mut vec_strings!["-vn"]); + } else { + process_cmd.append(&mut vec_strings![ + "-pix_fmt", + "yuv420p", + "-r", + &config.processing.fps, + "-c:v", + "mpeg2video", + "-g", + "1", + "-b:v", + &bitrate, + "-minrate", + &bitrate, + "-maxrate", + &bitrate, + "-bufsize", + &buff_size + ]); + } process_cmd.append(&mut pre_audio_codec( config.processing.add_loudnorm, From 01abdc7696fb7e204628df74dbe0d929d959dd79 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:15:26 +0100 Subject: [PATCH 2/7] add audio only mode --- ffplayout-frontend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffplayout-frontend b/ffplayout-frontend index fe022a7a..6d4f43c2 160000 --- a/ffplayout-frontend +++ b/ffplayout-frontend @@ -1 +1 @@ -Subproject commit fe022a7a59c3287197c95f450973a69808b5a9b1 +Subproject commit 6d4f43c2ea14c3b6b879acd71badb79d90664520 From 9e84c561efd98b36d82fcf5353efca691bdd0fb3 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:17:36 +0100 Subject: [PATCH 3/7] update version --- Cargo.lock | 6 +++--- ffplayout-api/Cargo.toml | 2 +- ffplayout-engine/Cargo.toml | 2 +- lib/Cargo.toml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7ef5381..d635fde1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -971,7 +971,7 @@ dependencies = [ [[package]] name = "ffplayout" -version = "0.17.0-beta2" +version = "0.17.0-beta3" dependencies = [ "chrono", "clap", @@ -991,7 +991,7 @@ dependencies = [ [[package]] name = "ffplayout-api" -version = "0.9.0-beta1" +version = "0.9.0-beta3" dependencies = [ "actix-files", "actix-multipart", @@ -1023,7 +1023,7 @@ dependencies = [ [[package]] name = "ffplayout-lib" -version = "0.17.0-beta2" +version = "0.17.0-beta3" dependencies = [ "chrono", "crossbeam-channel", diff --git a/ffplayout-api/Cargo.toml b/ffplayout-api/Cargo.toml index 98e339a8..7f599097 100644 --- a/ffplayout-api/Cargo.toml +++ b/ffplayout-api/Cargo.toml @@ -4,7 +4,7 @@ description = "Rest API for ffplayout" license = "GPL-3.0" authors = ["Jonathan Baecker jonbae77@gmail.com"] readme = "README.md" -version = "0.9.0-beta1" +version = "0.9.0-beta3" edition = "2021" [dependencies] diff --git a/ffplayout-engine/Cargo.toml b/ffplayout-engine/Cargo.toml index 680fbec9..d13cef90 100644 --- a/ffplayout-engine/Cargo.toml +++ b/ffplayout-engine/Cargo.toml @@ -4,7 +4,7 @@ description = "24/7 playout based on rust and ffmpeg" license = "GPL-3.0" authors = ["Jonathan Baecker jonbae77@gmail.com"] readme = "README.md" -version = "0.17.0-beta2" +version = "0.17.0-beta3" edition = "2021" default-run = "ffplayout" diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 53331aee..3462bf60 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -4,7 +4,7 @@ description = "Library for ffplayout" license = "GPL-3.0" authors = ["Jonathan Baecker jonbae77@gmail.com"] readme = "README.md" -version = "0.17.0-beta2" +version = "0.17.0-beta3" edition = "2021" [dependencies] From 7734e338d4ec8266cb2f3e4f0147e11e20a4dc35 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:29:17 +0100 Subject: [PATCH 4/7] exclude folder --- ffplayout-frontend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffplayout-frontend b/ffplayout-frontend index 6d4f43c2..c315281f 160000 --- a/ffplayout-frontend +++ b/ffplayout-frontend @@ -1 +1 @@ -Subproject commit 6d4f43c2ea14c3b6b879acd71badb79d90664520 +Subproject commit c315281f49f384e50ac99cdf45a81273b91e4197 From b2093ddf352964115c11bc09c2849c8491ee1156 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:33:19 +0100 Subject: [PATCH 5/7] update ffmpeg action --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 36e971e7..481162cc 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,7 +16,7 @@ jobs: - name: Use ffmpeg on Linux if: ${{ matrix.os == 'ubuntu-latest' }} - uses: FedericoCarboni/setup-ffmpeg@v1 + uses: FedericoCarboni/setup-ffmpeg@v2 - name: Tests on Linux if: ${{ matrix.os == 'ubuntu-latest' }} From f4e11a989fbbf331db0740135b472ab656ce0845 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:52:10 +0100 Subject: [PATCH 6/7] check if audio_only on active --- lib/src/filter/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/src/filter/mod.rs b/lib/src/filter/mod.rs index 9dad7a11..712e460c 100644 --- a/lib/src/filter/mod.rs +++ b/lib/src/filter/mod.rs @@ -45,7 +45,7 @@ pub struct Filters { pub audio_out_link: Vec, pub video_out_link: Vec, pub output_map: Vec, - audio_track_count: i32, + config: PlayoutConfig, audio_position: i32, video_position: i32, audio_last: i32, @@ -53,7 +53,7 @@ pub struct Filters { } impl Filters { - pub fn new(audio_track_count: i32, audio_position: i32) -> Self { + pub fn new(config: PlayoutConfig, audio_position: i32) -> Self { Self { audio_chain: String::new(), video_chain: String::new(), @@ -63,7 +63,7 @@ impl Filters { audio_out_link: vec![], video_out_link: vec![], output_map: vec![], - audio_track_count, + config, audio_position, video_position: 0, audio_last: -1, @@ -155,7 +155,7 @@ impl Filters { pub fn map(&mut self) -> Vec { let mut o_map = self.output_map.clone(); - if self.video_last == -1 && !self.video_chain.is_empty() { + if self.video_last == -1 && !self.config.processing.audio_only { let v_map = "0:v".to_string(); if !o_map.contains(&v_map) { @@ -164,7 +164,7 @@ impl Filters { } if self.audio_last == -1 { - for i in 0..self.audio_track_count { + for i in 0..self.config.processing.audio_tracks { let a_map = format!("{}:a:{i}", self.audio_position); if !o_map.contains(&a_map) { @@ -179,7 +179,7 @@ impl Filters { impl Default for Filters { fn default() -> Self { - Self::new(1, 0) + Self::new(PlayoutConfig::new(None), 0) } } @@ -513,7 +513,7 @@ pub fn filter_chains( node: &mut Media, filter_chain: &Option>>>, ) -> Filters { - let mut filters = Filters::new(config.processing.audio_tracks, 0); + let mut filters = Filters::new(config.clone(), 0); if node.unit == Encoder { if !config.processing.audio_only { From 3091834fcafd56c75d3e17537fdbec9823d7d9b7 Mon Sep 17 00:00:00 2001 From: jb-alvarado Date: Thu, 2 Feb 2023 12:52:52 +0100 Subject: [PATCH 7/7] update packages --- Cargo.lock | 220 +++++++++++++++++++++++++++-------------------------- 1 file changed, 114 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d635fde1..7d44b5b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -400,7 +400,7 @@ dependencies = [ "slab", "socket2", "waker-fn", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -448,9 +448,9 @@ checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" [[package]] name = "async-trait" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1" +checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" dependencies = [ "proc-macro2", "quote", @@ -581,9 +581,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" +checksum = "b7f0778972c64420fdedc63f09919c8a88bda7b25135357fd25a5d9f3257e832" dependencies = [ "memchr", "serde", @@ -603,9 +603,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" @@ -827,9 +827,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322296e2f2e5af4270b54df9e85a02ff037e271af20ba3e7fe1575515dc840b8" +checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" dependencies = [ "cc", "cxxbridge-flags", @@ -839,9 +839,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "017a1385b05d631e7875b1f151c9f012d37b53491e2a87f65bff5c262b2111d8" +checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" dependencies = [ "cc", "codespan-reporting", @@ -854,15 +854,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26bbb078acf09bc1ecda02d4223f03bdd28bd4874edcb0379138efc499ce971" +checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" [[package]] name = "cxxbridge-macro" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357f40d1f06a24b60ae1fe122542c1fb05d28d32acb2aed064e84bc2ad1e252e" +checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" dependencies = [ "proc-macro2", "quote", @@ -879,7 +879,7 @@ dependencies = [ "hashbrown", "lock_api", "once_cell", - "parking_lot_core 0.9.6", + "parking_lot_core 0.9.7", ] [[package]] @@ -920,11 +920,11 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "email-encoding" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34dd14c63662e0206599796cd5e1ad0268ab2b9d19b868d6050d688eba2bbf98" +checksum = "dbfb21b9878cf7a348dcb8559109aabc0ec40d69924bd706fa5149846c4fef75" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", "memchr", ] @@ -936,9 +936,9 @@ checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if 1.0.0", ] @@ -1076,7 +1076,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1168,9 +1168,9 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" dependencies = [ "futures-channel", "futures-core", @@ -1183,9 +1183,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" dependencies = [ "futures-core", "futures-sink", @@ -1193,15 +1193,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" dependencies = [ "futures-core", "futures-task", @@ -1221,9 +1221,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" [[package]] name = "futures-lite" @@ -1242,9 +1242,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" dependencies = [ "proc-macro2", "quote", @@ -1253,21 +1253,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" dependencies = [ "futures-channel", "futures-core", @@ -1366,9 +1366,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] @@ -1509,17 +1509,6 @@ dependencies = [ "cxx-build", ] -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.3.0" @@ -1610,9 +1599,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -1719,24 +1708,25 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lettre" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eabca5e0b4d0e98e7f2243fb5b7520b6af2b65d8f87bcc86f2c75185a6ff243" +checksum = "dd84a055407850bcf4791baa77cb4818d37cbb79ad4e60b9b659727b920d2c65" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", "email-encoding", "email_address", "fastrand", "futures-util", "hostname", "httpdate", - "idna 0.2.3", + "idna", "mime", "native-tls", "nom", "once_cell", "quoted_printable", "socket2", + "tokio", ] [[package]] @@ -1824,12 +1814,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "memchr" version = "2.5.0" @@ -1860,9 +1844,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "f2e212582ede878b109755efd0773a4f0f4ec851584cf0aefbeb4d9ecc114822" dependencies = [ "adler", ] @@ -1895,7 +1879,7 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2125,7 +2109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.6", + "parking_lot_core 0.9.7", ] [[package]] @@ -2144,15 +2128,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -2236,7 +2220,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2289,9 +2273,9 @@ dependencies = [ [[package]] name = "quoted_printable" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f14e071918cbeefc5edc986a7aa92c425dae244e003a35e1cdddb5ca39b5cb" +checksum = "a24039f627d8285853cc90dcddf8c1ebfaa91f834566948872b225b9a28ed1b6" [[package]] name = "rand" @@ -2468,7 +2452,7 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2485,9 +2469,9 @@ checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" [[package]] name = "security-framework" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", @@ -2928,9 +2912,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.24.2" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" +checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" dependencies = [ "autocfg", "bytes", @@ -2942,7 +2926,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "socket2", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3065,9 +3049,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -3094,15 +3078,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna", "percent-encoding", ] [[package]] name = "uuid" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" dependencies = [ "getrandom", ] @@ -3170,9 +3154,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -3180,9 +3164,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", @@ -3195,9 +3179,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -3207,9 +3191,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3217,9 +3201,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -3230,15 +3214,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -3311,6 +3295,30 @@ dependencies = [ "windows_x86_64_msvc", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" @@ -3408,18 +3416,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.12.2+zstd.1.5.2" +version = "0.12.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9262a83dc741c0b0ffec209881b45dbc232c21b02a2b9cb1adb93266e41303d" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.2+zstd.1.5.2" +version = "6.0.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cf39f730b440bab43da8fb5faf5f254574462f73f260f85f7987f32154ff17" +checksum = "68e4a3f57d13d0ab7e478665c60f35e2a613dcd527851c2c7287ce5c787e134a" dependencies = [ "libc", "zstd-sys", @@ -3427,9 +3435,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.5+zstd.1.5.2" +version = "2.0.6+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc50ffce891ad571e9f9afe5039c4837bede781ac4bb13052ed7ae695518596" +checksum = "68a3f9792c0c3dc6c165840a75f47ae1f4da402c2d006881129579f6597e801b" dependencies = [ "cc", "libc",