Compare commits

...

31 Commits
v0.4.0 ... main

Author SHA1 Message Date
49728ea6dd
Bump the version to 0.5.3
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 2m39s
Release / Release (push) Successful in 1m24s
Release / Release crate (push) Successful in 4m13s
Release / Release Debian package (push) Successful in 6m34s
2024-02-27 13:54:20 +01:00
97b8a0b8bd
Update the changelog 2024-02-27 13:53:20 +01:00
36cfa2d0ff Bump the dependency on cached to 0.49.2
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 2m58s
2024-02-26 21:19:56 +01:00
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
263d8272da
Handle paging information begin absent (closes: #17)
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m11s
2024-02-16 20:50:23 +01:00
db2d7f3f6c
Add missing date
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m50s
2023-11-03 11:52:46 +01:00
1a8f8d67fa
Bump the version to 0.5.2
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 2m56s
Release / Release (push) Successful in 1m7s
Release / Release crate (push) Successful in 4m35s
Release / Release Debian package (push) Successful in 7m10s
2023-11-03 11:24:44 +01:00
f4f9578c0e
Update the changelog 2023-11-03 11:23:38 +01:00
6d6895066f
Bump the dependency on cached to 0.46.0 2023-11-03 11:21:49 +01:00
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
b0cb9d984a
Bump the version to 0.5.1
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m0s
Release / Release (push) Successful in 1m29s
Release / Release crate (push) Successful in 5m14s
Release / Release Debian package (push) Successful in 7m16s
2023-08-25 22:09:32 +02:00
0c49df352d
Update the changelog 2023-08-25 22:08:43 +02:00
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
613d50bf30
Bump the dependency on youtube_dl to 0.9.0 2023-08-25 22:03:47 +02:00
fd4a26715e
Cargo update 2023-08-25 22:02:42 +02:00
8850e16c4a
Cargo update
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 4m33s
2023-06-08 11:11:14 +02:00
06e0a5ecd5
Bump the dependency on cached to 0.44.0 2023-06-08 11:10:57 +02:00
29f3975d62
Use the personal Cargo token
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m23s
2023-06-08 10:58:50 +02:00
a05106fecf
Bump the version to 0.5.0
Some checks failed
Check and lint using Cargo / Check and lint (push) Successful in 4m23s
Release / Release (push) Successful in 8m38s
Release / Release crate (push) Failing after 4m36s
2023-06-08 10:36:38 +02:00
c128bfea62
Update the changelog 2023-06-08 10:36:17 +02:00
f7a5477804
Differentiate between publish and update time
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 6m42s
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
9fc9990c27
No longer configure using a sparse Cargo index for crates.io
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m50s
This is the default since Rust 1.70.
2023-06-06 07:46:24 +02:00
05f88dbb9e
Add a full release workflow
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m19s
2023-05-22 20:11:19 +02:00
409a69604e
Tweak step name 2023-05-22 20:10:45 +02:00
b958734e92
Simplify Gitea Actions check and lint workflow
All checks were successful
Check and lint using Cargo / Check and lint (push) Successful in 3m31s
2023-04-25 16:36:49 +02:00
cb43d91b64
Bump the version to 0.4.1
All checks were successful
Check
Lints
2023-04-11 19:41:59 +02:00
f75fc513f9
Update the changelog 2023-04-11 19:40:38 +02:00
5e9486e81a
Cargo update 2023-04-11 19:38:23 +02:00
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
1af19270cc
Add missing security fixes
All checks were successful
Check
Lints
2023-03-24 19:34:50 +01:00
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] ## [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 ## [0.4.0] - 2023-03-24
### Added ### 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 dependencies on `cached` and `youtube_dl`
* Update to `rocket` version 0.5.0-rc.3 * 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 * Remove parameters from MIME types to prevent clients tripping over them
### Fixed ### 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) * Bump the dependency on `ytextract` (#14)
* Fix typo in the documentation * 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 ## [0.3.0] - 2022-12-24
### Added ### Added
@ -74,7 +150,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Initial release. 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.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.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 [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] [package]
name = "podbringer" name = "podbringer"
version = "0.4.0" version = "0.5.3"
authors = ["Paul van Tilburg <paul@luon.net>"] authors = ["Paul van Tilburg <paul@luon.net>"]
edition = "2021" edition = "2021"
description = "Web service that provides podcasts for services that don't offer them (anymore)" description = "Web service that provides podcasts for services that don't offer them (anymore)"
readme = "README.md" readme = "README.md"
repository = "https://git.luon.net/paul/podbringer"
license = "MIT" license = "MIT"
[dependencies] [dependencies]
async-trait = "0.1.57" 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"] } chrono = { version = "0.4.19", features = ["serde"] }
enum_dispatch = "0.3.8" enum_dispatch = "0.3.8"
mime-db = "1.6.0" mime-db = "1.6.0"
@ -19,7 +20,7 @@ rocket_dyn_templates = { version = "0.1.0-rc.2", features = ["tera"] }
rss = "2.0.1" rss = "2.0.1"
thiserror = "1.0.31" thiserror = "1.0.31"
url = { version = "2.2.2", features = ["serde"] } 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" ytextract = "0.11.2"
[package.metadata.deb] [package.metadata.deb]

View File

@ -109,6 +109,9 @@ pub(crate) struct Item {
/// The URL of the image of the item. /// The URL of the image of the item.
pub(crate) image: Option<Url>, pub(crate) image: Option<Url>,
/// The timestamp the item was published.
pub(crate) published_at: DateTime<Utc>,
/// The timestamp the item was last updated. /// The timestamp the item was last updated.
pub(crate) updated_at: DateTime<Utc>, 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; const DEFAULT_BITRATE: u64 = 64 * 1024;
/// The default file (MIME) type used by Mixcloud. /// 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. /// The default page size.
const DEFAULT_PAGE_SIZE: usize = 50; const DEFAULT_PAGE_SIZE: usize = 50;
@ -66,11 +66,16 @@ impl super::Backend for Backend {
let count = cloudcasts_res.items.len(); let count = cloudcasts_res.items.len();
cloudcasts.extend(cloudcasts_res.items); 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 // Continue onto the next URL in the paging, if there is one and the limit was not
// reached. // reached.
limit = limit.saturating_sub(count); limit = limit.saturating_sub(count);
offset += count; offset += count;
match (limit, cloudcasts_res.paging.next) { match (limit, paging.next) {
(0, Some(_)) => break, (0, Some(_)) => break,
(_, Some(next_url)) => { (_, Some(next_url)) => {
cloudcasts_url = Url::parse(&next_url)?; cloudcasts_url = Url::parse(&next_url)?;
@ -126,8 +131,8 @@ pub(crate) struct CloudcastsResponse {
#[serde(rename = "data")] #[serde(rename = "data")]
items: Vec<Cloudcast>, items: Vec<Cloudcast>,
/// The paging information. /// The paging information (if any).
paging: CloudcastsPaging, paging: Option<CloudcastsPaging>,
} }
/// The Mixcloud paging info. /// The Mixcloud paging info.
@ -157,7 +162,10 @@ pub(crate) struct Cloudcast {
/// The tags of the cloudcast. /// The tags of the cloudcast.
pub(crate) tags: Vec<Tag>, 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>, pub(crate) updated_time: DateTime<Utc>,
/// The original URL of the cloudcast. /// The original URL of the cloudcast.
@ -227,6 +235,7 @@ impl From<Cloudcast> for Item {
guid: cloudcast.slug, guid: cloudcast.slug,
keywords, keywords,
image: Some(cloudcast.pictures.large), image: Some(cloudcast.pictures.large),
published_at: cloudcast.created_time,
updated_at: cloudcast.updated_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); url.set_path(download_key);
println!("🌍 Determining direct URL for {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 { if let YoutubeDlOutput::SingleVideo(yt_item) = output {
yt_item.url.ok_or(Error::NoRedirectUrlFound) yt_item.url.ok_or(Error::NoRedirectUrlFound)

View File

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

View File

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