mirror of
https://framagit.org/veretcle/oolatoocs.git
synced 2025-07-20 12:31:18 +02:00
Merge branch '10-better-embed-links-for-bsky' into 'main'
✨: add embed card when available Closes #10 See merge request veretcle/oolatoocs!29
This commit is contained in:
14
Cargo.lock
generated
14
Cargo.lock
generated
@@ -494,9 +494,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.16"
|
version = "0.2.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
|
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
@@ -1645,9 +1645,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "native-tls"
|
name = "native-tls"
|
||||||
version = "0.2.12"
|
version = "0.2.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
|
checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
@@ -1806,7 +1806,7 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oolatoocs"
|
name = "oolatoocs"
|
||||||
version = "4.1.4"
|
version = "4.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atrium-api",
|
"atrium-api",
|
||||||
"bsky-sdk",
|
"bsky-sdk",
|
||||||
@@ -1830,9 +1830,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.68"
|
version = "0.10.69"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
|
checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.8.0",
|
"bitflags 2.8.0",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "oolatoocs"
|
name = "oolatoocs"
|
||||||
version = "4.1.4"
|
version = "4.2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
@@ -21,7 +21,7 @@ serde = { version = "^1.0", features = ["derive"] }
|
|||||||
tokio = { version = "^1.33", features = ["rt-multi-thread", "macros"] }
|
tokio = { version = "^1.33", features = ["rt-multi-thread", "macros"] }
|
||||||
toml = "^0.8"
|
toml = "^0.8"
|
||||||
bsky-sdk = "^0.1"
|
bsky-sdk = "^0.1"
|
||||||
atrium-api = "^0.24"
|
atrium-api = { version = "^0.24", features = ["namespace-appbsky"] }
|
||||||
image = "^0.25"
|
image = "^0.25"
|
||||||
webp = "^0.3"
|
webp = "^0.3"
|
||||||
|
|
||||||
|
43
src/bsky.rs
43
src/bsky.rs
@@ -11,7 +11,10 @@ use bsky_sdk::{
|
|||||||
use futures::{stream, StreamExt};
|
use futures::{stream, StreamExt};
|
||||||
use image::ImageReader;
|
use image::ImageReader;
|
||||||
use log::{debug, error, warn};
|
use log::{debug, error, warn};
|
||||||
use megalodon::entities::attachment::{Attachment, AttachmentType};
|
use megalodon::entities::{
|
||||||
|
attachment::{Attachment, AttachmentType},
|
||||||
|
card::Card,
|
||||||
|
};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::{error::Error, fs::exists, io::Cursor};
|
use std::{error::Error, fs::exists, io::Cursor};
|
||||||
use webp::*;
|
use webp::*;
|
||||||
@@ -145,7 +148,43 @@ async fn get_record(
|
|||||||
Ok(record)
|
Ok(record)
|
||||||
}
|
}
|
||||||
|
|
||||||
// it’s ugly af but it gets the job done for now
|
/// Generate an embed card record into Bsky
|
||||||
|
/// If the preview image does not exist or fails to upload, it is simply ignored
|
||||||
|
pub async fn generate_embed_records(
|
||||||
|
bsky: &BskyAgent,
|
||||||
|
card: &Card,
|
||||||
|
) -> Option<atrium_api::types::Union<atrium_api::app::bsky::feed::post::RecordEmbedRefs>> {
|
||||||
|
// uploads the image card, if it fails, simply ignore everything
|
||||||
|
let blob = if let Some(url) = &card.image {
|
||||||
|
if let Ok(image_blob) = upload_media(true, bsky, url).await {
|
||||||
|
Some(image_blob.blob.clone())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
let record_card = atrium_api::app::bsky::embed::external::ExternalData {
|
||||||
|
description: card.description.clone(),
|
||||||
|
thumb: blob,
|
||||||
|
title: card.title.clone(),
|
||||||
|
uri: card.url.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(atrium_api::types::Union::Refs(
|
||||||
|
atrium_api::app::bsky::feed::post::RecordEmbedRefs::AppBskyEmbedExternalMain(Box::new(
|
||||||
|
atrium_api::app::bsky::embed::external::MainData {
|
||||||
|
external: record_card.into(),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
)),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Generate an array of Bsky media records
|
||||||
|
/// As Bsky does not support multiple video in a record or mix of video and images, video has the
|
||||||
|
/// highest priority
|
||||||
pub async fn generate_media_records(
|
pub async fn generate_media_records(
|
||||||
bsky: &BskyAgent,
|
bsky: &BskyAgent,
|
||||||
media_attach: &[Attachment],
|
media_attach: &[Attachment],
|
||||||
|
15
src/lib.rs
15
src/lib.rs
@@ -18,7 +18,9 @@ mod utils;
|
|||||||
use utils::{generate_multi_tweets, strip_everything};
|
use utils::{generate_multi_tweets, strip_everything};
|
||||||
|
|
||||||
mod bsky;
|
mod bsky;
|
||||||
use bsky::{build_post_record, generate_media_records, get_session, BskyReply};
|
use bsky::{
|
||||||
|
build_post_record, generate_embed_records, generate_media_records, get_session, BskyReply,
|
||||||
|
};
|
||||||
|
|
||||||
use rusqlite::Connection;
|
use rusqlite::Connection;
|
||||||
|
|
||||||
@@ -152,14 +154,21 @@ pub async fn run(config: &Config) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// treats medias
|
// treats medias
|
||||||
let record_medias = generate_media_records(&bluesky, &toot.media_attachments).await;
|
let mut record_embed = generate_media_records(&bluesky, &toot.media_attachments).await;
|
||||||
|
|
||||||
|
// treats embed cards if any
|
||||||
|
if let Some(card) = &toot.card {
|
||||||
|
if record_embed.is_none() {
|
||||||
|
record_embed = generate_embed_records(&bluesky, card).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// posts corresponding tweet
|
// posts corresponding tweet
|
||||||
let record = build_post_record(
|
let record = build_post_record(
|
||||||
&config.bluesky,
|
&config.bluesky,
|
||||||
&tweet_content,
|
&tweet_content,
|
||||||
&toot.language,
|
&toot.language,
|
||||||
record_medias,
|
record_embed,
|
||||||
&record_reply_to,
|
&record_reply_to,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
Reference in New Issue
Block a user