From 00ce87269d2f9c80ee04baa3d3e98f709ed07c9f Mon Sep 17 00:00:00 2001 From: litneet64 Date: Fri, 19 Apr 2024 02:47:24 -0400 Subject: [PATCH] add rsshub --- apps/rsshub/config.json | 26 +++ apps/rsshub/data/app.env | 331 ++++++++++++++++++++++++++++ apps/rsshub/docker-compose.yml | 63 ++++++ apps/rsshub/metadata/description.md | 29 +++ apps/rsshub/metadata/logo.jpg | Bin 0 -> 7854 bytes 5 files changed, 449 insertions(+) create mode 100644 apps/rsshub/config.json create mode 100644 apps/rsshub/data/app.env create mode 100644 apps/rsshub/docker-compose.yml create mode 100644 apps/rsshub/metadata/description.md create mode 100644 apps/rsshub/metadata/logo.jpg diff --git a/apps/rsshub/config.json b/apps/rsshub/config.json new file mode 100644 index 00000000..183e1434 --- /dev/null +++ b/apps/rsshub/config.json @@ -0,0 +1,26 @@ +{ + "name": "RSSHub", + "available": true, + "port": 8220, + "exposable": true, + "id": "rsshub", + "description": "RSSHub is an open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything.", + "tipi_version": 1, + "version": "2024-04-17", + "categories": ["utilities", "media", "automation"], + "short_desc": "Everything is RSSible with RSSHub", + "author": "https://github.com/DIYgod", + "source": "https://github.com/DIYgod/RSSHub", + "website": "https://docs.rsshub.app/", + "url_suffix": "", + "form_fields": [ + { + "type": "password", + "label": "Access Key", + "max": 256, + "min": 4, + "required": false, + "env_variable": "ACCESS_KEY" + } + ] +} diff --git a/apps/rsshub/data/app.env b/apps/rsshub/data/app.env new file mode 100644 index 00000000..3b27c726 --- /dev/null +++ b/apps/rsshub/data/app.env @@ -0,0 +1,331 @@ +# Based on...: +# https://docs.rsshub.app/deploy/config +# +# and source-code values, as official docs are incomplete: +# https://github.com/DIYgod/RSSHub/blob/master/lib/config.ts +# + +################################# +# Network Configuration +################################# +# +#PORT=1200 +#LISTEN_INADDR_ANY=true +#REQUEST_RETRY=2 +#REQUEST_TIMEOUT=30000 +UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" +#NO_RANDOM_UA=null + +################################# +# CORS Requests +################################# +# +#ALLOW_ORIGIN="*" + +################################# +# Cache Configurations +################################# +# +CACHE_TYPE="redis" +#CACHE_REQUEST_TIMEOUT=60 +#CACHE_EXPIRE=300 +#CACHE_CONTENT_EXPIRE=3600 +REDIS_URL="redis://redis:6379/" +#MEMORY_MAX=256 + +################################# +# Proxy Configurations +################################# +# +#PROXY_PROTOCOL="" +#PROXY_HOST="" +#PROXY_PORT="" +#PROXY_URI="{protocol}://{host}:{port}" +#PROXY_AUTH="BASE64_BASIC_AUTH_STRING" (Proxy-Authorization: Basic ${PROXY_AUTH}) +#PROXY_URL_REGEX=".*" +#PROXY_STRATEGY=all/on_retry +#PAC_URI="" +#PAC_SCRIPT="" + +################################# +# Access Control Configurations +################################# +# +#ACCESS_KEY="yourpassword" + +################################# +# Logging Configurations +################################# +# +#DEBUG_INFO=true +#LOGGER_LEVEL="info" +#NO_LOGFILES=false +#SHOW_LOGGER_TIMESTAMP=false +#SENTRY="" +#SENTRY_ROUTE_TIMEOUT=30000 + +################################# +# Image Processing +################################# +# +#HOTLINK_TEMPLATE="${protocol}//${host}${pathname}" +#HOTLINK_INCLUDE_PATHS="" +#HOTLINK_EXCLUDE_PATHS="" + +################################# +# Experimental Features +################################# +# +#ALLOW_USER_HOTLINK_TEMPLATE=false +#FILTER_REGEX_ENGINE="re2" +#ALLOW_USER_SUPPLY_UNSAFE_DOMAIN=false + +################################# +# Other Application Configurations +################################# +# +#DISALLOW_ROBOT=true +#ENABLE_CLUSTER=false +NODE_ENV="production" +#NODE_NAME="" +PUPPETEER_WS_ENDPOINT="ws://browserless:3000" +#CHROMIUM_EXECUTABLE_PATH="" +#TITLE_LENGTH_LIMIT=150 +#OPENAI_API_KEY="" +#OPENAI_MODEL="gpt-3.5-turbo-16k" +#OPENAI_TEMPERATURE=0.2 +#OPENAI_MAX_TOKENS=0 +#OPENAI_API_ENDPOINT="https://api.openai.com/v1" +#OPENAI_PROMPT="Please summarize the following article and reply with markdown format." +#REMOTE_CONFIG="" +#REMOTE_CONFIG_AUTH="" (Authorization: Basic ${REMOTE_CONFIG_AUTH}) + +################################# +# Route-specific Configurations +################################# +# +## BiliBili ## +#BILIBILI_COOKIE_{uid}="" +#BILIBILI_DM_IMG_LIST="[{"x":2721,"y":615,"z":0,"timestamp":29,"type":0}]" +# +## BitBucket ## +#BITBUCKET_USERNAME="" +#BITBUCKET_PASSWORD="" +# +## BTBYR ## +#BTBYR_HOST="" +#BTBYR_COOKIE="" +# +## BUPT ## +#BUPT_PORTAL_COOKIE="" +# +## Civitai ## +#CIVITAI_COOKIE="" +# +## Dida365 ## +#DIDA365_USERNAME="" +#DIDA365_PASSWORD="" +# +## Discord ## +#DISCORD_AUTHORIZATION="" +# +## Discourse ## +#DISCOURSE_CONFIG_{id}="{"link":link,"key":key}" +# +## Discuz ## +#DISCUZ_COOKIE_{cid}=0 +# +## Disqus ## +#DISQUS_API_KEY="" +# +## Douban +#DOUBAN_COOKIE="" +# +## E-Hentai ## +#EH_IPB_MEMBER_ID="" +#EH_IPB_PASS_HASH="" +#EH_SK="" +#EH_IGNEOUS="" +#EH_STAR="" +#EH_IMG_PROXY="" +# +## Email ## +#EMAIL_CONFIG_{email}="password=password&host=server&port=port" +# +## Fanfou ## +#FANFOU_CONSUMER_KEY="" +#FANFOU_CONSUMER_SECRET="" +#FANFOU_USERNAME="" +#FANFOU_PASSWORD="" +# +## Fantia ## +#FANTIA_COOKIE +# +## Game4399 ## +#GAME_4399="" +# +## GitHub ## +#GITHUB_ACCESS_TOKEN="" +# +## Gitee ## +#GITEE_ACCESS_TOKEN="" +# +## Google ## +#GOOGLE_FONTS_API_KEY="" +# +## Hefeng ## +#HFENG_KEY="" +# +## Infzm ## +#INFZM_COOKIE="" +# +## Initium ## +#INITIUM_USERNAME="" +#INITIUM_PASSWORD="" +#INITIUM_BEARER_TOKEN="" +#INITIUM_IAP_RECEIPT="" +# +## Instagram ## +#IG_USERNAME="" +#IG_PASSWORD="" +#IG_PROXY="" +#IG_COOKIE="" +# +## Iwara ## +#IWARA_USERNAME="" +#IWARA_PASSWORD="" +# +## JavDB ## +#JAVDB_SESSION="" +# +## Last.FM ## +#LASTFM_API_KEY="" +# +## LightNovel.us ## +#SECURITY_KEY="{security_key: 3cXXXX}" +# +## Manhuagui ## +#MHGUI_COOKIE="" +# +## Mastodon ## +#MASTODON_API_HOST="" +#MASTODON_API_ACCESS_TOKEN="" +#MASTODON_API_ACCT_DOMAIN="" +# +## Medium ## +#MEDIUM_COOKIE_{username}="" +#MEDIUM_ARTICLE_COOKIE="" +# +## MiHoyo ## +#MIHOYO_COOKIE="" +# +## MiniFlux ## +#MINIFLUX_INSTANCE="" +#MINIFLUX_TOKEN="" +# +## Mox ## +#MOX_COOKIE="" +# +## Netease Cloud Music ## +#NCM_COOKIES="" +# +## NewRank ## +#NEWRANK_COOKIE="" +# +## NGA ## +#NGA_PASSPORT_UID="" +#NGA_PASSPORT_CID="" +# +## NHentai ## +#NHENTAI_USERNAME="" +#NHENTAI_PASSWORD="" +# +## Notion ## +#NOTION_TOKEN="" +# +## Pianyuan ## +#PIANYUAN_COOKIE="" +# +## Pixabay ## +#PIXABAY_KEY="" +# +## Pixiv ## +#PIXIV_REFRESHTOKEN="" +#PIXIV_BYPASS_CDN=false +#PIXIV_BYPASS_HOSTNAME="public-api.secure.pixiv.net" +#PIXIV_BYPASS_DOH="https://1.1.1.1/dns-query" +#PIXIV_IMG_PROXY="https://i.pixiv.re" +# +## Pixiv Fanbox ## +#FANBOX_SESSION_ID="" +# +## PKubbs ## +#PKUBBS_COOKIE="" +# +## Qingting ## +#QINGTING_ID="" +# +## Saraba1st ## +#SARABA1ST_COOKIE="" +# +## Sehuatang ## +#SEHUATANG_COOKIE="" +# +## SCBoy ## +#SCBOY_BBS_TOKEN="" +# +## Sci-Hub ## +#SCIHUB_HOST="https://sci-hub.se/" +# +## Spotify ## +#SPOTIFY_CLIENT_ID="" +#SPOTIFY_CLIENT_SECRET="" +#SPOTIFY_REFRESHTOKEN="" +# +## Telegram ## +#TELEGRAM_TOKEN="" +#TELEGRAM_SESSION="" +#TELEGRAM_API_ID="" +#TELEGRAM_API_HASH="" +#TELEGRAM_MAX_CONCURRENT_DOWNLOADS="" +# +## TopHub ## +#TOPHUB_COOKIE="" +# +## Twitter / X ## +#TWITTER_OAUTH_TOKEN="" +#TWITTER_OAUTH_TOKEN_SECRET="" +#TWITTER_USERNAME="" +#TWITTER_PASSWORD="" +#TWITTER_COOKIE="" +# +## Weibo ## +#WEIBO_APP_KEY="" +#WEIBO_APP_SECRET="" +#WEIBO_COOKIES="" +#WEIBO_REDIRECT_URL="" +# +## Wenku8 ## +#WENKU8_COOKIE="" +# +## xiaoyuzhou ## +#XIAOYUZHOU_ID="" +#XIAOYUZHOU_TOKEN="" +# +## Ximalaya ## +#XIMALAYA_TOKEN="" +# +## Xueqiu ## +#XUEQIU_COOKIES="" +# +## YouTube ## +#YOUTUBE_KEY="" +#YOUTUBE_CLIENT_ID="" +#YOUTUBE_CLIENT_SECRET="" +#YOUTUBE_REFRESH_TOKEN="" +# +## Zhihu ## +#ZHIHU_COOKIES="" +# +## Zodgame ## +#ZODGAME_COOKIE="" \ No newline at end of file diff --git a/apps/rsshub/docker-compose.yml b/apps/rsshub/docker-compose.yml new file mode 100644 index 00000000..295547a8 --- /dev/null +++ b/apps/rsshub/docker-compose.yml @@ -0,0 +1,63 @@ +version: '3.9' + +services: + rsshub: + image: diygod/rsshub:2024-04-17 + container_name: rsshub_main + restart: unless-stopped + ports: + - ${APP_PORT}:1200 + environment: + TZ: ${TZ} + env_file: + - ${APP_DATA_DIR}/data/app.env + networks: + - tipi_main_network + depends_on: + - redis + - browserless + labels: + # Main + traefik.enable: true + traefik.http.middlewares.rss-web-redirect.redirectscheme.scheme: https + traefik.http.services.rsshub.loadbalancer.server.port: 1200 + # Web + traefik.http.routers.rss-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rss-insecure.entrypoints: web + traefik.http.routers.rss-insecure.service: rsshub + traefik.http.routers.rss-insecure.middlewares: rss-web-redirect + # Websecure + traefik.http.routers.rss.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.rss.entrypoints: websecure + traefik.http.routers.rss.service: rsshub + traefik.http.routers.rss.tls.certresolver: myresolver + # Local domain + traefik.http.routers.rss-local-insecure.rule: Host(`rsshub.${LOCAL_DOMAIN}`) + traefik.http.routers.rss-local-insecure.entrypoints: web + traefik.http.routers.rss-local-insecure.service: rsshub + traefik.http.routers.rss-local-insecure.middlewares: rss-web-redirect + # Local domain secure + traefik.http.routers.rss-local.rule: Host(`rsshub.${LOCAL_DOMAIN}`) + traefik.http.routers.rss-local.entrypoints: websecure + traefik.http.routers.rss-local.service: rsshub + traefik.http.routers.rss-local.tls: true + + browserless: + image: browserless/chrome + container_name: rsshub_browserless + restart: unless-stopped + ulimits: + core: + hard: 0 + soft: 0 + networks: + - tipi_main_network + + redis: + image: redis:alpine + container_name: rsshub_redis + restart: unless-stopped + volumes: + - ${APP_DATA_DIR}/data/redis:/data + networks: + - tipi_main_network diff --git a/apps/rsshub/metadata/description.md b/apps/rsshub/metadata/description.md new file mode 100644 index 00000000..dde899dc --- /dev/null +++ b/apps/rsshub/metadata/description.md @@ -0,0 +1,29 @@ +![](https://camo.githubusercontent.com/ceaf8f7b5c2b0f5b71013f5553cd4e71dfbc47787928a2ec1cfe0e41a7a0b99c/68747470733a2f2f646f63732e7273736875622e6170702f696d672f6c6f676f2e706e67) + +# RSSHub + +## Introduction + +Introduction + +RSSHub is an open source, easy to use, and extensible RSS feed generator. It's capable of generating RSS feeds from pretty much everything. + +RSSHub delivers millions of contents aggregated from all kinds of sources, our vibrant open source community is ensuring the deliver of RSSHub's new routes, new features and bug fixes. + +RSSHub can be used with browser extension [RSSHub Radar](https://github.com/DIYgod/RSSHub-Radar) and mobile auxiliary app [RSSBud (iOS)](https://github.com/Cay-Zhang/RSSBud) and [RSSAid (Android)](https://github.com/LeetaoGoooo/RSSAid) + +[English docs](https://docs.rsshub.app/) | [Telegram Group](https://t.me/rsshub) | [Telegram Channel](https://t.me/awesomeRSSHub) | [Twitter](https://twitter.com/intent/follow?screen_name=_RSSHub) | [中文文档](https://docs.rsshub.app/zh/) + + +## Configuration + +Must be done via environment variables, either through a custom app.env file or directly modifying the docker-compose.yml file, as detailed in https://runtipi.io/docs/guides/customize-app-config. + +More info related to available configuration envvars for RSSHub can be found on https://docs.rsshub.app/deploy/config. + +## Related Projects + +- [RSSHub Radar](https://github.com/DIYgod/RSSHub-Radar): A browser extension that can help you quickly discover and subscribe to the RSS and RSSHub of current websites. +- [RSSBud](https://github.com/Cay-Zhang/RSSBud): RSSHub Radar for iOS platform, designed specifically for mobile ecosystem optimization. +- [RSSAid](https://github.com/LeetaoGoooo/RSSAid): RSSHub Radar for Android platform built with Flutter. +- [DocSearch](https://github.com/Fatpandac/DocSearch): Link RSSHub DocSearch into Raycast diff --git a/apps/rsshub/metadata/logo.jpg b/apps/rsshub/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ba142fea671138b9b6b2c237058b924c375a782 GIT binary patch literal 7854 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 Cb5SP% literal 0 HcmV?d00001