🏡 index : ~doyle/scrs.git

author Jordan Doyle <jordan@doyle.la> 2020-07-19 23:40:35.0 +01:00:00
committer Jordan Doyle <jordan@doyle.la> 2020-07-19 23:40:35.0 +01:00:00
commit
dbd577be7ea51a1d37fd70a54c14fcc97d8f7229 [patch]
tree
f679be26c2b5390946fbef53307be7f83b2d58cc
parent
5624b2da49930d04a050849e0b0db42fd94480f8
download
dbd577be7ea51a1d37fd70a54c14fcc97d8f7229.tar.gz

Receive metadata from streamer & broadcast on /metadata



Diff

 scrs-serve/Cargo.lock  | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
 scrs-serve/Cargo.toml  |   6 +++++-
 scrs-serve/src/main.rs |  50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 194 insertions(+), 43 deletions(-)

diff --git a/scrs-serve/Cargo.lock b/scrs-serve/Cargo.lock
index a14f6dc..e94b896 100644
--- a/scrs-serve/Cargo.lock
+++ a/scrs-serve/Cargo.lock
@@ -1,10 +1,10 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "aho-corasick"
version = "0.7.10"
version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86"
dependencies = [
 "memchr",
]
@@ -15,7 +15,7 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
dependencies = [
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -32,7 +32,7 @@
dependencies = [
 "hermit-abi",
 "libc",
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -54,9 +54,9 @@

[[package]]
name = "bytes"
version = "0.5.4"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1"
checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"

[[package]]
name = "cfg-if"
@@ -222,9 +222,9 @@

[[package]]
name = "hermit-abi"
version = "0.1.13"
version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71"
checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9"
dependencies = [
 "libc",
]
@@ -253,6 +253,17 @@
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
dependencies = [
 "quick-error",
]

[[package]]
name = "idna"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
dependencies = [
 "matches",
 "unicode-bidi",
 "unicode-normalization",
]

[[package]]
@@ -266,9 +277,9 @@

[[package]]
name = "itoa"
version = "0.4.5"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"

[[package]]
name = "kernel32-sys"
@@ -288,18 +299,24 @@

[[package]]
name = "libc"
version = "0.2.71"
version = "0.2.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
checksum = "bd7d4bd64732af4bf3a67f367c27df8520ad7e230c5817b8ff485864d80242b9"

[[package]]
name = "log"
version = "0.4.8"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
dependencies = [
 "cfg-if",
]

[[package]]
name = "matches"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"

[[package]]
name = "memchr"
@@ -328,14 +345,14 @@

[[package]]
name = "mio-named-pipes"
version = "0.1.6"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3"
checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656"
dependencies = [
 "log",
 "mio",
 "miow 0.3.4",
 "winapi 0.3.8",
 "miow 0.3.5",
 "winapi 0.3.9",
]

[[package]]
@@ -363,12 +380,12 @@

[[package]]
name = "miow"
version = "0.3.4"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22dfdd1d51b2639a5abd17ed07005c3af05fb7a2a3b1a1d0d7af1000a520c1c7"
checksum = "07b88fb9795d4d36d62a012dfbf49a8f5cf12751f36d31a9dbe66d528e58979e"
dependencies = [
 "socket2",
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -379,7 +396,7 @@
dependencies = [
 "cfg-if",
 "libc",
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -397,21 +414,27 @@
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"

[[package]]
name = "percent-encoding"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"

[[package]]
name = "pin-project"
version = "0.4.20"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e75373ff9037d112bb19bc61333a06a159eaeb217660dcfbea7d88e1db823919"
checksum = "12e3a6cdbfe94a5e4572812a0201f8c0ed98c1c452c7b8563ce2276988ef9c17"
dependencies = [
 "pin-project-internal",
]

[[package]]
name = "pin-project-internal"
version = "0.4.20"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10b4b44893d3c370407a1d6a5cfde7c41ae0478e31c516c85f67eb3adc51be6d"
checksum = "6a0ffd45cf79d88737d7cc85bfd5d2894bee1139b356e616fe85dc389c61aaf7"
dependencies = [
 "proc-macro2",
 "quote",
@@ -438,9 +461,9 @@

[[package]]
name = "proc-macro-nested"
version = "0.1.4"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694"
checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"

[[package]]
name = "proc-macro2"
@@ -459,18 +482,18 @@

[[package]]
name = "quote"
version = "1.0.6"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
dependencies = [
 "proc-macro2",
]

[[package]]
name = "redox_syscall"
version = "0.1.56"
version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"

[[package]]
name = "regex"
@@ -489,11 +512,18 @@
version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"

[[package]]
name = "ryu"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"

[[package]]
name = "scrs"
version = "0.1.0"
dependencies = [
 "arc-swap",
 "bus_queue",
 "bytes",
 "clap",
@@ -502,7 +532,41 @@
 "futures",
 "http",
 "httparse",
 "serde",
 "serde_json",
 "tokio",
 "url",
]

[[package]]
name = "serde"
version = "1.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
dependencies = [
 "serde_derive",
]

[[package]]
name = "serde_derive"
version = "1.0.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "serde_json"
version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3433e879a558dde8b5e8feb2a04899cf34fdde1fafb894687e52105fc1162ac3"
dependencies = [
 "itoa",
 "ryu",
 "serde",
]

[[package]]
@@ -530,7 +594,7 @@
 "cfg-if",
 "libc",
 "redox_syscall",
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -541,9 +605,9 @@

[[package]]
name = "syn"
version = "1.0.30"
version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2"
checksum = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b"
dependencies = [
 "proc-macro2",
 "quote",
@@ -576,6 +640,12 @@
dependencies = [
 "lazy_static",
]

[[package]]
name = "tinyvec"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53953d2d3a5ad81d9f844a32f14ebb121f50b650cd59d0ee2a07cf13c617efed"

[[package]]
name = "tokio"
@@ -598,7 +668,7 @@
 "signal-hook-registry",
 "slab",
 "tokio-macros",
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
@@ -610,6 +680,24 @@
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "unicode-bidi"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
dependencies = [
 "matches",
]

[[package]]
name = "unicode-normalization"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977"
dependencies = [
 "tinyvec",
]

[[package]]
@@ -620,9 +708,20 @@

[[package]]
name = "unicode-xid"
version = "0.2.0"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"

[[package]]
name = "url"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
dependencies = [
 "idna",
 "matches",
 "percent-encoding",
]

[[package]]
name = "vec_map"
@@ -638,9 +737,9 @@

[[package]]
name = "winapi"
version = "0.3.8"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
 "winapi-i686-pc-windows-gnu",
 "winapi-x86_64-pc-windows-gnu",
@@ -664,7 +763,7 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
dependencies = [
 "winapi 0.3.8",
 "winapi 0.3.9",
]

[[package]]
diff --git a/scrs-serve/Cargo.toml b/scrs-serve/Cargo.toml
index b7516cd..64efb3f 100644
--- a/scrs-serve/Cargo.toml
+++ a/scrs-serve/Cargo.toml
@@ -15,4 +15,8 @@
bytes = "0.5"
httparse = "1.3"
clap = "2.33"
derive_more = "0.99"
derive_more = "0.99"
arc-swap = "0.4"
url = "2.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1"
diff --git a/scrs-serve/src/main.rs b/scrs-serve/src/main.rs
index 66de1a8..eaac621 100644
--- a/scrs-serve/src/main.rs
+++ a/scrs-serve/src/main.rs
@@ -1,10 +1,12 @@
#![deny(clippy::pedantic)]
#![allow(clippy::used_underscore_binding)]

use arc_swap::ArcSwap;
use bus_queue::flavors::arc_swap::{bounded, Publisher, Subscriber};
use bytes::Bytes;
use derive_more::Deref;
use futures::{SinkExt, StreamExt};
use serde::Serialize;

use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpStream;
@@ -35,6 +37,13 @@
    }
}

#[derive(Debug, Default, Serialize)]
struct StreamMetadata {
    artist: Option<String>,
    title: Option<String>,
    album: Option<String>,
}

async fn write_response<W: tokio::io::AsyncWrite + Unpin>(mut writer: W, resp: http::Response<()>) {
    writer
        .write_all(
@@ -64,6 +73,7 @@
    mut stream: TcpStream,
    publisher: Arc<Mutex<Publisher<Bytes>>>,
    mut subscriber: Subscriber<Bytes>,
    metadata: Arc<ArcSwap<StreamMetadata>>,
) {
    println!("accepted");

@@ -126,7 +136,43 @@
                }
            } else {
                panic!("someone's already streaming!");
            }
        }
        "/metadata" => {
            let resp = resp
                .header("Connection", "Close")
                .header("Content-Type", "application/json")
                .body(())
                .unwrap();
            write_response(&mut stream, resp).await;

            stream
                .write_all(
                    serde_json::to_string(metadata.load().as_ref())
                        .unwrap()
                        .as_bytes(),
                )
                .await
                .unwrap();
        }
        "/admin/metadata" => {
            let query = url::form_urlencoded::parse(req.uri().query().unwrap().as_bytes());

            let mut meta = StreamMetadata::default();

            for (key, value) in query {
                match key.as_ref() {
                    "artist" => meta.artist = Some(value.into_owned()),
                    "title" => meta.title = Some(value.into_owned()),
                    "album" => meta.album = Some(value.into_owned()),
                    _ => {}
                }
            }

            metadata.store(Arc::new(meta));

            let resp = resp.body(()).unwrap();
            write_response(&mut stream, resp).await;
        }
        _ => panic!("Invalid request: {:?}", req),
    }
@@ -141,6 +187,7 @@
async fn listen_forward(port: u16) {
    let (publisher, subscriber) = bounded::<bytes::Bytes>(128);
    let publisher = Arc::new(Mutex::new(publisher));
    let metadata = Arc::new(ArcSwap::new(Arc::from(StreamMetadata::default())));

    let addr = SocketAddr::from(([127, 0, 0, 1], port));

@@ -153,7 +200,8 @@

        let publisher = publisher.clone();
        let subscriber = subscriber.clone();
        let metadata = metadata.clone();

        tokio::spawn(process(stream, publisher, subscriber));
        tokio::spawn(process(stream, publisher, subscriber, metadata));
    }
}