Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
081515365d
|
|||
be62b3a867
|
|||
0f893a004c
|
|||
a4ab530ade
|
|||
c8097d18bb
|
|||
4ae98658b7
|
|||
d28d6637f8
|
26
.drone.yml
Normal file
26
.drone.yml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
kind: pipeline
|
||||||
|
type: kubernetes
|
||||||
|
name: default
|
||||||
|
metadata:
|
||||||
|
namespace: git
|
||||||
|
concurrency:
|
||||||
|
limit: 1
|
||||||
|
volumes:
|
||||||
|
- name: cache
|
||||||
|
claim:
|
||||||
|
name: storage2
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: docker
|
||||||
|
privileged: true
|
||||||
|
volumes:
|
||||||
|
- name: cache
|
||||||
|
path: /cache
|
||||||
|
environment:
|
||||||
|
TOKEN_DOCKER:
|
||||||
|
from_secret: docker_hub
|
||||||
|
commands:
|
||||||
|
- dockerd --data-root /cache/dockerd &
|
||||||
|
- docker login -u voidic -p $TOKEN_DOCKER
|
||||||
|
- docker buildx build --push -t voidic/tiktok-dvm:latest .
|
||||||
|
- kill $(cat /var/run/docker.pid)
|
1016
Cargo.lock
generated
1016
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rust_dvm"
|
name = "tiktok_dvm"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
ARG IMAGE=rust:bookworm
|
||||||
|
ARG FEATURES
|
||||||
|
|
||||||
|
FROM $IMAGE AS build
|
||||||
|
WORKDIR /app/src
|
||||||
|
COPY src src
|
||||||
|
COPY Cargo.lock Cargo.lock
|
||||||
|
COPY Cargo.toml Cargo.toml
|
||||||
|
RUN cargo install --path . --root /app/build --features "${FEATURES}"
|
||||||
|
|
||||||
|
FROM $IMAGE AS runner
|
||||||
|
LABEL org.opencontainers.image.source="https://git.v0l.io/Kieran/tiktok-dvm"
|
||||||
|
LABEL org.opencontainers.image.licenses="MIT"
|
||||||
|
LABEL org.opencontainers.image.authors="Kieran"
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=build /app/build .
|
||||||
|
ENTRYPOINT ["./bin/tiktok_dvm"]
|
@ -6,15 +6,13 @@ use nostr_sdk::prelude::DataVendingMachineStatus;
|
|||||||
use nostr_sdk::{serde_json, Client, EventBuilder, Kind, Tag};
|
use nostr_sdk::{serde_json, Client, EventBuilder, Kind, Tag};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::env::temp_dir;
|
use std::env::temp_dir;
|
||||||
use std::fmt::format;
|
|
||||||
use std::fs::create_dir_all;
|
use std::fs::create_dir_all;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::Path;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
use yt_dlp::executor::Executor;
|
||||||
use yt_dlp::fetcher::deps::Libraries;
|
use yt_dlp::fetcher::deps::Libraries;
|
||||||
use yt_dlp::utils::executor::Executor;
|
|
||||||
use yt_dlp::Youtube;
|
|
||||||
|
|
||||||
/// Basic DVM which clones videos from TikTok and posts them as kind 22 shorts
|
/// Basic DVM which clones videos from TikTok and posts them as kind 22 shorts
|
||||||
pub struct TikTokDvm {
|
pub struct TikTokDvm {
|
||||||
@ -49,7 +47,12 @@ impl DVMHandler for TikTokDvm {
|
|||||||
bail!("Only URL inputs are accepted")
|
bail!("Only URL inputs are accepted")
|
||||||
};
|
};
|
||||||
|
|
||||||
if input.host_str() != Some("www.tiktok.com") {
|
if !input
|
||||||
|
.host_str()
|
||||||
|
.as_ref()
|
||||||
|
.map(|h| h.ends_with("tiktok.com"))
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
bail!("Only tiktok urls are accepted");
|
bail!("Only tiktok urls are accepted");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,17 +97,32 @@ impl DVMHandler for TikTokDvm {
|
|||||||
imeta.push(format!("{} {}", k, v));
|
imeta.push(format!("{} {}", k, v));
|
||||||
}
|
}
|
||||||
|
|
||||||
let ev = EventBuilder::new(Kind::Custom(22), "")
|
let should_post = if let Some(ps) = request.params.get("post_short") {
|
||||||
.tag(Tag::parse(imeta)?)
|
ps.to_ascii_lowercase() == "true"
|
||||||
.tags([
|
} else {
|
||||||
Tag::parse(["title", &info.full_title])?,
|
true
|
||||||
Tag::parse(["r", input.as_str()])?,
|
};
|
||||||
]);
|
|
||||||
|
|
||||||
let event_posted = client.send_event_builder(ev).await?;
|
let job_data = if should_post {
|
||||||
let job_data = NoviaVideoData {
|
let ev = EventBuilder::new(Kind::Custom(22), &info.full_title)
|
||||||
event_id: event_posted.val.to_hex(),
|
.tag(Tag::parse(imeta)?)
|
||||||
video: res.sha256,
|
.tags([
|
||||||
|
Tag::parse(["title", &info.full_title])?,
|
||||||
|
Tag::parse(["r", input.as_str()])?,
|
||||||
|
]);
|
||||||
|
|
||||||
|
let event_posted = client.send_event_builder(ev).await?;
|
||||||
|
NoviaVideoData {
|
||||||
|
event_id: Some(event_posted.val.to_hex()),
|
||||||
|
video: Some(res.sha256),
|
||||||
|
url: None,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NoviaVideoData {
|
||||||
|
event_id: None,
|
||||||
|
video: Some(res.sha256),
|
||||||
|
url: Some(res.url),
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let status = build_status_for_job(
|
let status = build_status_for_job(
|
||||||
@ -164,6 +182,10 @@ struct TikTokVideo {
|
|||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
struct NoviaVideoData {
|
struct NoviaVideoData {
|
||||||
event_id: String,
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
video: String,
|
event_id: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
video: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
url: Option<String>,
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user