unify code

This commit is contained in:
jb-alvarado 2022-02-27 22:15:49 +01:00
parent 3c91b8f7fe
commit e1167f407b
9 changed files with 464 additions and 261 deletions

358
Cargo.lock generated
View File

@ -25,7 +25,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi",
"libc",
"winapi 0.3.9",
"winapi",
]
[[package]]
@ -41,10 +41,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cfg-if"
version = "0.1.10"
name = "bytes"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
[[package]]
name = "cfg-if"
@ -62,7 +62,7 @@ dependencies = [
"num-integer",
"num-traits",
"time",
"winapi 0.3.9",
"winapi",
]
[[package]]
@ -101,7 +101,27 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
dependencies = [
"cfg-if 1.0.0",
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6"
dependencies = [
"cfg-if",
"lazy_static",
]
[[package]]
@ -120,6 +140,7 @@ dependencies = [
"serde_json",
"serde_yaml",
"simplelog",
"tokio",
"walkdir",
]
@ -149,10 +170,10 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98"
dependencies = [
"cfg-if 1.0.0",
"cfg-if",
"libc",
"redox_syscall",
"winapi 0.3.9",
"winapi",
]
[[package]]
@ -161,54 +182,28 @@ version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f"
dependencies = [
"cfg-if 1.0.0",
"cfg-if",
"crc32fast",
"libc",
"miniz_oxide",
]
[[package]]
name = "fsevent"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6"
dependencies = [
"bitflags",
"fsevent-sys",
]
[[package]]
name = "fsevent-sys"
version = "2.0.1"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0"
checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
dependencies = [
"libc",
]
[[package]]
name = "fuchsia-zircon"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
dependencies = [
"bitflags",
"fuchsia-zircon-sys",
]
[[package]]
name = "fuchsia-zircon-sys"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
[[package]]
name = "getrandom"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77"
dependencies = [
"cfg-if 1.0.0",
"cfg-if",
"libc",
"wasi",
]
@ -246,9 +241,9 @@ dependencies = [
[[package]]
name = "inotify"
version = "0.7.1"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f"
checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
dependencies = [
"bitflags",
"inotify-sys",
@ -264,15 +259,6 @@ dependencies = [
"libc",
]
[[package]]
name = "iovec"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
dependencies = [
"libc",
]
[[package]]
name = "itoa"
version = "1.0.1"
@ -280,13 +266,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]]
name = "kernel32-sys"
version = "0.2.2"
name = "kqueue"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
checksum = "058a107a784f8be94c7d35c1300f4facced2e93d2fbe5b1452b44e905ddca4a9"
dependencies = [
"winapi 0.2.8",
"winapi-build",
"kqueue-sys",
"libc",
]
[[package]]
name = "kqueue-sys"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587"
dependencies = [
"bitflags",
"libc",
]
[[package]]
@ -295,12 +291,6 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.119"
@ -313,13 +303,22 @@ version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "lock_api"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
dependencies = [
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
dependencies = [
"cfg-if 1.0.0",
"cfg-if",
]
[[package]]
@ -340,74 +339,65 @@ dependencies = [
[[package]]
name = "mio"
version = "0.6.23"
version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc"
dependencies = [
"cfg-if 0.1.10",
"fuchsia-zircon",
"fuchsia-zircon-sys",
"iovec",
"kernel32-sys",
"libc",
"log",
"miow",
"net2",
"slab",
"winapi 0.2.8",
"ntapi",
"winapi",
]
[[package]]
name = "mio-extras"
version = "2.0.6"
name = "mio"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2"
dependencies = [
"lazycell",
"libc",
"log",
"mio",
"slab",
"miow",
"ntapi",
"winapi",
]
[[package]]
name = "miow"
version = "0.2.2"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
dependencies = [
"kernel32-sys",
"net2",
"winapi 0.2.8",
"ws2_32-sys",
]
[[package]]
name = "net2"
version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae"
dependencies = [
"cfg-if 0.1.10",
"libc",
"winapi 0.3.9",
"winapi",
]
[[package]]
name = "notify"
version = "4.0.17"
version = "5.0.0-pre.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257"
checksum = "245d358380e2352c2d020e8ee62baac09b3420f1f6c012a31326cfced4ad487d"
dependencies = [
"bitflags",
"crossbeam-channel",
"filetime",
"fsevent",
"fsevent-sys",
"inotify",
"kqueue",
"libc",
"mio",
"mio-extras",
"mio 0.7.14",
"serde",
"walkdir",
"winapi 0.3.9",
"winapi",
]
[[package]]
name = "ntapi"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
dependencies = [
"winapi",
]
[[package]]
@ -429,6 +419,22 @@ dependencies = [
"autocfg",
]
[[package]]
name = "num_cpus"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "once_cell"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
[[package]]
name = "os_str_bytes"
version = "6.0.0"
@ -444,6 +450,35 @@ version = "1.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c69d19a208bba8b94bd27d4b7a06ad153cddc6b88cb2149a668e23ce7bdb67d5"
[[package]]
name = "parking_lot"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-sys",
]
[[package]]
name = "pin-project-lite"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
[[package]]
name = "ppv-lite86"
version = "0.2.16"
@ -563,6 +598,12 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "serde"
version = "1.0.136"
@ -606,6 +647,15 @@ dependencies = [
"yaml-rust",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]]
name = "simplelog"
version = "0.11.2"
@ -619,10 +669,20 @@ dependencies = [
]
[[package]]
name = "slab"
version = "0.4.5"
name = "smallvec"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
[[package]]
name = "socket2"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "strsim"
@ -663,7 +723,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
dependencies = [
"libc",
"winapi 0.3.9",
"winapi",
]
[[package]]
name = "tokio"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee"
dependencies = [
"bytes",
"libc",
"memchr",
"mio 0.8.0",
"num_cpus",
"once_cell",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros",
"winapi",
]
[[package]]
name = "tokio-macros"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
@ -685,7 +776,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
dependencies = [
"same-file",
"winapi 0.3.9",
"winapi",
"winapi-util",
]
@ -695,12 +786,6 @@ version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "winapi"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
[[package]]
name = "winapi"
version = "0.3.9"
@ -711,12 +796,6 @@ dependencies = [
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-build"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
@ -729,7 +808,7 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
dependencies = [
"winapi 0.3.9",
"winapi",
]
[[package]]
@ -739,15 +818,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "ws2_32-sys"
version = "0.2.1"
name = "windows-sys"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6"
dependencies = [
"winapi 0.2.8",
"winapi-build",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_msvc"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5"
[[package]]
name = "windows_i686_gnu"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615"
[[package]]
name = "windows_i686_msvc"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172"
[[package]]
name = "windows_x86_64_gnu"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc"
[[package]]
name = "windows_x86_64_msvc"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316"
[[package]]
name = "yaml-rust"
version = "0.4.5"

View File

@ -11,16 +11,16 @@ clap = { version = "3.0.14", features = ["derive"] }
ffprobe = "0.3"
file-rotate = "0.6.0"
log = "0.4.14"
notify = "4.0.0"
notify = { version = "5.0.0-pre.13", features = ["serde"] }
rand = "0.8.5"
regex = "1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.8"
simplelog = { version = "^0.11.2", features = ["paris"] }
tokio = { version = "1.16.1", features = ["full"] }
walkdir = "2"
# tokio = { version = "1.16.1", features = ["full"] }
[[bin]]
name = "ffplayout"
path = "src/main.rs"

View File

@ -1,7 +1,7 @@
use serde::{Deserialize, Serialize};
use std::path::Path;
use crate::utils::{is_close, Config, Program};
use crate::utils::{is_close, Config, Media};
#[derive(Debug, Serialize, Deserialize, Clone)]
struct Filters {
@ -117,7 +117,7 @@ fn scale(width: i64, height: i64, aspect: f64, chain: &mut Filters, config: &Con
}
}
fn fade(node: &mut Program, chain: &mut Filters, codec_type: String) {
fn fade(node: &mut Media, chain: &mut Filters, codec_type: String) {
let mut t = "".to_string();
if codec_type == "audio".to_string() {
@ -136,7 +136,7 @@ fn fade(node: &mut Program, chain: &mut Filters, codec_type: String) {
}
}
fn overlay(node: &mut Program, chain: &mut Filters, config: &Config, last_ad: bool, next_ad: bool) {
fn overlay(node: &mut Media, chain: &mut Filters, config: &Config, last_ad: bool, next_ad: bool) {
if config.processing.add_logo
&& Path::new(&config.processing.logo).is_file()
&& node.category != "advertisement".to_string()
@ -165,7 +165,7 @@ fn overlay(node: &mut Program, chain: &mut Filters, config: &Config, last_ad: bo
}
}
fn extend_video(node: &mut Program, chain: &mut Filters) {
fn extend_video(node: &mut Media, chain: &mut Filters) {
let video_streams = node.probe.clone().unwrap().video_streams.unwrap();
if video_streams.len() > 0 {
let video_duration = &video_streams[0].duration;
@ -180,7 +180,7 @@ fn extend_video(node: &mut Program, chain: &mut Filters) {
}
}
fn add_audio(node: &mut Program, chain: &mut Filters) {
fn add_audio(node: &mut Media, chain: &mut Filters) {
let audio_streams = node.probe.clone().unwrap().audio_streams.unwrap();
if audio_streams.len() == 0 {
println!("Clip: '{}' has no audio!", node.source);
@ -192,7 +192,7 @@ fn add_audio(node: &mut Program, chain: &mut Filters) {
}
}
fn extend_audio(node: &mut Program, chain: &mut Filters) {
fn extend_audio(node: &mut Media, chain: &mut Filters) {
let audio_streams = node.probe.clone().unwrap().audio_streams.unwrap();
if audio_streams.len() > 0 {
let audio_duration = &audio_streams[0].duration;
@ -213,7 +213,7 @@ fn audio_volume(chain: &mut Filters, config: &Config) {
}
}
pub fn filter_chains(node: &mut Program, config: &Config, last: bool, next: bool) -> Vec<String> {
pub fn filter_chains(node: &mut Media, config: &Config, last: bool, next: bool) -> Vec<String> {
let mut filters = Filters::new();
let probe = node.probe.clone();

View File

@ -16,22 +16,8 @@ fn main() {
CombinedLogger::init(logging).unwrap();
warn!("this is a warning");
error!("this is a error");
// folder::walk(&config.storage.path, config.storage.shuffle, &config.storage.extensions);
// read_json(&config);
// let args = arg_parse::get_args();
// println!("{:#?}", args);
// println!("{:#?}", args.config.is_some());
// // println!("{:#?}", args.config.unwrap());
// //println!("{:?}", config.general.stop_threshold);
// println!("{:#?}", utils::get_sec());
// println!("{:#?}", utils::get_timestamp());
// warn!("this is a warning");
// error!("this is a error");
desktop::play(config);
}

View File

@ -1,16 +1,51 @@
use std::{
io::{prelude::*, Read},
path::Path,
process,
process::{Command, Stdio},
sync::Arc,
thread::sleep,
time::Duration,
};
use tokio::sync::Mutex;
use tokio::runtime::Builder;
use simplelog::*;
use crate::utils::{sec_to_time, Config, CurrentProgram};
use crate::utils::{sec_to_time, watch_folder, Config, CurrentProgram, Media, Source};
pub fn play(config: Config) {
let get_source = CurrentProgram::new(config.clone());
let get_source = match config.processing.mode.clone().as_str() {
"folder" => {
let path = config.storage.path.clone();
if !Path::new(&path).exists() {
error!("Folder path not exists: '{path}'");
process::exit(0x0100);
}
let runtime = Builder::new_multi_thread()
.worker_threads(1)
.enable_all()
.build()
.unwrap();
let folder_source = Source::new(config.clone());
let mut folder_sync = Arc::new(Mutex::new(folder_source.clone()));
runtime.spawn(watch_folder(&path, &mut folder_sync));
Box::new(folder_source) as Box<dyn Iterator<Item = Media>>
}
"playlist" => {
Box::new(CurrentProgram::new(config.clone())) as Box<dyn Iterator<Item = Media>>
}
_ => {
error!("Process Mode not exists!");
process::exit(0x0100);
}
};
// let get_source = CurrentProgram::new(config.clone());
let dec_settings = config.processing.settings.unwrap();
let ff_log_format = format!("level+{}", config.logging.ffmpeg_level);
let mut enc_cmd = vec![

View File

@ -1,58 +1,117 @@
use notify::DebouncedEvent::{Create, Remove, Rename};
use notify::{watcher, RecursiveMode, Watcher};
use rand::(seq::SliceRandom, thread_rng);
use rand::{seq::SliceRandom, thread_rng};
use std::{
ffi::OsStr,
path::Path,
process,
sync::mpsc::{channel, Receiver, TryRecvError},
thread, time,
sync::{mpsc::channel, Arc},
time::Duration,
};
use tokio::sync::Mutex;
use walkdir::WalkDir;
#[derive(Clone)]
struct Source {
files: Vec<String>,
use simplelog::*;
use crate::utils::{Config, Media};
#[derive(Debug, Clone)]
pub struct Source {
config: Config,
nodes: Vec<String>,
index: usize,
}
impl Source {
fn new(path: &String, extensions: &Vec<String>) -> Self {
pub fn new(config: Config) -> Self {
let mut file_list = vec![];
for entry in WalkDir::new(path).into_iter().filter_map(|e| e.ok()) {
for entry in WalkDir::new(config.storage.path.clone())
.into_iter()
.filter_map(|e| e.ok())
{
if entry.path().is_file() {
let ext = file_extension(entry.path());
if ext.is_some() && extensions.contains(&ext.unwrap().to_lowercase()) {
if ext.is_some()
&& config
.storage
.extensions
.clone()
.contains(&ext.unwrap().to_lowercase())
{
file_list.push(entry.path().display().to_string());
}
}
}
Self { files: file_list }
if config.storage.shuffle {
info!("Shuffle files");
let mut rng = thread_rng();
file_list.shuffle(&mut rng);
} else {
file_list.sort();
}
Self {
config: config,
nodes: file_list,
index: 0,
}
}
fn push(&mut self, file: String) {
self.files.push(file)
self.nodes.push(file)
}
fn rm(&mut self, file: String) {
self.files.retain(|x| x != &file);
self.nodes.retain(|x| x != &file);
}
fn mv(&mut self, old_file: String, new_file: String) {
let i = self.files.iter().position(|x| *x == old_file).unwrap();
self.files[i] = new_file;
let i = self.nodes.iter().position(|x| *x == old_file).unwrap();
self.nodes[i] = new_file;
}
fn shuffle(&mut self) {
let mut rng = thread_rng();
self.files.shuffle(&mut rng);
self.nodes.shuffle(&mut rng);
}
fn sort(&mut self) {
self.files.sort();
self.nodes.sort();
}
}
impl Iterator for Source {
type Item = Media;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.nodes.len() {
let current_file = self.nodes[self.index].clone();
let mut media = Media::new(self.index, current_file);
media.add_probe();
media.add_filter(&self.config, false, false);
self.index += 1;
Some(media)
} else {
if self.config.storage.shuffle {
info!("Shuffle files");
self.shuffle();
} else {
self.sort();
}
let current_file = self.nodes[0].clone();
let mut media = Media::new(self.index, current_file);
media.add_probe();
media.add_filter(&self.config, false, false);
self.index = 1;
Some(media)
}
}
}
@ -60,61 +119,39 @@ fn file_extension(filename: &Path) -> Option<&str> {
filename.extension().and_then(OsStr::to_str)
}
fn watch_folder(source: &mut Source, receiver: &Receiver<notify::DebouncedEvent>) {
match receiver.try_recv() {
pub async fn watch_folder(path: &String, source: &mut Arc<Mutex<Source>>) {
// let mut source = Source::new();
let (sender, receiver) = channel();
let mut watcher = watcher(sender, Duration::from_secs(2)).unwrap();
watcher.watch(path, RecursiveMode::Recursive).unwrap();
println!("watch path: '{}'", path);
loop {
match receiver.recv() {
Ok(event) => match event {
Create(new_path) => {
println!("Create new file: {:?}", new_path);
source.push(new_path.display().to_string());
let mut lock = source.lock().await;
lock.push(new_path.display().to_string());
}
Remove(old_path) => {
println!("Remove file: {:?}", old_path);
source.rm(old_path.display().to_string());
let mut lock = source.lock().await;
lock.rm(old_path.display().to_string());
}
Rename(old_path, new_path) => {
println!("Rename file: {:?} to {:?}", old_path, new_path);
source.mv(
let mut lock = source.lock().await;
lock.mv(
old_path.display().to_string(),
new_path.display().to_string(),
);
}
_ => (),
},
Err(err) => {
if err == TryRecvError::Disconnected {
println!("Folder watch error: {:?}", err)
}
Err(e) => println!("watch error: {:?}", e),
}
}
}
pub fn walk(path: &String, shuffle: bool, extensions: &Vec<String>) {
if !Path::new(path).exists() {
println!("Folder path not exists: '{path}'");
process::exit(0x0100);
}
let mut source = Source::new(path, extensions);
let mut index: usize = 0;
let (sender, receiver) = channel();
let mut watcher = watcher(sender, Duration::from_secs(2)).unwrap();
watcher.watch(path, RecursiveMode::Recursive).unwrap();
loop {
if shuffle {
println!("Shuffle files in folder: '{path}'");
source.shuffle();
} else {
source.sort();
}
while index < source.files.len() {
watch_folder(&mut source, &receiver);
println!("Play file {index}: {:?}", source.files[index]);
index += 1;
thread::sleep(time::Duration::from_secs(1));
}
index = 0
}
}

View File

@ -3,7 +3,7 @@ use std::{fs::File, path::Path};
use simplelog::*;
use crate::utils::{get_date, get_sec, modified_time, time_to_sec, Config, MediaProbe};
use crate::utils::{get_date, get_sec, modified_time, time_to_sec, Config, Media};
#[derive(Debug, Serialize, Deserialize)]
pub struct Playlist {
@ -11,24 +11,7 @@ pub struct Playlist {
pub current_file: Option<String>,
pub start_index: Option<usize>,
pub modified: Option<String>,
pub program: Vec<Program>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Program {
pub begin: Option<f64>,
pub index: Option<usize>,
#[serde(rename = "in")]
pub seek: f64,
pub out: f64,
pub duration: f64,
pub category: String,
pub source: String,
pub cmd: Option<Vec<String>>,
pub filter: Option<Vec<String>>,
pub probe: Option<MediaProbe>,
pub last_ad: Option<bool>,
pub next_ad: Option<bool>,
pub program: Vec<Media>,
}
pub fn read_json(config: &Config, seek: bool) -> Playlist {

View File

@ -6,17 +6,72 @@ use std::{fs::metadata, process, time, time::UNIX_EPOCH};
mod arg_parse;
mod config;
mod folder;
mod json_reader;
mod logging;
mod playlist;
pub use arg_parse::get_args;
pub use config::{get_config, Config};
// pub use folder::walk;
pub use json_reader::{read_json, Program};
pub use folder::{watch_folder, Source};
pub use json_reader::read_json;
pub use logging::init_logging;
pub use playlist::CurrentProgram;
use crate::filter::filter_chains;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Media {
pub begin: Option<f64>,
pub index: Option<usize>,
#[serde(rename = "in")]
pub seek: f64,
pub out: f64,
pub duration: f64,
pub category: String,
pub source: String,
pub cmd: Option<Vec<String>>,
pub filter: Option<Vec<String>>,
pub probe: Option<MediaProbe>,
pub last_ad: Option<bool>,
pub next_ad: Option<bool>,
}
impl Media {
fn new(index: usize, src: String) -> Self {
let probe = MediaProbe::new(src.clone());
let duration: f64 = match &probe.clone().format.unwrap().duration {
Some(dur) => dur.parse().unwrap(),
None => 0.0
};
Self {
begin: None,
index: Some(index),
seek: 0.0,
out: duration,
duration: duration,
category: "".to_string(),
source: src.clone(),
cmd: Some(vec!["-i".to_string(), src]),
filter: Some(vec![]),
probe: Some(probe),
last_ad: Some(false),
next_ad: Some(false),
}
}
fn add_probe(&mut self) {
self.probe = Some(MediaProbe::new(self.source.clone()))
}
fn add_filter(&mut self, config: &Config, last: bool, next: bool) {
let mut node = self.clone();
self.filter = Some(filter_chains(&mut node, &config, last, next));
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MediaProbe {
pub format: Option<Format>,
@ -120,7 +175,7 @@ pub fn modified_time(path: String) -> Option<DateTime<Local>> {
pub fn time_to_sec(time_str: &String) -> f64 {
if ["now", "", "none"].contains(&time_str.as_str()) || !time_str.contains(":") {
return get_sec()
return get_sec();
}
let t: Vec<&str> = time_str.split(':').collect();

View File

@ -3,18 +3,15 @@ use std::path::Path;
use simplelog::*;
use crate::utils::{
check_sync, gen_dummy, get_delta,
json_reader::{read_json, Program},
modified_time, Config, MediaProbe,
check_sync, gen_dummy, get_delta, json_reader::read_json, modified_time, Config, Media,
};
use crate::filter::filter_chains;
#[derive(Debug)]
pub struct CurrentProgram {
config: Config,
json_mod: String,
json_path: String,
nodes: Vec<Program>,
nodes: Vec<Media>,
init: bool,
idx: usize,
}
@ -44,18 +41,10 @@ impl CurrentProgram {
self.nodes = json.program.into();
}
}
fn append_probe(&mut self, node: &mut Program) {
node.probe = Some(MediaProbe::new(node.source.clone()))
}
fn add_filter(&mut self, node: &mut Program, last: bool, next: bool) {
node.filter = Some(filter_chains(node, &self.config, last, next));
}
}
impl Iterator for CurrentProgram {
type Item = Program;
type Item = Media;
fn next(&mut self) -> Option<Self::Item> {
if self.idx < self.nodes.len() {
@ -68,8 +57,14 @@ impl Iterator for CurrentProgram {
last = true
}
debug!("Last: <b><magenta>{}</></b>", self.nodes[self.idx - 1].source);
debug!("Next: <b><magenta>{}</></b>", self.nodes[self.idx + 1].source);
debug!(
"Last: <b><magenta>{}</></b>",
self.nodes[self.idx - 1].source
);
debug!(
"Next: <b><magenta>{}</></b>",
self.nodes[self.idx + 1].source
);
self.idx += 1;
@ -85,8 +80,8 @@ impl Iterator for CurrentProgram {
}
if Path::new(&current.source).is_file() {
self.append_probe(&mut current);
self.add_filter(&mut current, last, next);
current.add_probe();
current.add_filter(&self.config, last, next);
} else {
error!("File not found: {}", current.source);
let dummy = gen_dummy(current.out - current.seek, &self.config);
@ -124,8 +119,8 @@ impl Iterator for CurrentProgram {
}
if Path::new(&current.source).is_file() {
self.append_probe(&mut current);
self.add_filter(&mut current, last, next);
current.add_probe();
current.add_filter(&self.config, last, next);
} else {
error!("File not found: {}", current.source);
let dummy = gen_dummy(current.out - current.seek, &self.config);