Merge pull request #583 from jb-alvarado/master

v0.21.0-beta2
This commit is contained in:
jb-alvarado 2024-04-09 15:04:10 +00:00 committed by GitHub
commit 1cb9e78b11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 234 additions and 166 deletions

187
Cargo.lock generated
View File

@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -126,7 +126,7 @@ dependencies = [
"parse-size", "parse-size",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -239,14 +239,14 @@ dependencies = [
"actix-router", "actix-router",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
name = "actix-web-grants" name = "actix-web-grants"
version = "4.0.3" version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf5941a5bdf4cc022ca7721dae70d9818d7b13f93040b0543cb901410c8d3172" checksum = "9793f592921b44112da3d82f7a6d5e0867cb0b1a7c11c304138bff95f92a5725"
dependencies = [ dependencies = [
"actix-web", "actix-web",
"protect-endpoints-proc-macro", "protect-endpoints-proc-macro",
@ -452,17 +452,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3"
dependencies = [ dependencies = [
"concurrent-queue", "concurrent-queue",
"event-listener 5.2.0", "event-listener 5.3.0",
"event-listener-strategy 0.5.0", "event-listener-strategy 0.5.1",
"futures-core", "futures-core",
"pin-project-lite", "pin-project-lite",
] ]
[[package]] [[package]]
name = "async-executor" name = "async-executor"
version = "1.8.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" checksum = "5f98c37cf288e302c16ef6c8472aad1e034c6c84ce5ea7b8101c98eb4a802fee"
dependencies = [ dependencies = [
"async-lock 3.3.0", "async-lock 3.3.0",
"async-task", "async-task",
@ -587,7 +587,7 @@ checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -729,9 +729,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.15.4" version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@ -756,9 +756,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.90" version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -782,9 +782,9 @@ dependencies = [
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.35" version = "0.4.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e"
dependencies = [ dependencies = [
"android-tzdata", "android-tzdata",
"iana-time-zone", "iana-time-zone",
@ -830,7 +830,7 @@ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
"clap_lex", "clap_lex",
"strsim 0.11.0", "strsim 0.11.1",
] ]
[[package]] [[package]]
@ -842,7 +842,7 @@ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -906,9 +906,9 @@ dependencies = [
[[package]] [[package]]
name = "crc" name = "crc"
version = "3.0.1" version = "3.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
dependencies = [ dependencies = [
"crc-catalog", "crc-catalog",
] ]
@ -1002,7 +1002,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim 0.10.0", "strsim 0.10.0",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -1013,7 +1013,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -1031,9 +1031,9 @@ dependencies = [
[[package]] [[package]]
name = "der" name = "der"
version = "0.7.8" version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
dependencies = [ dependencies = [
"const-oid", "const-oid",
"pem-rfc7468", "pem-rfc7468",
@ -1091,9 +1091,9 @@ dependencies = [
[[package]] [[package]]
name = "email-encoding" name = "email-encoding"
version = "0.2.1" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a87260449b06739ee78d6281c68d2a0ff3e3af64a78df63d3a1aeb3c06997c8a" checksum = "60d1d33cdaede7e24091f039632eb5d3c7469fe5b066a985281a34fc70fa317f"
dependencies = [ dependencies = [
"base64 0.22.0", "base64 0.22.0",
"memchr", "memchr",
@ -1160,9 +1160,9 @@ dependencies = [
[[package]] [[package]]
name = "event-listener" name = "event-listener"
version = "5.2.0" version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24"
dependencies = [ dependencies = [
"concurrent-queue", "concurrent-queue",
"parking", "parking",
@ -1181,11 +1181,11 @@ dependencies = [
[[package]] [[package]]
name = "event-listener-strategy" name = "event-listener-strategy"
version = "0.5.0" version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3"
dependencies = [ dependencies = [
"event-listener 5.2.0", "event-listener 5.3.0",
"pin-project-lite", "pin-project-lite",
] ]
@ -1217,7 +1217,7 @@ checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
[[package]] [[package]]
name = "ffplayout" name = "ffplayout"
version = "0.21.0-beta1" version = "0.21.0-beta2"
dependencies = [ dependencies = [
"chrono", "chrono",
"clap", "clap",
@ -1239,7 +1239,7 @@ dependencies = [
[[package]] [[package]]
name = "ffplayout-api" name = "ffplayout-api"
version = "0.21.0-beta1" version = "0.21.0-beta2"
dependencies = [ dependencies = [
"actix-files", "actix-files",
"actix-multipart", "actix-multipart",
@ -1278,7 +1278,7 @@ dependencies = [
[[package]] [[package]]
name = "ffplayout-lib" name = "ffplayout-lib"
version = "0.21.0-beta1" version = "0.21.0-beta2"
dependencies = [ dependencies = [
"chrono", "chrono",
"crossbeam-channel", "crossbeam-channel",
@ -1306,9 +1306,9 @@ dependencies = [
[[package]] [[package]]
name = "ffprobe" name = "ffprobe"
version = "0.3.3" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5d603974ab029fc75cebf00bfa06c9c6f49a6fb657f4f5f6a9fd6cbd76910a4" checksum = "8ffef835e1f9ac151db5bb2adbb95c9dfe1f315f987f011dd89cd655b4e9a52c"
dependencies = [ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
@ -1491,7 +1491,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -1536,9 +1536,9 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.12" version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys", "js-sys",
@ -1573,9 +1573,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.3.25" version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@ -1971,9 +1971,9 @@ dependencies = [
[[package]] [[package]]
name = "lettre" name = "lettre"
version = "0.11.5" version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8305b122b8ccc64e437b0de101851f9f00aade5886246e85f341c1d9a15a91b7" checksum = "47460276655930189e0919e4fbf46e46476b14f934f18a63dd726a5fb7b60e2e"
dependencies = [ dependencies = [
"base64 0.22.0", "base64 0.22.0",
"chumsky", "chumsky",
@ -1987,7 +1987,7 @@ dependencies = [
"percent-encoding", "percent-encoding",
"quoted_printable", "quoted_printable",
"rustls 0.23.4", "rustls 0.23.4",
"rustls-pemfile 2.1.1", "rustls-pemfile",
"socket2 0.5.6", "socket2 0.5.6",
"tokio", "tokio",
"url", "url",
@ -2098,9 +2098,9 @@ dependencies = [
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.1" version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]] [[package]]
name = "mime" name = "mime"
@ -2400,11 +2400,11 @@ checksum = "498a099351efa4becc6a19c72aa9270598e8fd274ca47052e37455241c88b696"
[[package]] [[package]]
name = "pem" name = "pem"
version = "3.0.3" version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae"
dependencies = [ dependencies = [
"base64 0.21.7", "base64 0.22.0",
"serde", "serde",
] ]
@ -2440,14 +2440,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.13" version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]] [[package]]
name = "pin-utils" name = "pin-utils"
@ -2547,14 +2547,14 @@ dependencies = [
[[package]] [[package]]
name = "protect-endpoints-proc-macro" name = "protect-endpoints-proc-macro"
version = "0.1.1" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfff647917bb00f5e9c57a5c15d95db74db5387139ac03052358e38462c86a76" checksum = "252ec626765a872f3a6d462581c4781549a2a2f6f9d4d8a789ad40f5db3c0c74"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -2677,11 +2677,11 @@ checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.12.2" version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d66674f2b6fb864665eea7a3c1ac4e3dfacd2fda83cf6f935a612e01b0e3338" checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19"
dependencies = [ dependencies = [
"base64 0.21.7", "base64 0.22.0",
"bytes", "bytes",
"futures-channel", "futures-channel",
"futures-core", "futures-core",
@ -2700,7 +2700,7 @@ dependencies = [
"percent-encoding", "percent-encoding",
"pin-project-lite", "pin-project-lite",
"rustls 0.22.3", "rustls 0.22.3",
"rustls-pemfile 1.0.4", "rustls-pemfile",
"rustls-pki-types", "rustls-pki-types",
"serde", "serde",
"serde_json", "serde_json",
@ -2846,28 +2846,19 @@ dependencies = [
[[package]] [[package]]
name = "rustls-pemfile" name = "rustls-pemfile"
version = "1.0.4" version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
dependencies = [ dependencies = [
"base64 0.21.7", "base64 0.22.0",
]
[[package]]
name = "rustls-pemfile"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab"
dependencies = [
"base64 0.21.7",
"rustls-pki-types", "rustls-pki-types",
] ]
[[package]] [[package]]
name = "rustls-pki-types" name = "rustls-pki-types"
version = "1.4.0" version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "868e20fada228fefaf6b652e00cc73623d54f8171e7352c18bb281571f2d92da" checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
@ -2934,7 +2925,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -3004,7 +2995,7 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -3391,9 +3382,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.11.0" version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]] [[package]]
name = "subtle" name = "subtle"
@ -3414,9 +3405,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.55" version = "2.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3431,9 +3422,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "sysinfo" name = "sysinfo"
version = "0.30.7" version = "0.30.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c385888ef380a852a16209afc8cfad22795dd8873d69c9a14d2e2088f118d18" checksum = "e9a84fe4cfc513b41cb2596b624e561ec9e7e1c4b46328e496ed56a53514ef2a"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"core-foundation-sys", "core-foundation-sys",
@ -3467,7 +3458,7 @@ dependencies = [
[[package]] [[package]]
name = "tests" name = "tests"
version = "0.21.0-beta1" version = "0.21.0-beta2"
dependencies = [ dependencies = [
"chrono", "chrono",
"crossbeam-channel", "crossbeam-channel",
@ -3507,7 +3498,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -3572,9 +3563,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.36.0" version = "1.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
@ -3597,7 +3588,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -3684,7 +3675,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -3876,7 +3867,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -3910,7 +3901,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -4134,9 +4125,9 @@ checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.50.0" version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-sys 0.48.0", "windows-sys 0.48.0",
@ -4159,7 +4150,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.55", "syn 2.0.58",
] ]
[[package]] [[package]]
@ -4196,27 +4187,27 @@ dependencies = [
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a"
dependencies = [ dependencies = [
"zstd-safe", "zstd-safe",
] ]
[[package]] [[package]]
name = "zstd-safe" name = "zstd-safe"
version = "7.0.0" version = "7.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a"
dependencies = [ dependencies = [
"zstd-sys", "zstd-sys",
] ]
[[package]] [[package]]
name = "zstd-sys" name = "zstd-sys"
version = "2.0.9+zstd.1.5.5" version = "2.0.10+zstd.1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa"
dependencies = [ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",

View File

@ -4,7 +4,7 @@ default-members = ["ffplayout-api", "ffplayout-engine", "tests"]
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
version = "0.21.0-beta1" version = "0.21.0-beta2"
license = "GPL-3.0" license = "GPL-3.0"
repository = "https://github.com/ffplayout/ffplayout" repository = "https://github.com/ffplayout/ffplayout"
authors = ["Jonathan Baecker <jonbae77@gmail.com>"] authors = ["Jonathan Baecker <jonbae77@gmail.com>"]

View File

@ -37,6 +37,8 @@ logging:
'ffmpeg_level/ingest_level' can be info, warning, error. 'ffmpeg_level/ingest_level' can be info, warning, error.
'detect_silence' logs an error message if the audio line is silent for 15 'detect_silence' logs an error message if the audio line is silent for 15
seconds during the validation process. seconds during the validation process.
'ignore_lines' makes logging to ignore strings that contains matched lines,
in frontend is a semicolon separated list.
log_to_file: true log_to_file: true
backup_count: 7 backup_count: 7
local_time: true local_time: true
@ -46,6 +48,12 @@ logging:
ffmpeg_level: error ffmpeg_level: error
ingest_level: warning ingest_level: warning
detect_silence: false detect_silence: false
ignore_lines:
- P sub_mb_type 4 out of range at
- error while decoding MB
- negative number of zero coeffs at
- out of range intra chroma pred mode
- non-existing SPS 0 referenced in buffering period
processing: processing:
help_text: Default processing for all clips, to have them unique. Mode can be playlist help_text: Default processing for all clips, to have them unique. Mode can be playlist

View File

@ -1,5 +1,4 @@
use std::{ use std::{
fs,
io::Write, io::Write,
path::{Path, PathBuf}, path::{Path, PathBuf},
}; };
@ -12,6 +11,7 @@ use rand::{distributions::Alphanumeric, Rng};
use relative_path::RelativePath; use relative_path::RelativePath;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sqlx::{Pool, Sqlite}; use sqlx::{Pool, Sqlite};
use tokio::fs;
use simplelog::*; use simplelog::*;
@ -22,6 +22,7 @@ use ffplayout_lib::utils::{file_extension, MediaProbe};
pub struct PathObject { pub struct PathObject {
pub source: String, pub source: String,
parent: Option<String>, parent: Option<String>,
parent_folders: Option<Vec<String>>,
folders: Option<Vec<String>>, folders: Option<Vec<String>>,
files: Option<Vec<VideoFile>>, files: Option<Vec<VideoFile>>,
#[serde(default)] #[serde(default)]
@ -33,6 +34,7 @@ impl PathObject {
Self { Self {
source, source,
parent, parent,
parent_folders: Some(vec![]),
folders: Some(vec![]), folders: Some(vec![]),
files: Some(vec![]), files: Some(vec![]),
folders_only: false, folders_only: false,
@ -108,59 +110,98 @@ pub async fn browser(
.split(',') .split(',')
.map(|e| e.to_string()) .map(|e| e.to_string())
.collect::<Vec<String>>(); .collect::<Vec<String>>();
let mut parent_folders = vec![];
let mut extensions = config.storage.extensions; let mut extensions = config.storage.extensions;
extensions.append(&mut channel_extensions); extensions.append(&mut channel_extensions);
let (path, parent, path_component) = norm_abs_path(&config.storage.path, &path_obj.source); let (path, parent, path_component) = norm_abs_path(&config.storage.path, &path_obj.source);
let parent_path = if !path_component.is_empty() {
path.parent().unwrap()
} else {
&config.storage.path
};
let mut obj = PathObject::new(path_component, Some(parent)); let mut obj = PathObject::new(path_component, Some(parent));
obj.folders_only = path_obj.folders_only; obj.folders_only = path_obj.folders_only;
let mut paths: Vec<PathBuf> = match fs::read_dir(path) { if path != parent_path && !path_obj.folders_only {
Ok(p) => p.filter_map(|r| r.ok()).map(|p| p.path()).collect(), let mut parents = fs::read_dir(&parent_path).await?;
Err(e) => {
error!("{e} in {}", path_obj.source); while let Some(child) = parents.next_entry().await? {
return Err(ServiceError::NoContent(e.to_string())); if child.metadata().await?.is_dir() {
} parent_folders.push(
}; child
.path()
.file_name()
.unwrap()
.to_string_lossy()
.to_string(),
);
}
}
parent_folders.path_sort(natural_lexical_cmp);
obj.parent_folders = Some(parent_folders);
}
let mut paths_obj = fs::read_dir(path).await?;
paths.path_sort(natural_lexical_cmp);
let mut files = vec![]; let mut files = vec![];
let mut folders = vec![]; let mut folders = vec![];
for path in paths { while let Some(child) = paths_obj.next_entry().await? {
let f_meta = child.metadata().await?;
// ignore hidden files/folders on unix // ignore hidden files/folders on unix
if path.display().to_string().contains("/.") { if child.path().to_string_lossy().to_string().contains("/.") {
continue; continue;
} }
if path.is_dir() { if f_meta.is_dir() {
folders.push(path.file_name().unwrap().to_string_lossy().to_string()); folders.push(
} else if path.is_file() && !path_obj.folders_only { child
if let Some(ext) = file_extension(&path) { .path()
.file_name()
.unwrap()
.to_string_lossy()
.to_string(),
);
} else if f_meta.is_file() && !path_obj.folders_only {
if let Some(ext) = file_extension(&child.path()) {
if extensions.contains(&ext.to_string().to_lowercase()) { if extensions.contains(&ext.to_string().to_lowercase()) {
match MediaProbe::new(&path.display().to_string()) { files.push(child.path())
Ok(probe) => {
let mut duration = 0.0;
if let Some(dur) = probe.format.duration {
duration = dur.parse().unwrap_or_default()
}
let video = VideoFile {
name: path.file_name().unwrap().to_string_lossy().to_string(),
duration,
};
files.push(video);
}
Err(e) => error!("{e:?}"),
};
} }
} }
} }
} }
folders.path_sort(natural_lexical_cmp);
files.path_sort(natural_lexical_cmp);
let mut media_files = vec![];
for file in files {
match MediaProbe::new(file.to_string_lossy().as_ref()) {
Ok(probe) => {
let mut duration = 0.0;
if let Some(dur) = probe.format.duration {
duration = dur.parse().unwrap_or_default()
}
let video = VideoFile {
name: file.file_name().unwrap().to_string_lossy().to_string(),
duration,
};
media_files.push(video);
}
Err(e) => error!("{e:?}"),
};
}
obj.folders = Some(folders); obj.folders = Some(folders);
obj.files = Some(files); obj.files = Some(media_files);
Ok(obj) Ok(obj)
} }
@ -173,36 +214,50 @@ pub async fn create_directory(
let (config, _) = playout_config(conn, &id).await?; let (config, _) = playout_config(conn, &id).await?;
let (path, _, _) = norm_abs_path(&config.storage.path, &path_obj.source); let (path, _, _) = norm_abs_path(&config.storage.path, &path_obj.source);
if let Err(e) = fs::create_dir_all(&path) { if let Err(e) = fs::create_dir_all(&path).await {
return Err(ServiceError::BadRequest(e.to_string())); return Err(ServiceError::BadRequest(e.to_string()));
} }
info!("create folder: <b><magenta>{}</></b>", path.display()); info!(
"create folder: <b><magenta>{}</></b>",
path.to_string_lossy()
);
Ok(HttpResponse::Ok().into()) Ok(HttpResponse::Ok().into())
} }
// fn copy_and_delete(source: &PathBuf, target: &PathBuf) -> Result<PathObject, ServiceError> { async fn copy_and_delete(source: &PathBuf, target: &PathBuf) -> Result<MoveObject, ServiceError> {
// match fs::copy(&source, &target) { match fs::copy(&source, &target).await {
// Ok(_) => { Ok(_) => {
// if let Err(e) = fs::remove_file(source) { if let Err(e) = fs::remove_file(source).await {
// error!("{e}"); error!("{e}");
// return Err(ServiceError::BadRequest( return Err(ServiceError::BadRequest(
// "Removing File not possible!".into(), "Removing File not possible!".into(),
// )); ));
// }; };
// return Ok(PathObject::new(target.display().to_string())); return Ok(MoveObject {
// } source: source
// Err(e) => { .file_name()
// error!("{e}"); .unwrap_or_default()
// Err(ServiceError::BadRequest("Error in file copy!".into())) .to_string_lossy()
// } .to_string(),
// } target: target
// } .file_name()
.unwrap_or_default()
.to_string_lossy()
.to_string(),
});
}
Err(e) => {
error!("{e}");
Err(ServiceError::BadRequest("Error in file copy!".into()))
}
}
}
fn rename(source: &PathBuf, target: &PathBuf) -> Result<MoveObject, ServiceError> { async fn rename(source: &PathBuf, target: &PathBuf) -> Result<MoveObject, ServiceError> {
match fs::rename(source, target) { match fs::rename(source, target).await {
Ok(_) => Ok(MoveObject { Ok(_) => Ok(MoveObject {
source: source source: source
.file_name() .file_name()
@ -217,7 +272,7 @@ fn rename(source: &PathBuf, target: &PathBuf) -> Result<MoveObject, ServiceError
}), }),
Err(e) => { Err(e) => {
error!("{e}"); error!("{e}");
Err(ServiceError::BadRequest("Rename failed!".into())) copy_and_delete(source, target).await
} }
} }
} }
@ -237,7 +292,7 @@ pub async fn rename_file(
if (source_path.is_dir() || source_path.is_file()) && source_path.parent() == Some(&target_path) if (source_path.is_dir() || source_path.is_file()) && source_path.parent() == Some(&target_path)
{ {
return rename(&source_path, &target_path); return rename(&source_path, &target_path).await;
} }
if target_path.is_dir() { if target_path.is_dir() {
@ -251,7 +306,7 @@ pub async fn rename_file(
} }
if source_path.is_file() && target_path.parent().is_some() { if source_path.is_file() && target_path.parent().is_some() {
return rename(&source_path, &target_path); return rename(&source_path, &target_path).await;
} }
Err(ServiceError::InternalServerError) Err(ServiceError::InternalServerError)
@ -270,7 +325,7 @@ pub async fn remove_file_or_folder(
} }
if source.is_dir() { if source.is_dir() {
match fs::remove_dir(source) { match fs::remove_dir(source).await {
Ok(_) => return Ok(()), Ok(_) => return Ok(()),
Err(e) => { Err(e) => {
error!("{e}"); error!("{e}");
@ -282,7 +337,7 @@ pub async fn remove_file_or_folder(
} }
if source.is_file() { if source.is_file() {
match fs::remove_file(source) { match fs::remove_file(source).await {
Ok(_) => return Ok(()), Ok(_) => return Ok(()),
Err(e) => { Err(e) => {
error!("{e}"); error!("{e}");

View File

@ -19,13 +19,16 @@ use ffplayout_lib::{
fn server_monitor( fn server_monitor(
level: &str, level: &str,
ignore: Vec<String>,
buffer: BufReader<ChildStderr>, buffer: BufReader<ChildStderr>,
proc_ctl: ProcessControl, proc_ctl: ProcessControl,
) -> Result<(), Error> { ) -> Result<(), Error> {
for line in buffer.lines() { for line in buffer.lines() {
let line = line?; let line = line?;
if !FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i)) { if !FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i))
&& !ignore.iter().any(|i| line.contains(i))
{
log_line(&line, level); log_line(&line, level);
} }
@ -95,6 +98,7 @@ pub fn ingest_server(
while !proc_control.is_terminated.load(Ordering::SeqCst) { while !proc_control.is_terminated.load(Ordering::SeqCst) {
let proc_ctl = proc_control.clone(); let proc_ctl = proc_control.clone();
let level = config.logging.ingest_level.clone().unwrap(); let level = config.logging.ingest_level.clone().unwrap();
let ignore = config.logging.ignore_lines.clone();
let mut server_proc = match Command::new("ffmpeg") let mut server_proc = match Command::new("ffmpeg")
.args(server_cmd.clone()) .args(server_cmd.clone())
.stdout(Stdio::piped()) .stdout(Stdio::piped())
@ -110,7 +114,7 @@ pub fn ingest_server(
let mut ingest_reader = BufReader::new(server_proc.stdout.take().unwrap()); let mut ingest_reader = BufReader::new(server_proc.stdout.take().unwrap());
let server_err = BufReader::new(server_proc.stderr.take().unwrap()); let server_err = BufReader::new(server_proc.stderr.take().unwrap());
let error_reader_thread = let error_reader_thread =
thread::spawn(move || server_monitor(&level, server_err, proc_ctl)); thread::spawn(move || server_monitor(&level, ignore, server_err, proc_ctl));
*proc_control.server_term.lock().unwrap() = Some(server_proc); *proc_control.server_term.lock().unwrap() = Some(server_proc);
is_running = false; is_running = false;

View File

@ -166,6 +166,7 @@ pub fn write_hls(
for node in get_source { for node in get_source {
*player_control.current_media.lock().unwrap() = Some(node.clone()); *player_control.current_media.lock().unwrap() = Some(node.clone());
let ignore = config.logging.ignore_lines.clone();
let mut cmd = match &node.cmd { let mut cmd = match &node.cmd {
Some(cmd) => cmd.clone(), Some(cmd) => cmd.clone(),
@ -247,7 +248,7 @@ pub fn write_hls(
let enc_err = BufReader::new(dec_proc.stderr.take().unwrap()); let enc_err = BufReader::new(dec_proc.stderr.take().unwrap());
*proc_control.decoder_term.lock().unwrap() = Some(dec_proc); *proc_control.decoder_term.lock().unwrap() = Some(dec_proc);
if let Err(e) = stderr_reader(enc_err, Decoder, proc_control.clone()) { if let Err(e) = stderr_reader(enc_err, ignore, Decoder, proc_control.clone()) {
error!("{e:?}") error!("{e:?}")
}; };

View File

@ -45,6 +45,7 @@ pub fn player(
) { ) {
let config_clone = config.clone(); let config_clone = config.clone();
let ff_log_format = format!("level+{}", config.logging.ffmpeg_level.to_lowercase()); let ff_log_format = format!("level+{}", config.logging.ffmpeg_level.to_lowercase());
let ignore_enc = config.logging.ignore_lines.clone();
let mut buffer = [0; 65088]; let mut buffer = [0; 65088];
let mut live_on = false; let mut live_on = false;
let playlist_init = playout_stat.list_init.clone(); let playlist_init = playout_stat.list_init.clone();
@ -73,7 +74,8 @@ pub fn player(
let enc_p_ctl = proc_control.clone(); let enc_p_ctl = proc_control.clone();
// spawn a thread to log ffmpeg output error messages // spawn a thread to log ffmpeg output error messages
let error_encoder_thread = thread::spawn(move || stderr_reader(enc_err, Encoder, enc_p_ctl)); let error_encoder_thread =
thread::spawn(move || stderr_reader(enc_err, ignore_enc, Encoder, enc_p_ctl));
let proc_control_c = proc_control.clone(); let proc_control_c = proc_control.clone();
let mut ingest_receiver = None; let mut ingest_receiver = None;
@ -87,6 +89,7 @@ pub fn player(
'source_iter: for node in node_sources { 'source_iter: for node in node_sources {
*play_control.current_media.lock().unwrap() = Some(node.clone()); *play_control.current_media.lock().unwrap() = Some(node.clone());
let ignore_dec = config.logging.ignore_lines.clone();
if proc_control.is_terminated.load(Ordering::SeqCst) { if proc_control.is_terminated.load(Ordering::SeqCst) {
debug!("Playout is terminated, break out from source loop"); debug!("Playout is terminated, break out from source loop");
@ -185,7 +188,7 @@ pub fn player(
let dec_p_ctl = proc_control.clone(); let dec_p_ctl = proc_control.clone();
let error_decoder_thread = let error_decoder_thread =
thread::spawn(move || stderr_reader(dec_err, Decoder, dec_p_ctl)); thread::spawn(move || stderr_reader(dec_err, ignore_dec, Decoder, dec_p_ctl));
loop { loop {
// when server is running, read from it // when server is running, read from it

@ -1 +1 @@
Subproject commit 3802e75c461eeea0febf20c1ea2c97cb89dd8d41 Subproject commit 601f2c8022233bfdf6bf145c36f51ee62a827e2b

View File

@ -12,7 +12,7 @@ edition.workspace = true
chrono = { version = "0.4", default-features = false, features = ["clock", "serde", "std"] } chrono = { version = "0.4", default-features = false, features = ["clock", "serde", "std"] }
crossbeam-channel = "0.5" crossbeam-channel = "0.5"
derive_more = "0.99" derive_more = "0.99"
ffprobe = "0.3" ffprobe = "0.4"
file-rotate = "0.7" file-rotate = "0.7"
lazy_static = "1.4" lazy_static = "1.4"
lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport"], default-features = false } lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport"], default-features = false }

View File

@ -229,6 +229,8 @@ pub struct Logging {
pub ingest_level: Option<String>, pub ingest_level: Option<String>,
#[serde(default)] #[serde(default)]
pub detect_silence: bool, pub detect_silence: bool,
#[serde(default)]
pub ignore_lines: Vec<String>,
} }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]

View File

@ -95,6 +95,7 @@ fn check_media(
let line = line?; let line = line?;
if !FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i)) if !FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i))
&& !config.logging.ignore_lines.iter().any(|i| line.contains(i))
&& (line.contains("[error]") || line.contains("[fatal]")) && (line.contains("[error]") || line.contains("[fatal]"))
{ {
let log_line = line.replace("[error] ", "").replace("[fatal] ", ""); let log_line = line.replace("[error] ", "").replace("[fatal] ", "");

View File

@ -682,13 +682,16 @@ pub fn include_file_extension(config: &PlayoutConfig, file_path: &Path) -> bool
/// and log the output. /// and log the output.
pub fn stderr_reader( pub fn stderr_reader(
buffer: BufReader<ChildStderr>, buffer: BufReader<ChildStderr>,
ignore: Vec<String>,
suffix: ProcessUnit, suffix: ProcessUnit,
proc_control: ProcessControl, proc_control: ProcessControl,
) -> Result<(), Error> { ) -> Result<(), Error> {
for line in buffer.lines() { for line in buffer.lines() {
let line = line?; let line = line?;
if FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i)) { if FFMPEG_IGNORE_ERRORS.iter().any(|i| line.contains(*i))
|| ignore.iter().any(|i| line.contains(i))
{
continue; continue;
} }

View File

@ -14,7 +14,7 @@ ffplayout-lib = { path = "../lib" }
chrono = "0.4" chrono = "0.4"
crossbeam-channel = "0.5" crossbeam-channel = "0.5"
ffprobe = "0.3" ffprobe = "0.4"
file-rotate = "0.7.0" file-rotate = "0.7.0"
lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport"], default-features = false } lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport"], default-features = false }
log = "0.4" log = "0.4"