remove signal term, scroll down on logs, scroll to item on playlist generation
This commit is contained in:
parent
627f02d5f2
commit
144799e722
49
Cargo.lock
generated
49
Cargo.lock
generated
@ -341,9 +341,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "actix-web-lab"
|
name = "actix-web-lab"
|
||||||
version = "0.22.0"
|
version = "0.23.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2a965e3e826aa4737af33666aa09ed949aa1837706fda2adee07039347be50d6"
|
checksum = "ee75923689132fc5fb57ccc5bb98d25bb214796a29cd505844eb3b42daf11df0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-http",
|
"actix-http",
|
||||||
"actix-router",
|
"actix-router",
|
||||||
@ -366,7 +366,6 @@ dependencies = [
|
|||||||
"local-channel",
|
"local-channel",
|
||||||
"mediatype",
|
"mediatype",
|
||||||
"mime",
|
"mime",
|
||||||
"once_cell",
|
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"regex",
|
"regex",
|
||||||
"serde",
|
"serde",
|
||||||
@ -380,9 +379,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "actix-web-lab-derive"
|
name = "actix-web-lab-derive"
|
||||||
version = "0.22.0"
|
version = "0.23.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "008f98f5a68eeacf5e6d44ed74ce03c1b906baa53eabfb41faf0f5f40bd685f8"
|
checksum = "4c221da13534b9352f3f79fcbbd6095f6d8aee63bdf1da8a73d36f9eeea17d5a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -720,9 +719,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytes"
|
name = "bytes"
|
||||||
version = "1.7.2"
|
version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
|
checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytestring"
|
name = "bytestring"
|
||||||
@ -1233,7 +1232,6 @@ dependencies = [
|
|||||||
"ffprobe",
|
"ffprobe",
|
||||||
"flexi_logger",
|
"flexi_logger",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"home",
|
|
||||||
"jsonwebtoken",
|
"jsonwebtoken",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"lettre",
|
"lettre",
|
||||||
@ -1259,7 +1257,6 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_with",
|
"serde_with",
|
||||||
"shlex",
|
"shlex",
|
||||||
"signal-child",
|
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"static-files",
|
"static-files",
|
||||||
"sysinfo",
|
"sysinfo",
|
||||||
@ -1326,9 +1323,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flexi_logger"
|
name = "flexi_logger"
|
||||||
version = "0.29.3"
|
version = "0.29.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "719236bdbcf6033a3395165f797076b31056018e6723ccff616eb25fc9c99de1"
|
checksum = "0bc6a1594377eb9de4205e15e33e222c996de8dc047f7c998cc477030bfac48a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"log",
|
"log",
|
||||||
@ -2592,9 +2589,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.88"
|
version = "1.0.89"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
|
checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -3011,18 +3008,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.210"
|
version = "1.0.213"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.210"
|
version = "1.0.213"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -3186,12 +3183,6 @@ version = "1.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "signal-child"
|
|
||||||
version = "1.0.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a3184fa464a0128cbcc353100ae752a848bc0067dd5715a50550f31570051150"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook-registry"
|
name = "signal-hook-registry"
|
||||||
version = "1.4.2"
|
version = "1.4.2"
|
||||||
@ -3715,18 +3706,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "1.0.64"
|
version = "1.0.65"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84"
|
checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "1.0.64"
|
version = "1.0.65"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
|
checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -3791,9 +3782,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.40.0"
|
version = "1.41.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
|
checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
@ -18,7 +18,7 @@ actix-multipart = "0.7"
|
|||||||
actix-web = "4"
|
actix-web = "4"
|
||||||
actix-web-grants = "4"
|
actix-web-grants = "4"
|
||||||
actix-web-httpauth = "0.8"
|
actix-web-httpauth = "0.8"
|
||||||
actix-web-lab = "0.22"
|
actix-web-lab = "0.23"
|
||||||
actix-web-static-files = "4.0"
|
actix-web-static-files = "4.0"
|
||||||
argon2 = "0.5"
|
argon2 = "0.5"
|
||||||
chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] }
|
chrono = { version = "0.4", default-features = false, features = ["clock", "std", "serde"] }
|
||||||
@ -29,7 +29,6 @@ faccess = "0.2"
|
|||||||
ffprobe = "0.4"
|
ffprobe = "0.4"
|
||||||
flexi_logger = { version = "0.29", features = ["kv", "colors"] }
|
flexi_logger = { version = "0.29", features = ["kv", "colors"] }
|
||||||
futures-util = { version = "0.3", default-features = false, features = ["std"] }
|
futures-util = { version = "0.3", default-features = false, features = ["std"] }
|
||||||
home = "0.5"
|
|
||||||
jsonwebtoken = "9"
|
jsonwebtoken = "9"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport", "tokio1", "tokio1-rustls-tls"], default-features = false }
|
lettre = { version = "0.11", features = ["builder", "rustls-tls", "smtp-transport", "tokio1", "tokio1-rustls-tls"], default-features = false }
|
||||||
@ -70,9 +69,6 @@ zeromq = { version = "0.4", default-features = false, features = [
|
|||||||
"tcp-transport",
|
"tcp-transport",
|
||||||
] }
|
] }
|
||||||
|
|
||||||
[target.'cfg(not(target_arch = "windows"))'.dependencies]
|
|
||||||
signal-child = "1"
|
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
static-files = "0.2"
|
static-files = "0.2"
|
||||||
|
|
||||||
|
@ -984,10 +984,10 @@ pub async fn process_control(
|
|||||||
}
|
}
|
||||||
ProcessCtl::Stop => {
|
ProcessCtl::Stop => {
|
||||||
manager.channel.lock().unwrap().active = false;
|
manager.channel.lock().unwrap().active = false;
|
||||||
manager.async_stop().await;
|
manager.async_stop().await?;
|
||||||
}
|
}
|
||||||
ProcessCtl::Restart => {
|
ProcessCtl::Restart => {
|
||||||
manager.async_stop().await;
|
manager.async_stop().await?;
|
||||||
tokio::time::sleep(tokio::time::Duration::from_millis(1500)).await;
|
tokio::time::sleep(tokio::time::Duration::from_millis(1500)).await;
|
||||||
|
|
||||||
if !manager.is_alive.load(Ordering::SeqCst) {
|
if !manager.is_alive.load(Ordering::SeqCst) {
|
||||||
|
@ -11,9 +11,7 @@ use std::{
|
|||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
use actix_web::web;
|
||||||
use signal_child::Signalable;
|
|
||||||
|
|
||||||
use log::*;
|
use log::*;
|
||||||
use m3u8_rs::Playlist;
|
use m3u8_rs::Playlist;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -26,7 +24,7 @@ use crate::player::{
|
|||||||
};
|
};
|
||||||
use crate::utils::{
|
use crate::utils::{
|
||||||
config::{OutputMode::*, PlayoutConfig},
|
config::{OutputMode::*, PlayoutConfig},
|
||||||
errors::ProcessError,
|
errors::{ProcessError, ServiceError},
|
||||||
};
|
};
|
||||||
use crate::ARGS;
|
use crate::ARGS;
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -203,11 +201,6 @@ impl ChannelManager {
|
|||||||
match unit {
|
match unit {
|
||||||
Decoder => {
|
Decoder => {
|
||||||
if let Some(proc) = self.decoder.lock()?.as_mut() {
|
if let Some(proc) = self.decoder.lock()?.as_mut() {
|
||||||
#[cfg(not(windows))]
|
|
||||||
proc.term()
|
|
||||||
.map_err(|e| ProcessError::Custom(format!("Decoder: {e}")))?;
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
proc.kill()
|
proc.kill()
|
||||||
.map_err(|e| ProcessError::Custom(format!("Decoder: {e}")))?;
|
.map_err(|e| ProcessError::Custom(format!("Decoder: {e}")))?;
|
||||||
}
|
}
|
||||||
@ -258,7 +251,7 @@ impl ChannelManager {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn async_stop(&self) {
|
pub async fn async_stop(&self) -> Result<(), ServiceError> {
|
||||||
self.is_terminated.store(true, Ordering::SeqCst);
|
self.is_terminated.store(true, Ordering::SeqCst);
|
||||||
self.is_alive.store(false, Ordering::SeqCst);
|
self.is_alive.store(false, Ordering::SeqCst);
|
||||||
self.ingest_is_running.store(false, Ordering::SeqCst);
|
self.ingest_is_running.store(false, Ordering::SeqCst);
|
||||||
@ -272,12 +265,16 @@ impl ChannelManager {
|
|||||||
};
|
};
|
||||||
|
|
||||||
for unit in [Decoder, Encoder, Ingest] {
|
for unit in [Decoder, Encoder, Ingest] {
|
||||||
if let Err(e) = self.stop(unit) {
|
let self_clone = self.clone();
|
||||||
|
|
||||||
|
if let Err(e) = web::block(move || self_clone.stop(unit)).await? {
|
||||||
if !e.to_string().contains("exited process") {
|
if !e.to_string().contains("exited process") {
|
||||||
error!(target: Target::all(), channel = channel_id; "{e}")
|
error!(target: Target::all(), channel = channel_id; "{e}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// No matter what is running, terminate them all.
|
/// No matter what is running, terminate them all.
|
||||||
|
@ -420,6 +420,7 @@ async function generatePlaylist() {
|
|||||||
resetCheckboxes()
|
resetCheckboxes()
|
||||||
resetTemplate()
|
resetTemplate()
|
||||||
|
|
||||||
|
playlistStore.scrollToItem = true
|
||||||
playlistStore.isLoading = false
|
playlistStore.isLoading = false
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -140,7 +140,7 @@ const playlistContainer = ref()
|
|||||||
const sortContainer = ref()
|
const sortContainer = ref()
|
||||||
const todayDate = ref($dayjs().utcOffset(configStore.utcOffset).format('YYYY-MM-DD'))
|
const todayDate = ref($dayjs().utcOffset(configStore.utcOffset).format('YYYY-MM-DD'))
|
||||||
const { i } = storeToRefs(useConfig())
|
const { i } = storeToRefs(useConfig())
|
||||||
const { currentIndex, listDate, playoutIsRunning } = storeToRefs(usePlaylist())
|
const { currentIndex, listDate, playoutIsRunning, scrollToItem } = storeToRefs(usePlaylist())
|
||||||
|
|
||||||
const playlistSortOptions = {
|
const playlistSortOptions = {
|
||||||
group: 'playlist',
|
group: 'playlist',
|
||||||
@ -175,10 +175,14 @@ watch([listDate, i], () => {
|
|||||||
}, 800)
|
}, 800)
|
||||||
})
|
})
|
||||||
|
|
||||||
watch([playoutIsRunning], () => {
|
watch([playoutIsRunning, scrollToItem], () => {
|
||||||
setTimeout(() => {
|
if (playoutIsRunning.value || scrollToItem.value) {
|
||||||
scrollTo(currentIndex.value)
|
setTimeout(() => {
|
||||||
}, 400)
|
scrollTo(currentIndex.value)
|
||||||
|
|
||||||
|
scrollToItem.value = false
|
||||||
|
}, 400)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
|
@ -34,10 +34,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="px-3 inline-block h-[calc(100vh-140px)] text-[13px]">
|
<div class="px-3 inline-block h-[calc(100vh-140px)] text-[13px]">
|
||||||
<div
|
<div id="log-container" class="bg-base-300 whitespace-pre h-full font-mono overflow-auto p-3">
|
||||||
class="bg-base-300 whitespace-pre h-full font-mono overflow-auto p-3"
|
<div id="log-content" v-html="filterLogsBySeverity(formatLog(currentLog), errorLevel)" />
|
||||||
v-html="filterLogsBySeverity(formatLog(currentLog), errorLevel)"
|
</div>
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -88,7 +87,16 @@ watch([listDate, i], () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const calendarFormat = (date: Date) => {
|
const calendarFormat = (date: Date) => {
|
||||||
return $dayjs(date).locale(locale.value).format('ddd L')
|
return $dayjs(date).locale(locale.value).format('ddd L')
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollTo() {
|
||||||
|
const parent = document.getElementById('log-container')
|
||||||
|
const child = document.getElementById('log-content')
|
||||||
|
|
||||||
|
if (child && parent) {
|
||||||
|
parent.scrollTop = child.scrollHeight
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterLogsBySeverity(logString: string, minSeverity: string): string {
|
function filterLogsBySeverity(logString: string, minSeverity: string): string {
|
||||||
@ -121,6 +129,10 @@ async function getLog() {
|
|||||||
.then((response) => response.text())
|
.then((response) => response.text())
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
currentLog.value = data
|
currentLog.value = data
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
scrollTo()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
currentLog.value = ''
|
currentLog.value = ''
|
||||||
|
@ -330,14 +330,6 @@ useHead({
|
|||||||
title: `${t('button.media')} | ffplayout`,
|
title: `${t('button.media')} | ffplayout`,
|
||||||
})
|
})
|
||||||
|
|
||||||
watch([width], () => {
|
|
||||||
if (width.value < 640) {
|
|
||||||
horizontal.value = true
|
|
||||||
} else {
|
|
||||||
horizontal.value = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const horizontal = ref(false)
|
const horizontal = ref(false)
|
||||||
const deleteName = ref('')
|
const deleteName = ref('')
|
||||||
const recursive = ref(false)
|
const recursive = ref(false)
|
||||||
@ -384,6 +376,14 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch([width], () => {
|
||||||
|
if (width.value < 640) {
|
||||||
|
horizontal.value = true
|
||||||
|
} else {
|
||||||
|
horizontal.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
watch([i], () => {
|
watch([i], () => {
|
||||||
mediaStore.getTree('')
|
mediaStore.getTree('')
|
||||||
})
|
})
|
||||||
|
@ -24,6 +24,7 @@ export const usePlaylist = defineStore('playlist', {
|
|||||||
playoutIsRunning: false,
|
playoutIsRunning: false,
|
||||||
last_channel: 0,
|
last_channel: 0,
|
||||||
firstLoad: true,
|
firstLoad: true,
|
||||||
|
scrollToItem: false,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
getters: {},
|
getters: {},
|
||||||
|
Loading…
Reference in New Issue
Block a user