commit
1cb9e78b11
187
Cargo.lock
generated
187
Cargo.lock
generated
@ -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",
|
||||||
|
@ -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>"]
|
||||||
|
@ -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
|
||||||
|
@ -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}");
|
||||||
|
@ -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;
|
||||||
|
@ -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:?}")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
@ -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 }
|
||||||
|
@ -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)]
|
||||||
|
@ -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] ", "");
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user