Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ members = [
"cloud/geo-ip",
"cloud/id",
"cloud/proto",
"cloud/video/api",
"cloud/video/api/traits",
"cloud/video/ingest",
"cloud/video/ingest/traits",
"crates/aac",
"crates/amf0",
"crates/av1",
Expand Down
2 changes: 2 additions & 0 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ run bin *args:
bazel run //cloud/email:bin -- {{ args }}
elif [ {{ bin }} == "ingest" ]; then
bazel run //cloud/video/ingest:bin -- {{ args }}
elif [ {{ bin }} == "video-api" ]; then
bazel run //cloud/video/api:bin -- {{ args }}
else
echo "Unknown binary: {{ bin }}"
exit 1
Expand Down
3 changes: 3 additions & 0 deletions cargo_targets.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ _packages = [
"//cloud/email/traits",
"//cloud/geo-ip",
"//cloud/video/ingest",
"//cloud/video/ingest/traits",
"//cloud/video/api",
"//cloud/video/api/traits",
"//cloud/id",
"//cloud/proto",
"//crates/aac",
Expand Down
35 changes: 35 additions & 0 deletions cloud/video/api/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
load("//misc/utils/rust:manifest.bzl", "cargo_toml")
load("//misc/utils/rust:package.bzl", "scuffle_package")

cargo_toml()

deps = [
"//crates/bootstrap",
"//crates/bootstrap-telemetry",
"//crates/context",
"//crates/settings",
"//crates/signal",
"//cloud/video/api/traits",
]

aliases = {
"//cloud/video/api/traits": "video_api_traits",
}

scuffle_package(
aliases = aliases,
crate_name = "scufflecloud-video-api",
deps = deps,
)

scuffle_package(
name = "bin",
srcs = glob([
"bin/standalone/**/*.rs",
]),
aliases = aliases,
crate_name = "scufflecloud-video-api-standalone",
crate_type = "bin",
readme = False,
deps = deps + [":api"],
)
37 changes: 37 additions & 0 deletions cloud/video/api/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
[package]
name = "scufflecloud-video-api"
version = "0.1.0"
authors = ["Scuffle <[email protected]>"]
edition = "2024"
license = "AGPL-3.0"
publish = false
readme = "README.md"
repository = "https://github.com/scufflecloud/scuffle"
description = "Video API server for scuffle.cloud"

[[bin]]
name = "scufflecloud-video-api-standalone"
path = "bin/standalone/main.rs"

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }

[dependencies]
anyhow = "1.0.98"
scuffle-bootstrap = { path = "../../../crates/bootstrap" }
scuffle-bootstrap-telemetry = { features = ["opentelemetry-logs", "opentelemetry-traces"], path = "../../../crates/bootstrap-telemetry" }
scuffle-context = { path = "../../../crates/context" }
scuffle-settings = { features = ["all-formats", "bootstrap"], path = "../../../crates/settings" }
scuffle-signal = { features = ["bootstrap"], path = "../../../crates/signal" }
serde = "1.0.219"
serde_derive = "1.0.219"
smart-default = "0.7.1"
tracing = "0.1.41"
tracing-subscriber = { version = "0.3.20", features = ["env-filter"] }
video-api-traits = { path = "./traits", package = "scufflecloud-video-api-traits" }

[package.metadata.sync-readme.badges]
docs-rs = false
crates-io = false
license = true
codecov = true
1 change: 1 addition & 0 deletions cloud/video/api/LICENSE.AGPL-3.0
21 changes: 21 additions & 0 deletions cloud/video/api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<!-- dprint-ignore-file -->
<!-- sync-readme title [[ -->
# scufflecloud-video-api
<!-- sync-readme ]] -->

<!-- sync-readme badge [[ -->
![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-purple.svg?style=flat-square)
[![Codecov](https://img.shields.io/codecov/c/github/scufflecloud/scuffle.svg?label=codecov&logo=codecov&style=flat-square)](https://app.codecov.io/gh/scufflecloud/scuffle)
<!-- sync-readme ]] -->

---

<!-- sync-readme rustdoc [[ -->
Video API server for <https://scuffle.cloud/>.

### License

This project is licensed under the [AGPL-3.0](./LICENSE.AGPL-3.0).

`SPDX-License-Identifier: AGPL-3.0`
<!-- sync-readme ]] -->
19 changes: 19 additions & 0 deletions cloud/video/api/bin/standalone/config.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use std::net::SocketAddr;

#[derive(serde_derive::Deserialize, smart_default::SmartDefault, Debug, Clone)]
#[serde(default)]
pub(crate) struct Config {
#[default(env!("CARGO_PKG_NAME").to_string())]
pub service_name: String,
#[default = "info"]
pub level: String,
pub telemetry: Option<TelemetryConfig>,
}

scuffle_settings::bootstrap!(Config);

#[derive(serde_derive::Deserialize, smart_default::SmartDefault, Debug, Clone)]
pub(crate) struct TelemetryConfig {
#[default("[::1]:4317".parse().unwrap())]
pub bind: SocketAddr,
}
73 changes: 73 additions & 0 deletions cloud/video/api/bin/standalone/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
// #![deny(missing_docs)]
#![deny(unsafe_code)]
#![deny(unreachable_pub)]
#![deny(clippy::mod_module_files)]

use std::sync::Arc;

use scuffle_bootstrap_telemetry::opentelemetry;
use scuffle_bootstrap_telemetry::opentelemetry_sdk::logs::SdkLoggerProvider;
use scuffle_bootstrap_telemetry::opentelemetry_sdk::trace::SdkTracerProvider;
use tracing_subscriber::Layer;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;

mod config;

struct Global {
config: config::Config,
open_telemetry: opentelemetry::OpenTelemetry,
}

impl video_api_traits::Global for Global {}

impl scuffle_signal::SignalConfig for Global {}

impl scuffle_bootstrap_telemetry::TelemetryConfig for Global {
fn enabled(&self) -> bool {
self.config.telemetry.is_some()
}

fn bind_address(&self) -> Option<std::net::SocketAddr> {
self.config.telemetry.as_ref().map(|telemetry| telemetry.bind)
}

fn http_server_name(&self) -> &str {
"scufflecloud-video-api-telemetry"
}

fn opentelemetry(&self) -> Option<&opentelemetry::OpenTelemetry> {
Some(&self.open_telemetry)
}
}

impl scuffle_bootstrap::Global for Global {
type Config = config::Config;

async fn init(config: Self::Config) -> anyhow::Result<Arc<Self>> {
tracing_subscriber::registry()
.with(
tracing_subscriber::fmt::layer()
.with_filter(tracing_subscriber::EnvFilter::from_default_env().add_directive(config.level.parse()?)),
)
.init();

let tracer = SdkTracerProvider::default();
opentelemetry::global::set_tracer_provider(tracer.clone());

let logger = SdkLoggerProvider::builder().build();

let open_telemetry = opentelemetry::OpenTelemetry::new().with_traces(tracer).with_logs(logger);

Ok(Arc::new(Self { config, open_telemetry }))
}
}

scuffle_bootstrap::main! {
Global {
scuffle_signal::SignalSvc,
scufflecloud_video_api::services::VideoApiSvc::<Global>::default(),
}
}
17 changes: 17 additions & 0 deletions cloud/video/api/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//! Video API server for <https://scuffle.cloud/>.
//!
//! ## License
//!
//! This project is licensed under the [AGPL-3.0](./LICENSE.AGPL-3.0).
//!
//! `SPDX-License-Identifier: AGPL-3.0`
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
// #![deny(missing_docs)]
#![deny(unsafe_code)]
#![deny(unreachable_pub)]
#![deny(clippy::mod_module_files)]
// tonic::Status emits this warning
#![allow(clippy::result_large_err)]

pub mod services;
20 changes: 20 additions & 0 deletions cloud/video/api/src/services.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use std::sync::Arc;

#[derive(Debug)]
pub struct VideoApiSvc<G> {
_phantom: std::marker::PhantomData<G>,
}

impl<G> Default for VideoApiSvc<G> {
fn default() -> Self {
Self {
_phantom: std::marker::PhantomData,
}
}
}

impl<G: video_api_traits::Global> scuffle_bootstrap::Service<G> for VideoApiSvc<G> {
async fn run(self, _global: Arc<G>, _ctx: scuffle_context::Context) -> anyhow::Result<()> {
Ok(())
}
}
8 changes: 8 additions & 0 deletions cloud/video/api/traits/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
load("//misc/utils/rust:manifest.bzl", "cargo_toml")
load("//misc/utils/rust:package.bzl", "scuffle_package")

cargo_toml()

scuffle_package(
crate_name = "scufflecloud-video-api-traits",
)
20 changes: 20 additions & 0 deletions cloud/video/api/traits/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[package]
name = "scufflecloud-video-api-traits"
version = "0.1.0"
authors = ["Scuffle <[email protected]>"]
edition = "2024"
license = "AGPL-3.0"
publish = false
readme = "README.md"
repository = "https://github.com/scufflecloud/scuffle"

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }

[dependencies]

[package.metadata.sync-readme.badges]
docs-rs = false
crates-io = false
license = true
codecov = true
13 changes: 13 additions & 0 deletions cloud/video/api/traits/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- dprint-ignore-file -->
<!-- sync-readme title [[ -->
# scufflecloud-video-api-traits
<!-- sync-readme ]] -->

<!-- sync-readme badge [[ -->
![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-purple.svg?style=flat-square)
[![Codecov](https://img.shields.io/codecov/c/github/scufflecloud/scuffle.svg?label=codecov&logo=codecov&style=flat-square)](https://app.codecov.io/gh/scufflecloud/scuffle)
<!-- sync-readme ]] -->

---

<!-- sync-readme rustdoc -->
8 changes: 8 additions & 0 deletions cloud/video/api/traits/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
// #![deny(missing_docs)]
#![deny(unsafe_code)]
#![deny(unreachable_pub)]
#![deny(clippy::mod_module_files)]

pub trait Global: Send + Sync + 'static {}
Loading