diff --git a/Cargo.lock b/Cargo.lock index 05799478..d1730c4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -113,7 +113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -151,7 +151,7 @@ dependencies = [ "parse-size", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -311,7 +311,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -386,7 +386,7 @@ checksum = "008f98f5a68eeacf5e6d44ed74ce03c1b906baa53eabfb41faf0f5f40bd685f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -561,7 +561,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -741,9 +741,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.13" +version = "1.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" +checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" dependencies = [ "jobserver", "libc", @@ -828,7 +828,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1009,7 +1009,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1020,7 +1020,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1067,7 +1067,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1087,7 +1087,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", "unicode-xid", ] @@ -1204,13 +1204,13 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "ffplayout" -version = "0.24.0-beta2" +version = "0.24.0-beta3" dependencies = [ "actix-files", "actix-multipart", @@ -1309,9 +1309,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", @@ -1319,9 +1319,9 @@ dependencies = [ [[package]] name = "flexi_logger" -version = "0.28.5" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca927478b3747ba47f98af6ba0ac0daea4f12d12f55e9104071b3dc00276310" +checksum = "a250587a211932896a131f214a4f64c047b826ce072d2018764e5ff5141df8fa" dependencies = [ "chrono", "glob", @@ -1433,7 +1433,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -1955,9 +1955,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "cc", "pkg-config", @@ -2404,7 +2404,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -2479,7 +2479,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -2541,9 +2541,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2892,22 +2892,22 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -2934,9 +2934,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", @@ -3011,7 +3011,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -3036,7 +3036,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -3163,9 +3163,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" +checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3176,9 +3176,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" +checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08" dependencies = [ "atoi", "byteorder", @@ -3215,22 +3215,22 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" +checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] name = "sqlx-macros-core" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" +checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce" dependencies = [ "dotenvy", "either", @@ -3246,7 +3246,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.75", + "syn 2.0.76", "tempfile", "tokio", "url", @@ -3254,9 +3254,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" +checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12" dependencies = [ "atoi", "base64 0.22.1", @@ -3296,9 +3296,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" +checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710" dependencies = [ "atoi", "base64 0.22.1", @@ -3334,9 +3334,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" +checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e" dependencies = [ "atoi", "flume", @@ -3357,15 +3357,15 @@ dependencies = [ [[package]] name = "stacker" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a5daa25ea337c85ed954c0496e3bdd2c7308cc3b24cf7b50d04876654c579f" +checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" dependencies = [ "cc", "cfg-if", "libc", "psm", - "windows-sys 0.36.1", + "windows-sys 0.59.0", ] [[package]] @@ -3493,9 +3493,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.75" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", "quote", @@ -3513,9 +3513,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.31.2" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4115055da5f572fff541dd0c4e61b0262977f453cc9fe04be83aba25a89bdab" +checksum = "2b92e0bdf838cbc1c4c9ba14f9c97a7ec6cdcd1ae66b10e1e42775a25553f45d" dependencies = [ "core-foundation-sys", "libc", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "tests" -version = "0.24.0-beta2" +version = "0.24.0-beta3" dependencies = [ "actix-rt", "actix-test", @@ -3585,7 +3585,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -3660,7 +3660,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -3768,7 +3768,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -3985,7 +3985,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", "wasm-bindgen-shared", ] @@ -4019,7 +4019,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4129,7 +4129,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -4140,7 +4140,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] @@ -4182,19 +4182,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4265,12 +4252,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -4283,12 +4264,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4307,12 +4282,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4325,12 +4294,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4355,12 +4318,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4400,7 +4357,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.76", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0e53419f..8e3613cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ default-members = ["ffplayout", "tests"] resolver = "2" [workspace.package] -version = "0.24.0-beta2" +version = "0.24.0-beta3" license = "GPL-3.0" repository = "https://github.com/ffplayout/ffplayout" authors = ["Jonathan Baecker "] diff --git a/ffplayout/Cargo.toml b/ffplayout/Cargo.toml index b9e5933b..42aa9ce5 100644 --- a/ffplayout/Cargo.toml +++ b/ffplayout/Cargo.toml @@ -27,7 +27,7 @@ crossbeam-channel = "0.5" derive_more = { version = "1", features = ["display"] } faccess = "0.2" ffprobe = "0.4" -flexi_logger = { version = "0.28", features = ["kv", "colors"] } +flexi_logger = { version = "0.29", features = ["kv", "colors"] } futures-util = { version = "0.3", default-features = false, features = ["std"] } home = "0.5" jsonwebtoken = "9" diff --git a/ffplayout/src/api/routes.rs b/ffplayout/src/api/routes.rs index 3c184fc2..45855876 100644 --- a/ffplayout/src/api/routes.rs +++ b/ffplayout/src/api/routes.rs @@ -670,7 +670,7 @@ async fn update_playout_config( /// **Get all Presets** /// /// ```BASH -/// curl -X GET http://127.0.0.1:8787/api/presets/ -H 'Content-Type: application/json' \ +/// curl -X GET http://127.0.0.1:8787/api/presets/1 -H 'Content-Type: application/json' \ /// -H 'Authorization: Bearer ' /// ``` #[get("/presets/{id}")] @@ -699,19 +699,21 @@ async fn get_presets( /// -d '{ "name": "", "text": "", "x": "", "y": "", "fontsize": 24, "line_spacing": 4, "fontcolor": "#ffffff", "box": 1, "boxcolor": "#000000", "boxborderw": 4, "alpha": 1.0, "channel_id": 1 }' \ /// -H 'Authorization: Bearer ' /// ``` -#[put("/presets/{id}")] +#[put("/presets/{channel}/{id}")] #[protect( any("Role::GlobalAdmin", "Role::ChannelAdmin", "Role::User"), ty = "Role", - expr = "user.channels.contains(&*id) || role.has_authority(&Role::GlobalAdmin)" + expr = "user.channels.contains(&path.0) || role.has_authority(&Role::GlobalAdmin)" )] async fn update_preset( pool: web::Data>, - id: web::Path, + path: web::Path<(i32, i32)>, data: web::Json, role: AuthDetails, user: web::ReqData, ) -> Result { + let (_, id) = path.into_inner(); + if handles::update_preset(&pool, &id, data.into_inner()) .await .is_ok() @@ -755,21 +757,23 @@ async fn add_preset( /// **Delete Preset** /// /// ```BASH -/// curl -X DELETE http://127.0.0.1:8787/api/presets/1 -H 'Content-Type: application/json' \ +/// curl -X DELETE http://127.0.0.1:8787/api/presets/1/1 -H 'Content-Type: application/json' \ /// -H 'Authorization: Bearer ' /// ``` -#[delete("/presets/{id}")] +#[delete("/presets/{channel}/{id}")] #[protect( any("Role::GlobalAdmin", "Role::ChannelAdmin", "Role::User"), ty = "Role", - expr = "user.channels.contains(&*id) || role.has_authority(&Role::GlobalAdmin)" + expr = "user.channels.contains(&path.0) || role.has_authority(&Role::GlobalAdmin)" )] async fn delete_preset( pool: web::Data>, - id: web::Path, + path: web::Path<(i32, i32)>, role: AuthDetails, user: web::ReqData, ) -> Result { + let (_, id) = path.into_inner(); + if handles::delete_preset(&pool, &id).await.is_ok() { return Ok("Delete preset Success"); } @@ -928,6 +932,7 @@ pub async fn process_control( manager.async_start().await; } ProcessCtl::Stop => { + manager.channel.lock().unwrap().active = false; manager.async_stop().await; } ProcessCtl::Restart => { diff --git a/ffplayout/src/db/handles.rs b/ffplayout/src/db/handles.rs index 713c5f7f..d74e9270 100644 --- a/ffplayout/src/db/handles.rs +++ b/ffplayout/src/db/handles.rs @@ -11,10 +11,8 @@ use super::models::{AdvancedConfiguration, Configuration}; use crate::db::models::{Channel, GlobalSettings, Role, TextPreset, User}; use crate::utils::{advanced_config::AdvancedConfig, config::PlayoutConfig, local_utc_offset}; -pub async fn db_migrate(conn: &Pool) -> Result<&'static str, Box> { - if let Err(e) = sqlx::migrate!("../migrations").run(conn).await { - panic!("{e}"); - } +pub async fn db_migrate(conn: &Pool) -> Result<(), Box> { + sqlx::migrate!("../migrations").run(conn).await?; if select_global(conn).await.is_err() { let secret: String = rand::thread_rng() @@ -34,7 +32,7 @@ pub async fn db_migrate(conn: &Pool) -> Result<&'static str, Box) -> Result { @@ -487,6 +485,19 @@ pub async fn insert_preset( .await } +pub async fn new_channel_presets( + conn: &Pool, + channel_id: i32, +) -> Result { + let query = "INSERT INTO presets (name, text, x, y, fontsize, line_spacing, fontcolor, box, boxcolor, boxborderw, alpha, channel_id) + VALUES ('Default', 'Wellcome to ffplayout messenger!', '(w-text_w)/2', '(h-text_h)/2', '24', '4', '#ffffff@0xff', '0', '#000000@0x80', '4', '1.0', $1), + ('Empty Text', '', '0', '0', '24', '4', '#000000', '0', '#000000', '0', '0', $1), + ('Bottom Text fade in', 'The upcoming event will be delayed by a few minutes.', '(w-text_w)/2', '(h-line_h)*0.9', '24', '4', '#ffffff', '1', '#000000@0x80', '4', 'ifnot(ld(1),st(1,t));if(lt(t,ld(1)+1),0,if(lt(t,ld(1)+2),(t-(ld(1)+1))/1,if(lt(t,ld(1)+8),1,if(lt(t,ld(1)+9),(1-(t-(ld(1)+8)))/1,0))))', $1), + ('Scrolling Text', 'We have a very important announcement to make.', 'ifnot(ld(1),st(1,t));if(lt(t,ld(1)+1),w+4,w-w/12*mod(t-ld(1),12*(w+tw)/w))', '(h-line_h)*0.9', '24', '4', '#ffffff', '1', '#000000@0x80', '4', '1.0', $1);"; + + sqlx::query(query).bind(channel_id).execute(conn).await +} + pub async fn delete_preset( conn: &Pool, id: &i32, diff --git a/ffplayout/src/main.rs b/ffplayout/src/main.rs index 1f494ba4..41faf79e 100644 --- a/ffplayout/src/main.rs +++ b/ffplayout/src/main.rs @@ -274,8 +274,9 @@ async fn main() -> std::io::Result<()> { } } - for channel in &channel_controllers.lock().unwrap().channels { - channel.stop_all(); + for channel_ctl in &channel_controllers.lock().unwrap().channels { + channel_ctl.channel.lock().unwrap().active = false; + channel_ctl.stop_all(); } Ok(()) diff --git a/ffplayout/src/player/controller.rs b/ffplayout/src/player/controller.rs index a8507e43..b5567061 100644 --- a/ffplayout/src/player/controller.rs +++ b/ffplayout/src/player/controller.rs @@ -7,6 +7,7 @@ use std::{ Arc, Mutex, }, thread, + time::Duration, }; #[cfg(not(windows))] @@ -129,12 +130,31 @@ impl ChannelManager { }; thread::spawn(move || { - let run_count = self_clone.run_count.clone(); + let mut run_endless = true; - if let Err(e) = start_channel(self_clone) { - run_count.fetch_sub(1, Ordering::SeqCst); - error!("{e}"); - }; + while run_endless { + let run_count = self_clone.run_count.clone(); + + if let Err(e) = start_channel(self_clone.clone()) { + run_count.fetch_sub(1, Ordering::SeqCst); + error!("{e}"); + }; + + let active = self_clone.channel.lock().unwrap().active; + + if !active { + run_endless = false; + } else { + self_clone.run_count.fetch_add(1, Ordering::SeqCst); + self_clone.is_alive.store(true, Ordering::SeqCst); + self_clone.is_terminated.store(false, Ordering::SeqCst); + self_clone.list_init.store(true, Ordering::SeqCst); + + thread::sleep(Duration::from_millis(250)); + } + } + + trace!("Async start done"); }); } } @@ -179,8 +199,6 @@ impl ChannelManager { } pub fn stop(&self, unit: ProcessUnit) -> Result<(), ProcessError> { - let mut channel = self.channel.lock()?; - match unit { Decoder => { if let Some(proc) = self.decoder.lock()?.as_mut() { @@ -207,8 +225,6 @@ impl ChannelManager { } } - channel.active = false; - self.wait(unit)?; Ok(()) diff --git a/ffplayout/src/player/input/ingest.rs b/ffplayout/src/player/input/ingest.rs index a574cab9..1008515c 100644 --- a/ffplayout/src/player/input/ingest.rs +++ b/ffplayout/src/player/input/ingest.rs @@ -47,6 +47,7 @@ fn server_monitor( .iter() .any(|i| line.contains(*i)) { + channel_mgr.channel.lock().unwrap().active = false; channel_mgr.stop_all(); } } @@ -91,6 +92,7 @@ pub fn ingest_server( if let Some(url) = stream_input.iter().find(|s| s.contains("://")) { if !test_tcp_port(id, url) { + channel_mgr.channel.lock().unwrap().active = false; channel_mgr.stop_all(); } diff --git a/ffplayout/src/player/output/hls.rs b/ffplayout/src/player/output/hls.rs index 3621b7f7..66761965 100644 --- a/ffplayout/src/player/output/hls.rs +++ b/ffplayout/src/player/output/hls.rs @@ -66,6 +66,7 @@ fn ingest_to_hls_server(manager: ChannelManager) -> Result<(), ProcessError> { if let Some(url) = stream_input.iter().find(|s| s.contains("://")) { if !test_tcp_port(id, url) { + manager.channel.lock().unwrap().active = false; manager.stop_all(); } diff --git a/ffplayout/src/player/utils/mod.rs b/ffplayout/src/player/utils/mod.rs index 89ea3704..3766074e 100644 --- a/ffplayout/src/player/utils/mod.rs +++ b/ffplayout/src/player/utils/mod.rs @@ -811,6 +811,7 @@ pub fn stderr_reader( || (line.contains("No such file or directory") && !line.contains("failed to delete old segment")) { + manager.channel.lock().unwrap().active = false; manager.stop_all(); } } diff --git a/ffplayout/src/utils/args_parse.rs b/ffplayout/src/utils/args_parse.rs index 8f1bd9c6..7b9fc043 100644 --- a/ffplayout/src/utils/args_parse.rs +++ b/ffplayout/src/utils/args_parse.rs @@ -104,8 +104,8 @@ pub struct Args { )] pub generate: Option>, - #[clap(long, help = "Optional folder path list for playlist generations", num_args = 1..)] - pub gen_paths: Option>, + #[clap(long, help = "Optional path list for playlist generations", num_args = 1..)] + pub paths: Option>, #[clap(long, env, help = "Keep log file for given days")] pub log_backup_count: Option, @@ -206,7 +206,7 @@ fn global_user(args: &mut Args) { pub async fn run_args(pool: &Pool) -> Result<(), i32> { let mut args = ARGS.clone(); - if args.dump_advanced.is_none() && args.dump_config.is_none() { + if args.dump_advanced.is_none() && args.dump_config.is_none() && !args.drop_db { if let Err(e) = handles::db_migrate(pool).await { panic!("{e}"); }; diff --git a/ffplayout/src/utils/channels.rs b/ffplayout/src/utils/channels.rs index 696e047f..ac48a924 100644 --- a/ffplayout/src/utils/channels.rs +++ b/ffplayout/src/utils/channels.rs @@ -63,6 +63,7 @@ pub async fn create_channel( ) -> Result { let global = handles::select_global(conn).await?; let mut channel = handles::insert_channel(conn, target_channel).await?; + handles::new_channel_presets(conn, channel.id).await?; channel.preview_url = preview_url(&channel.preview_url, channel.id); diff --git a/ffplayout/src/utils/config.rs b/ffplayout/src/utils/config.rs index fe8b6027..1a3b07d5 100644 --- a/ffplayout/src/utils/config.rs +++ b/ffplayout/src/utils/config.rs @@ -843,7 +843,7 @@ pub async fn get_config(pool: &Pool, channel_id: i32) -> Result { + manager.channel.lock().unwrap().active = false; manager.stop_all(); let mut data_map = Map::new(); diff --git a/ffplayout/src/utils/logging.rs b/ffplayout/src/utils/logging.rs index 3ba38d6f..f58d3b7d 100644 --- a/ffplayout/src/utils/logging.rs +++ b/ffplayout/src/utils/logging.rs @@ -30,7 +30,11 @@ pub struct Target; impl Target { pub fn all() -> &'static str { - "{file,mail,_Default}" + if ARGS.log_to_console { + "{_Default}" + } else { + "{file,mail,_Default}" + } } pub fn console() -> &'static str { diff --git a/frontend b/frontend index 0b1e083c..8d8ab58e 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit 0b1e083ce5b1818589b899d2fe0cc04f4100df32 +Subproject commit 8d8ab58ef43d450968a3e4fa23f1141c77a31b88 diff --git a/migrations/00001_create_tables.sql b/migrations/00001_create_tables.sql index 25f3a83b..72f64562 100644 --- a/migrations/00001_create_tables.sql +++ b/migrations/00001_create_tables.sql @@ -49,8 +49,7 @@ CREATE TABLE boxborderw TEXT NOT NULL, alpha TEXT NOT NULL, channel_id INTEGER NOT NULL DEFAULT 1, - FOREIGN KEY (channel_id) REFERENCES channels (id) ON UPDATE CASCADE ON DELETE CASCADE, - UNIQUE (name) + FOREIGN KEY (channel_id) REFERENCES channels (id) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE diff --git a/tests/src/engine_playlist.rs b/tests/src/engine_playlist.rs index b5ea36cf..3bd603e8 100644 --- a/tests/src/engine_playlist.rs +++ b/tests/src/engine_playlist.rs @@ -49,6 +49,7 @@ fn timed_stop(sec: u64, manager: ChannelManager) { println!("Timed stop of process"); + manager.channel.lock().unwrap().active = false; manager.stop_all(); }