diff --git a/.gitea/workflows/container.yaml b/.gitea/workflows/container.yaml deleted file mode 100644 index e48b3fd..0000000 --- a/.gitea/workflows/container.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: Build Multiarch Container Image -on: [push] -jobs: - call-reusable-workflow: - uses: container/multiarch-build-workflow/.gitea/workflows/build.yaml@main - with: - repository: ${{ gitea.repository }} - ref_name: ${{ gitea.ref_name }} - sha: ${{ gitea.sha }} - registry_url: ${{ secrets.REGISTRY_URL }} - registry_user: ${{ secrets.REGISTRY_USER }} - registry_pw: ${{ secrets.REGISTRY_PW }} diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..efb62a7 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,11 @@ +pipeline: + publish-docker-image: + image: plugins/kaniko + settings: + repo: docker.io/thallian/fp-feed + tags: latest,${CI_COMMIT_SHA:0:8},${CI_COMMIT_TAG=pre} + dockerfile: Containerfile + username: + from_secret: DOCKER_USER + password: + from_secret: DOCKER_PW diff --git a/Cargo.lock b/Cargo.lock index bb5d391..e192f66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.6" @@ -65,7 +76,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -91,7 +102,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -115,19 +126,18 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.7.4" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", + "bitflags 1.3.2", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", - "hyper 1.2.0", - "hyper-util", + "http", + "http-body", + "hyper", "itoa", "matchit", "memchr", @@ -149,20 +159,17 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", + "http", + "http-body", "mime", - "pin-project-lite", "rustversion", - "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -183,6 +190,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.5" @@ -209,9 +222,6 @@ name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" -dependencies = [ - "serde", -] [[package]] name = "block-buffer" @@ -266,12 +276,11 @@ dependencies = [ [[package]] name = "config" -version = "0.14.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" dependencies = [ "async-trait", - "convert_case", "json5", "lazy_static", "nom", @@ -284,35 +293,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.3" @@ -338,12 +318,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto-common" version = "0.1.6" @@ -374,7 +348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -506,12 +480,9 @@ dependencies = [ [[package]] name = "dlv-list" -version = "0.5.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" -dependencies = [ - "const-random", -] +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] name = "dtoa" @@ -543,15 +514,9 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "findpenguins-feed" -version = "0.4.2" +version = "0.2.0" dependencies = [ "askama", "axum", @@ -598,9 +563,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -613,9 +578,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -623,15 +588,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -640,38 +605,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -741,27 +706,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 0.2.11", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 1.1.0", - "indexmap 2.2.5", + "http", + "indexmap", "slab", "tokio", "tokio-util", @@ -773,18 +719,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.7.7", +] [[package]] name = "hermit-abi" @@ -817,17 +754,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http-body" version = "0.4.5" @@ -835,32 +761,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http 0.2.11", + "http", "pin-project-lite", ] [[package]] -name = "http-body" -version = "1.0.0" +name = "http-range-header" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "pin-project-lite", -] +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" @@ -893,9 +802,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.21", - "http 0.2.11", - "http-body 0.4.5", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -907,26 +816,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.2", - "http 1.1.0", - "http-body 1.0.0", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", -] - [[package]] name = "hyper-rustls" version = "0.24.1" @@ -934,29 +823,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", - "http 0.2.11", - "hyper 0.14.27", + "http", + "hyper", "rustls", "tokio", "tokio-rustls", ] -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "hyper 1.2.0", - "pin-project-lite", - "socket2 0.5.5", - "tokio", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -980,17 +853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", + "hashbrown", ] [[package]] @@ -1191,12 +1054,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-traits" version = "0.2.17" @@ -1227,9 +1084,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "option-ext" @@ -1239,12 +1096,12 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-multimap" -version = "0.6.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" dependencies = [ "dlv-list", - "hashbrown 0.13.2", + "hashbrown", ] [[package]] @@ -1319,7 +1176,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -1392,7 +1249,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -1430,7 +1287,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -1465,9 +1322,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -1484,9 +1341,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1587,19 +1444,19 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.21", - "http 0.2.11", - "http-body 0.4.5", - "hyper 0.14.27", + "h2", + "http", + "http-body", + "hyper", "hyper-rustls", "ipnet", "js-sys", @@ -1613,7 +1470,6 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", "system-configuration", "tokio", "tokio-rustls", @@ -1643,21 +1499,20 @@ dependencies = [ [[package]] name = "ron" -version = "0.8.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ - "base64", - "bitflags 2.4.1", + "base64 0.13.1", + "bitflags 1.3.2", "serde", - "serde_derive", ] [[package]] name = "rss" -version = "2.0.7" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b2c77eb4450d7d5f98df52c381cd6c4e19b75dad9209a9530b85a44510219a" +checksum = "7e6c0ea0e621c2a3aa34850ebd711526f0ac7385921f57d2430a47cecc7b9cbc" dependencies = [ "atom_syndication", "derive_builder", @@ -1667,9 +1522,9 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.19.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" +checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" dependencies = [ "cfg-if", "ordered-multimap", @@ -1699,7 +1554,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64", + "base64 0.21.5", ] [[package]] @@ -1732,11 +1587,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scraper" -version = "0.19.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b80b33679ff7a0ea53d37f3b39de77ea0c75b12c5805ac43ec0c33b3051af1b" +checksum = "585480e3719b311b78a573db1c9d9c4c1f8010c2dee4cc59c2efe58ea4dbc3e1" dependencies = [ - "ahash", + "ahash 0.8.6", "cssparser", "ego-tree", "getopts", @@ -1777,22 +1632,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -1816,15 +1671,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1892,9 +1738,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" @@ -1973,9 +1819,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -2022,22 +1868,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -2052,13 +1898,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", - "num-conv", "powerfmt", "serde", "time-core", @@ -2073,23 +1918,13 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ - "num-conv", "time-core", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -2107,9 +1942,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -2132,7 +1967,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -2161,36 +1996,11 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" -dependencies = [ - "indexmap 2.2.5", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", ] [[package]] @@ -2211,15 +2021,17 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ "bitflags 2.4.1", "bytes", - "http 1.1.0", - "http-body 1.0.0", - "http-body-util", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", "pin-project-lite", "tower-layer", "tower-service", @@ -2258,7 +2070,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] [[package]] @@ -2348,12 +2160,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - [[package]] name = "unicode-width" version = "0.1.11" @@ -2431,7 +2237,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", "wasm-bindgen-shared", ] @@ -2465,7 +2271,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2580,15 +2386,6 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" -[[package]] -name = "winnow" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" -dependencies = [ - "memchr", -] - [[package]] name = "winreg" version = "0.50.0" @@ -2625,5 +2422,5 @@ checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.39", ] diff --git a/Cargo.toml b/Cargo.toml index 633d6a6..e9b5885 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,27 +1,27 @@ [package] name = "findpenguins-feed" -version = "0.4.2" +version = "0.2.0" edition = "2021" authors = ["Sebastian Hugentobler "] license = "AGPL-3.0-or-later" [dependencies] askama = "0.12.1" -axum = { version = "0.7.4", features = ["tracing"] } -config = { version = "0.14.0", features = ["toml"] } +axum = { version = "0.6.20", features = ["tracing"] } +config = { version = "0.13.3", features = ["toml"] } directories = "5.0.1" fnv = "1.0.7" -futures = "0.3.30" -reqwest = { version = "0.11.24", default-features = false, features = [ +futures = "0.3.29" +reqwest = { version = "0.11.22", default-features = false, features = [ "rustls-tls", ] } -rss = "2.0.7" -scraper = "0.19.0" -serde = "1.0.197" -thiserror = "1.0.57" -time = { version = "0.3.34", features = ["formatting", "parsing", "serde"] } -tokio = { version = "1.36.0", features = ["full"] } -tower-http = { version = "0.5.2", features = ["trace"] } +rss = "2.0.6" +scraper = "0.18.1" +serde = "1.0.192" +thiserror = "1.0.50" +time = { version = "0.3.30", features = ["formatting", "parsing", "serde"] } +tokio = { version = "1.34.0", features = ["full"] } +tower-http = { version = "0.4.4", features = ["trace"] } tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/Containerfile b/Containerfile index 4647635..aa08e08 100644 --- a/Containerfile +++ b/Containerfile @@ -1,23 +1,26 @@ -FROM docker.io/rust:1-alpine3.19 AS builder +FROM docker.io/rust:1-alpine3.18 AS builder + +ARG ARCH=x86_64 RUN apk --no-cache add musl-dev ENV CARGO_CARGO_NEW_VCS="none" ENV CARGO_BUILD_RUSTFLAGS="-C target-feature=+crt-static" +ENV CARGO_BUILD_TARGET="$ARCH-unknown-linux-musl" WORKDIR /work RUN cargo init COPY Cargo.toml Cargo.lock ./ -RUN cargo build --release --target=$(arch)-unknown-linux-musl +RUN cargo build --release COPY . . # ensure rebuilding of the app RUN touch src/main.rs -RUN cargo build --release --target=$(arch)-unknown-linux-musl -RUN cp "./target/$(arch)-unknown-linux-musl/release/findpenguins-feed" /app +RUN cargo build --release +RUN cp "./target/$CARGO_BUILD_TARGET/release/findpenguins-feed" /app FROM scratch diff --git a/src/feeds/mod.rs b/src/feeds/mod.rs index 1c6a0e7..0625139 100644 --- a/src/feeds/mod.rs +++ b/src/feeds/mod.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use std::fmt; -use askama::Template; use futures::future::join_all; use rss::{GuidBuilder, Item, ItemBuilder}; use serde::Deserialize; @@ -9,11 +8,9 @@ use time::format_description::well_known::iso8601::FormattedComponents; use time::format_description::well_known::{iso8601, Iso8601}; use time::Date; -use crate::scrapers::{page_url, Media}; +use crate::scrapers::page_url; use crate::{hash, scrapers}; -use self::template::FeedEntryTemplate; - pub mod route; pub mod template; @@ -37,7 +34,7 @@ pub struct Footprint { pub url: String, pub date: Date, pub page: u8, - pub media: Vec, + pub images: Vec, } const ISO8601_DATE: u128 = iso8601::Config::DEFAULT @@ -47,26 +44,34 @@ const ISO8601_DATE: u128 = iso8601::Config::DEFAULT impl Footprint { pub fn into_rss_item(self, root_url: &str) -> Item { let text = if String::is_empty(&self.text) { - "No text" + "No description" } else { &self.text }; - - let page_url = page_url(root_url, self.page); - - let template = FeedEntryTemplate { - text: text.to_string(), - page_url, - page: self.page, - media: self.media, - }; - let content = template.render().ok(); + // injection, I know + let desc = format!( + "{}

---

from page {}", + text, + page_url(root_url, self.page), + self.page + ); + // injection again + let content = self + .images + .iter() + .map(|x| format!("
", x)) + .fold(String::new(), |mut a, b| { + a.reserve(b.len()); + a.push_str(&b); + a + }); ItemBuilder::default() .title(Some(self.title)) .pub_date(self.date.format(&Iso8601::).ok()) .link(Some(self.url.clone())) - .content(content) + .description(Some(desc)) + .content(Some(content)) .guid(Some(GuidBuilder::default().value(self.url).build())) .build() } diff --git a/src/feeds/template.rs b/src/feeds/template.rs index 4848edf..6fc8f50 100644 --- a/src/feeds/template.rs +++ b/src/feeds/template.rs @@ -1,7 +1,5 @@ use askama::Template; -use crate::scrapers::Media; - use super::Feed; #[derive(Template)] @@ -9,12 +7,3 @@ use super::Feed; pub struct FeedsTemplate { pub feeds: Vec, } - -#[derive(Template)] -#[template(path = "feed_entry.html")] -pub struct FeedEntryTemplate { - pub text: String, - pub page_url: String, - pub page: u8, - pub media: Vec, -} diff --git a/src/main.rs b/src/main.rs index 0b698d9..2d22f9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,10 +22,8 @@ async fn main() { let app = app::create(feeds); tracing::debug!("Listening on {}", addr); - let listener = tokio::net::TcpListener::bind(&addr) - .await - .expect("Faileds to listen on the specified address"); - axum::serve(listener, app.into_make_service()) + axum::Server::bind(&addr) + .serve(app.into_make_service()) .with_graceful_shutdown(signals::shutdown()) .await .expect("Failed to start server"); diff --git a/src/routes.rs b/src/routes.rs index 6747682..a6ac4bc 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -1,10 +1,10 @@ use std::sync::Arc; -use axum::{routing::get, Router}; +use axum::{body::Body, routing::get, Router}; use crate::{app::AppState, feeds}; -pub fn all() -> Router> { +pub fn all() -> Router, Body> { Router::new() .route("/", get(feeds::route::feeds)) .route("/feeds/:id", get(feeds::route::feed)) diff --git a/src/scrapers.rs b/src/scrapers.rs index 0423033..32b6a02 100644 --- a/src/scrapers.rs +++ b/src/scrapers.rs @@ -1,6 +1,5 @@ use crate::feeds::Footprint; -use scraper::{selector::CssLocalName, CaseSensitivity, Element, ElementRef, Html, Selector}; -use serde::Deserialize; +use scraper::{ElementRef, Html, Selector}; use thiserror::Error; use time::{format_description, Date}; @@ -12,12 +11,6 @@ pub enum ScrapeError { SelectorError(#[from] scraper::error::SelectorErrorKind<'static>), } -#[derive(Clone, Debug, Deserialize)] -pub enum Media { - Image(String), - Video(String), -} - pub async fn feed_title(feed_url: &str) -> Result { let resp = reqwest::get(feed_url).await?.text().await?; let doc = Html::parse_document(&resp); @@ -31,7 +24,7 @@ pub async fn feed_title(feed_url: &str) -> Result { } pub async fn fetch_footprints(feed_url: &str) -> Result, ScrapeError> { - let footprint_selector = Selector::parse("li.footprint article.footprint-container")?; + let footprint_selector = Selector::parse("li.footprint div.footprint-container")?; let footprint_title_selector = Selector::parse("div.title > h2.headline > a")?; let footprint_date_selector = Selector::parse("div.title > span.date > span.desc")?; let more_selector = Selector::parse("a#footprintListLoadMore")?; @@ -87,7 +80,7 @@ fn parse_footprint( .trim() .to_string(); - let media = scrape_media_links(footprint_el).ok()?; + let images = scrape_img_links(&footprint_el).ok()?; Some(Footprint { title, @@ -95,7 +88,7 @@ fn parse_footprint( date, text, page, - media, + images, }) } @@ -114,44 +107,26 @@ fn attr_from_el(el: &ElementRef, attribute: &str) -> Option { Some(el.value().attr(attribute)?.to_string()) } -fn scrape_media_links(footprint_el: &ElementRef) -> Result, ScrapeError> { - let main_media_selector = Selector::parse("div.images-container > a.image")?; - let other_media_selector = - Selector::parse("div.images-container > div.thumbs > a.image.thumb.image")?; +fn scrape_img_links(footprint_el: &ElementRef) -> Result, ScrapeError> { + let main_img_selector = Selector::parse("div.images-container > a.image")?; + let other_img_selector = Selector::parse("div.images-container > div.thumbs > a.image.thumb")?; - let mut media = Vec::new(); + let mut img_urls = Vec::new(); - if let Some(main_media) = footprint_el.select(&main_media_selector).next() { - if let Some(main_media) = concrete_media(&main_media) { - media.push(main_media); + if let Some(main_img) = footprint_el.select(&main_img_selector).next() { + if let Some(main_img_url) = attr_from_el(&main_img, "data-url") { + img_urls.push(main_img_url); } } - for other_media in footprint_el.select(&other_media_selector) { - if let Some(other_media) = concrete_media(&other_media) { - media.push(other_media); + for img in footprint_el.select(&other_img_selector) { + if let Some(main_img_url) = attr_from_el(&img, "data-url") { + img_urls.push(main_img_url); } } + let img_urls = img_urls.iter().map(|x| format!("https:{}", x)).collect(); - Ok(media) -} - -fn concrete_media(media: &ElementRef) -> Option { - if let Some(media_url) = attr_from_el(media, "data-url") { - let media_url = format!("https:{}", media_url); - Some( - if media.has_class( - &CssLocalName("photo".into()), - CaseSensitivity::AsciiCaseInsensitive, - ) { - Media::Image(media_url) - } else { - Media::Video(media_url) - }, - ) - } else { - None - } + Ok(img_urls) } pub fn page_url(feed_url: &str, page: u8) -> String { diff --git a/templates/feed_entry.html b/templates/feed_entry.html deleted file mode 100644 index b103c08..0000000 --- a/templates/feed_entry.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ text }}

----

-from page {{ page }}
- -{% for media_entry in media %} {% match media_entry %} {% when Media::Image with -(url) %} -
-{% when Media::Video with (url) %} - -
-{% endmatch %} {% endfor %}