Compare commits

...

31 Commits
v0.4.0 ... main

Author SHA1 Message Date
Paul van Tilburg 49728ea6dd
Bump the version to 0.5.3
Check and lint using Cargo / Check and lint (push) Successful in 2m39s Details
Release / Release (push) Successful in 1m24s Details
Release / Release crate (push) Successful in 4m13s Details
Release / Release Debian package (push) Successful in 6m34s Details
2024-02-27 13:54:20 +01:00
Paul van Tilburg 97b8a0b8bd
Update the changelog 2024-02-27 13:53:20 +01:00
Paul van Tilburg 36cfa2d0ff Bump the dependency on cached to 0.49.2
Check and lint using Cargo / Check and lint (push) Successful in 2m58s Details
2024-02-26 21:19:56 +01:00
Paul van Tilburg a9e0e2417d Cargo update; fixes several security advisories
Fixes RUSTSEC-2024-0003, RUSTSEC-2023-0072 and RUSTSEC-2023-0074.
2024-02-26 21:18:19 +01:00
Paul van Tilburg 263d8272da
Handle paging information begin absent (closes: #17)
Check and lint using Cargo / Check and lint (push) Successful in 3m11s Details
2024-02-16 20:50:23 +01:00
Paul van Tilburg db2d7f3f6c
Add missing date
Check and lint using Cargo / Check and lint (push) Successful in 3m50s Details
2023-11-03 11:52:46 +01:00
Paul van Tilburg 1a8f8d67fa
Bump the version to 0.5.2
Check and lint using Cargo / Check and lint (push) Successful in 2m56s Details
Release / Release (push) Successful in 1m7s Details
Release / Release crate (push) Successful in 4m35s Details
Release / Release Debian package (push) Successful in 7m10s Details
2023-11-03 11:24:44 +01:00
Paul van Tilburg f4f9578c0e
Update the changelog 2023-11-03 11:23:38 +01:00
Paul van Tilburg 6d6895066f
Bump the dependency on cached to 0.46.0 2023-11-03 11:21:49 +01:00
Paul van Tilburg f3c4c5071f
Cargo update; fixes RUSTSEC-2020-0071
This switches to Rocket 0.5-rc.4
Also fix the usage of a deprecated method.
2023-11-03 11:20:18 +01:00
Paul van Tilburg b0cb9d984a
Bump the version to 0.5.1
Check and lint using Cargo / Check and lint (push) Successful in 3m0s Details
Release / Release (push) Successful in 1m29s Details
Release / Release crate (push) Successful in 5m14s Details
Release / Release Debian package (push) Successful in 7m16s Details
2023-08-25 22:09:32 +02:00
Paul van Tilburg 0c49df352d
Update the changelog 2023-08-25 22:08:43 +02:00
Paul van Tilburg 64ee93c553
Build and release a Debian package in a separate job
Release it to the package repository instead of attaching to the
release. Also add the relevant part of the changelog as release notes to
the release and fix some schema-related issues.
2023-08-25 22:08:00 +02:00
Paul van Tilburg 613d50bf30
Bump the dependency on youtube_dl to 0.9.0 2023-08-25 22:03:47 +02:00
Paul van Tilburg fd4a26715e
Cargo update 2023-08-25 22:02:42 +02:00
Paul van Tilburg 8850e16c4a
Cargo update
Check and lint using Cargo / Check and lint (push) Successful in 4m33s Details
2023-06-08 11:11:14 +02:00
Paul van Tilburg 06e0a5ecd5
Bump the dependency on cached to 0.44.0 2023-06-08 11:10:57 +02:00
Paul van Tilburg 29f3975d62
Use the personal Cargo token
Check and lint using Cargo / Check and lint (push) Successful in 3m23s Details
2023-06-08 10:58:50 +02:00
Paul van Tilburg a05106fecf
Bump the version to 0.5.0
Check and lint using Cargo / Check and lint (push) Successful in 4m23s Details
Release / Release (push) Successful in 8m38s Details
Release / Release crate (push) Failing after 4m36s Details
2023-06-08 10:36:38 +02:00
Paul van Tilburg c128bfea62
Update the changelog 2023-06-08 10:36:17 +02:00
Paul van Tilburg f7a5477804
Differentiate between publish and update time
Check and lint using Cargo / Check and lint (push) Successful in 6m42s Details
The `pubDate` field of an item in the feed is meant to be time the item
was published. It should not be bumped if the item is updated in the
backend.

* Introduce a new `published_at` field on `Item`
* Update the Mixcloud and YouTube backends to fill this field
* Use the `published_at` field on `Item` for the `<pubData>` item
  subelement
2023-06-08 10:10:34 +02:00
Paul van Tilburg 9fc9990c27
No longer configure using a sparse Cargo index for crates.io
Check and lint using Cargo / Check and lint (push) Successful in 3m50s Details
This is the default since Rust 1.70.
2023-06-06 07:46:24 +02:00
Paul van Tilburg 05f88dbb9e
Add a full release workflow
Check and lint using Cargo / Check and lint (push) Successful in 3m19s Details
2023-05-22 20:11:19 +02:00
Paul van Tilburg 409a69604e
Tweak step name 2023-05-22 20:10:45 +02:00
Paul van Tilburg b958734e92
Simplify Gitea Actions check and lint workflow
Check and lint using Cargo / Check and lint (push) Successful in 3m31s Details
2023-04-25 16:36:49 +02:00
Paul van Tilburg cb43d91b64
Bump the version to 0.4.1
Check Details
Lints Details
2023-04-11 19:41:59 +02:00
Paul van Tilburg f75fc513f9
Update the changelog 2023-04-11 19:40:38 +02:00
Paul van Tilburg 5e9486e81a
Cargo update 2023-04-11 19:38:23 +02:00
Paul van Tilburg 0ff54dbf03
Select direct HTTP audio streams only
Select the well-supported, almost always available MP4 container format
that is directly available (so no HLS or DASH). This unfortunately
does reduce the bitrate to 64 kbps.
2023-04-11 19:37:29 +02:00
Paul van Tilburg 1af19270cc
Add missing security fixes
Check Details
Lints Details
2023-03-24 19:34:50 +01:00
Paul van Tilburg 133bc0ac27
Add missing repository field 2023-03-24 19:29:21 +01:00
10 changed files with 1139 additions and 779 deletions

View File

@ -1,83 +0,0 @@
name: "Check, Test and Lint Using Cargo"
on:
- push
- pull_request
- workflow_dispatch
jobs:
check:
name: Check
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Install stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Use sparse Cargo index for crates.io
run: echo -e '[registries.crates-io]\nprotocol = "sparse"' >> /root/.cargo/config.toml
- name: Run cargo check
uses: https://github.com/actions-rs/cargo@v1
with:
command: check
# TODO: Add a test suite first!
# test:
# name: Test Suite
# runs-on: debian-latest
# steps:
# - name: Checkout sources
# uses: actions/checkout@v3
#
# - name: Install stable toolchain
# uses: https://github.com/actions-rs/toolchain@v1
# with:
# profile: minimal
# toolchain: stable
# override: true
#
# - name: Use sparse Cargo index for crates.io
# run: echo -e '[registries.crates-io]\nprotocol = "sparse"' >> /root/.cargo/config.toml
#
# - name: Run cargo test
# uses: https://github.com/actions-rs/cargo@v1
# with:
# command: test
# args: --all-features
lints:
name: Lints
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Install stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt, clippy
- name: Use sparse Cargo index for crates.io
run: echo -e '[registries.crates-io]\nprotocol = "sparse"' >> /root/.cargo/config.toml
- name: Run cargo fmt
uses: https://github.com/actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
- name: Run cargo clippy
uses: https://github.com/actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings

View File

@ -0,0 +1,46 @@
name: "Check and lint using Cargo"
on:
- pull_request
- push
- workflow_dispatch
jobs:
check_lint:
name: Check and lint
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
- name: Install Rust stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt, clippy
- name: Run cargo check
uses: https://github.com/actions-rs/cargo@v1
with:
command: check
- name: Run cargo clippy
uses: https://github.com/actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
- name: Run cargo fmt
uses: https://github.com/actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
# TODO: Add a test suite first!
# - name: Run cargo test
# uses: https://github.com/actions-rs/cargo@v1
# with:
# command: test
# args: --all-features

View File

@ -0,0 +1,112 @@
name: "Release"
on:
push:
tags:
- "v*"
jobs:
release:
name: "Release"
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Determine the version of the release
run: |
VERSION=${GITHUB_REF_NAME#v}
echo "Releasing version: $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Get the release notes from the changelog
run: |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
RELEASE_NOTES=$(sed -n -e "/^## \[$VERSION\]/,/^## \[/{//"'!'"p;}" CHANGELOG.md | sed -e '1d;$d')
echo "Release notes:"
echo
echo "$RELEASE_NOTES"
echo "RELEASE_NOTES<<$EOF" >> "$GITHUB_ENV"
echo "$RELEASE_NOTES" >> "$GITHUB_ENV"
echo "$EOF" >> "$GITHUB_ENV"
- name: Install Go
uses: actions/setup-go@v4
with:
go-version: '>=1.20.1'
- name: Release to Gitea
uses: actions/release-action@main
with:
# This is available by default.
api_key: '${{ secrets.RELEASE_TOKEN }}'
files: FIXME
title: 'Release ${{ env.VERSION }}'
body: '${{ env.RELEASE_NOTES }}'
release-crate:
name: "Release crate"
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Rust stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Use sparse Cargo index for crates.io
run: echo -e '[registries.crates-io]\nprotocol = "sparse"' >> /root/.cargo/config.toml
- name: Register the Gitea crate registry with Cargo
run: echo -e '[registries.luon]\nindex = "https://git.luon.net/paul/_cargo-index.git"' >> /root/.cargo/config.toml
- name: Run cargo publish
uses: https://github.com/actions-rs/cargo@v1
env:
# This needs to be provided for the repository; no login necessary as a result.
CARGO_REGISTRIES_LUON_TOKEN: '${{ secrets.CARGO_TOKEN }}'
with:
command: publish
args: --registry luon
release-deb:
name: "Release Debian package"
runs-on: debian-latest
steps:
- name: Checkout sources
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install Rust stable toolchain
uses: https://github.com/actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Install cargo-deb
uses: https://github.com/brndnmtthws/rust-action-cargo-binstall@v1
with:
packages: cargo-deb
- name: Run cargo-deb
uses: https://github.com/actions-rs/cargo@v1
with:
command: deb
- name: Publish Debian package
env:
DEB_REPO_TOKEN: '${{ secrets.DEB_REPO_TOKEN }}'
run: |
curl --config <(printf "user=%s:%s" paul "${DEB_REPO_TOKEN}") \
--upload-file target/debian/podbringer*.deb \
https://git.luon.net/api/packages/paul/debian/pool/bookworm/main/upload

View File

@ -7,6 +7,70 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.5.3] - 2024-02-27
### Changed
* Update dependency on `cached`
### Security
* Update dependencies, fixes security advisories:
* [RUSTSEC-2024-0003](https://rustsec.org/advisories/RUSTSEC-2024-0003)
* [RUSTSEC-2023-0072](https://rustsec.org/advisories/RUSTSEC-2024-0072)
* [RUSTSEC-2023-0074](https://rustsec.org/advisories/RUSTSEC-2024-0072)
### Fixed
* Handle paging information begin absent; fixes short feeds for Mixcloud (#17)
## [0.5.2] - 2023-11-03
### Security
* Update dependencies
([RUSTSEC-2020-0071](https://rustsec.org/advisories/RUSTSEC-2020-0071.html))
### Changed
* Switch to Rocket 0.5 RC4
* Update dependency on `cached`
## [0.5.1] - 2023-08-25
### Changed
* Bump the dependency on `youtube_dl`
* Update release Gitea Actions workflow; add seperate job to release Debian
package to the new repository
### Security
* Update dependencies
([RUSTSEC-2023-0034](https://rustsec.org/advisories/RUSTSEC-2023-0034),
[RUSTSEC-2023-0044](https://rustsec.org/advisories/RUSTSEC-2023-0044),
[RUSTSEC-2023-0052](https://rustsec.org/advisories/RUSTSEC-2023-0052))
## [0.5.0] - 2023-06-08
### Added
* Add full release Gitea Actions workflow
### Changed
* Simplify GItea Actions check and lint workflow
### Fixed
* Differentiate between publish and update time for items
## [0.4.1] - 2023-04-11
### Changed
* Select only direct HTTP MP4 audio streams for the Mixcloud back-end
## [0.4.0] - 2023-03-24
### Added
@ -17,7 +81,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Update dependencies on `cached` and `youtube_dl`
* Update to `rocket` version 0.5.0-rc.3
* Select MP4 audio streams only (experimental)
* Select only MP4 audio streams for the YouTube back-end (experimental)
* Remove parameters from MIME types to prevent clients tripping over them
### Fixed
@ -25,6 +89,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Bump the dependency on `ytextract` (#14)
* Fix typo in the documentation
### Security
* Update dependencies
([RUSTSEC-2021-0145](https://rustsec.org/advisories/RUSTSEC-2021-0145.html),
[RUSTSEC-2020-0016](https://rustsec.org/advisories/RUSTSEC-2020-0016.html),
[RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001.html),
[RUSTSEC-2023-0005](https://rustsec.org/advisories/RUSTSEC-2023-0005.html),
[RUSTSEC-2023-0018](https://rustsec.org/advisories/RUSTSEC-2023-0018.html),
[RUSTSEC-2023-0022](https://rustsec.org/advisories/RUSTSEC-2023-0022.html),
[RUSTSEC-2023-0023](https://rustsec.org/advisories/RUSTSEC-2023-0023.html),
[RUSTSEC-2023-0024](https://rustsec.org/advisories/RUSTSEC-2023-0024.html))
## [0.3.0] - 2022-12-24
### Added
@ -74,7 +150,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Initial release.
[Unreleased]: https://git.luon.net/paul/podbringer/compare/v0.4.0...HEAD
[Unreleased]: https://git.luon.net/paul/podbringer/compare/v0.5.3...HEAD
[0.5.3]: https://git.luon.net/paul/podbringer/compare/v0.5.1..v0.5.2
[0.5.2]: https://git.luon.net/paul/podbringer/compare/v0.5.1..v0.5.2
[0.5.1]: https://git.luon.net/paul/podbringer/compare/v0.5.0..v0.5.1
[0.5.0]: https://git.luon.net/paul/podbringer/compare/v0.4.1..v0.5.0
[0.4.1]: https://git.luon.net/paul/podbringer/compare/v0.4.0..v0.4.1
[0.4.0]: https://git.luon.net/paul/podbringer/compare/v0.3.0..v0.4.0
[0.3.0]: https://git.luon.net/paul/podbringer/compare/v0.2.0..v0.3.0
[0.2.0]: https://git.luon.net/paul/podbringer/compare/v0.1.0..v0.2.0

1546
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,16 @@
[package]
name = "podbringer"
version = "0.4.0"
version = "0.5.3"
authors = ["Paul van Tilburg <paul@luon.net>"]
edition = "2021"
description = "Web service that provides podcasts for services that don't offer them (anymore)"
readme = "README.md"
repository = "https://git.luon.net/paul/podbringer"
license = "MIT"
[dependencies]
async-trait = "0.1.57"
cached = { version = "0.42.0", features = ["async"] }
cached = { version = "0.49.2", features = ["async"] }
chrono = { version = "0.4.19", features = ["serde"] }
enum_dispatch = "0.3.8"
mime-db = "1.6.0"
@ -19,7 +20,7 @@ rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["tera"] }
rss = "2.0.1"
thiserror = "1.0.31"
url = { version = "2.2.2", features = ["serde"] }
youtube_dl = { version = "0.8.0", features = ["tokio"] }
youtube_dl = { version = "0.9.0", features = ["tokio"] }
ytextract = "0.11.2"
[package.metadata.deb]

View File

@ -109,6 +109,9 @@ pub(crate) struct Item {
/// The URL of the image of the item.
pub(crate) image: Option<Url>,
/// The timestamp the item was published.
pub(crate) published_at: DateTime<Utc>,
/// The timestamp the item was last updated.
pub(crate) updated_at: DateTime<Utc>,
}

View File

@ -25,7 +25,7 @@ const FILES_BASE_URL: &str = "https://www.mixcloud.com";
const DEFAULT_BITRATE: u64 = 64 * 1024;
/// The default file (MIME) type used by Mixcloud.
const DEFAULT_FILE_TYPE: &str = "audio/mpeg";
const DEFAULT_FILE_TYPE: &str = "audio/mp4";
/// The default page size.
const DEFAULT_PAGE_SIZE: usize = 50;
@ -66,11 +66,16 @@ impl super::Backend for Backend {
let count = cloudcasts_res.items.len();
cloudcasts.extend(cloudcasts_res.items);
// Check if any paging information is present.
let Some(paging) = cloudcasts_res.paging else {
break;
};
// Continue onto the next URL in the paging, if there is one and the limit was not
// reached.
limit = limit.saturating_sub(count);
offset += count;
match (limit, cloudcasts_res.paging.next) {
match (limit, paging.next) {
(0, Some(_)) => break,
(_, Some(next_url)) => {
cloudcasts_url = Url::parse(&next_url)?;
@ -126,8 +131,8 @@ pub(crate) struct CloudcastsResponse {
#[serde(rename = "data")]
items: Vec<Cloudcast>,
/// The paging information.
paging: CloudcastsPaging,
/// The paging information (if any).
paging: Option<CloudcastsPaging>,
}
/// The Mixcloud paging info.
@ -157,7 +162,10 @@ pub(crate) struct Cloudcast {
/// The tags of the cloudcast.
pub(crate) tags: Vec<Tag>,
/// The time the feed was created/started.
/// The time the feed was created.
pub(crate) created_time: DateTime<Utc>,
/// The time the feed was updated.
pub(crate) updated_time: DateTime<Utc>,
/// The original URL of the cloudcast.
@ -227,6 +235,7 @@ impl From<Cloudcast> for Item {
guid: cloudcast.slug,
keywords,
image: Some(cloudcast.pictures.large),
published_at: cloudcast.created_time,
updated_at: cloudcast.updated_time,
}
}
@ -302,7 +311,9 @@ async fn retrieve_redirect_url(download_key: &str) -> Result<String> {
url.set_path(download_key);
println!("🌍 Determining direct URL for {download_key}...");
let output = YoutubeDl::new(url).run_async().await?;
// Select the well-supported, almost always available MP4 container format that is directly
// available (so no HLS or DASH). This unfortunately does reduce the bitrate to 64 kbps.
let output = YoutubeDl::new(url).format("http").run_async().await?;
if let YoutubeDlOutput::SingleVideo(yt_item) = output {
yt_item.url.ok_or(Error::NoRedirectUrlFound)

View File

@ -6,7 +6,7 @@ use std::path::{Path, PathBuf};
use async_trait::async_trait;
use cached::proc_macro::cached;
use chrono::{DateTime, Utc};
use chrono::{TimeZone, Utc};
use reqwest::Url;
use rocket::futures::StreamExt;
use ytextract::playlist::video::{Error as YouTubeVideoError, Video as YouTubePlaylistVideo};
@ -224,7 +224,9 @@ impl From<YouTubeVideoWithStream> for Item {
.date()
.and_hms_opt(12, 0, 0)
.expect("Invalid hour, minute and/or second");
let updated_at = DateTime::from_utc(timestamp, Utc);
let published_at = Utc.from_utc_datetime(&timestamp);
// There is no updated at timestamp available, really.
let updated_at = published_at;
Item {
title: video.title().to_string(),
@ -236,6 +238,7 @@ impl From<YouTubeVideoWithStream> for Item {
guid: id,
keywords,
image,
published_at,
updated_at,
}
}

View File

@ -2,7 +2,7 @@
use std::path::PathBuf;
use chrono::{DateTime, NaiveDateTime, Utc};
use chrono::{DateTime, NaiveDateTime, TimeZone, Utc};
use rocket::http::uri::Absolute;
use rocket::uri;
use rss::extension::itunes::{
@ -30,7 +30,7 @@ pub(crate) fn construct(backend_id: &str, config: &Config, channel: Channel) ->
.build();
let unix_timestamp = NaiveDateTime::from_timestamp_opt(0, 0)
.expect("Out-of-range seconds or invalid nanoseconds");
let mut last_build = DateTime::from_utc(unix_timestamp, Utc);
let mut last_build = Utc.from_utc_datetime(&unix_timestamp);
let generator = String::from(concat!(
env!("CARGO_PKG_NAME"),
" ",
@ -125,7 +125,7 @@ fn construct_item(
.categories(categories)
.enclosure(Some(enclosure))
.guid(Some(guid))
.pub_date(Some(item.updated_at.to_rfc2822()))
.pub_date(Some(item.published_at.to_rfc2822()))
.itunes_ext(Some(itunes_ext))
.build()
}