import { Hono } from "hono"; import { logger } from "hono/logger"; import { bearerAuth } from "hono/bearer-auth"; import youtubeApiPlayer from "./youtube_api_routes/player.ts"; import invidiousRouteLatestVersion from "./invidious_routes/latestVersion.ts"; import invidiousRouteDashManifest from "./invidious_routes/dashManifest.ts"; import invidiousCaptionsApi from "./invidious_routes/captions.ts"; import invidiousVideosApi from "./invidious_routes/videos.ts"; import invidiousSearchApi from "./invidious_routes/search.ts"; import invidiousChannelsApi from "./invidious_routes/channels.ts"; import invidiousPlaylistsApi from "./invidious_routes/playlists.ts"; import invidiousMixesApi from "./invidious_routes/mixes.ts"; import getDownloadHandler from "./invidious_routes/download.ts"; import videoPlaybackProxy from "./videoPlaybackProxy.ts"; import type { Config } from "../lib/helpers/config.ts"; import metrics from "./metrics.ts"; import health from "./health.ts"; export const companionRoutes = ( app: Hono, config: Config, ) => { const loggerUnixSocket = (message: string, ...rest: string[]) => { message = message.replace("//localhost/", "/"); console.log(message, ...rest); }; if (config.server.use_unix_socket) { app.use("*", logger(loggerUnixSocket)); } else { app.use("*", logger()); } app.use( "/youtubei/v1/*", bearerAuth({ token: config.server.secret_key, }), ); app.route("/youtubei/v1", youtubeApiPlayer); app.get("/", (c) => { return c.text("(this is not actual invidious its just designed to be used in place of it a custom invidious based on invidious-companion)"); }); app.route("/latest_version", invidiousRouteLatestVersion); // Needs app for app.request in order to call /latest_version endpoint app.post("/download", getDownloadHandler(app)); app.route("/api/manifest/dash/id", invidiousRouteDashManifest); app.route("/api/v1/captions", invidiousCaptionsApi); app.route("/api/v1/videos", invidiousVideosApi); app.route("/api/v1/search", invidiousSearchApi); app.route("/api/v1/channels", invidiousChannelsApi); app.route("/api/v1/playlists", invidiousPlaylistsApi); app.route("/api/v1/mixes", invidiousMixesApi); app.route("/videoplayback", videoPlaybackProxy); }; export const miscRoutes = ( app: Hono, config: Config, regenerateSession?: () => Promise, ) => { app.route("/healthz", health); if (config.server.enable_metrics) { app.route("/metrics", metrics); } app.get("/api/set/proxy/:proxy", async (c) => { let proxy = c.req.param("proxy"); if (proxy) { proxy = decodeURIComponent(proxy); config.networking.proxy = proxy; console.log(`[INFO] Proxy updated to: ${proxy}`); if (regenerateSession) { console.log("[INFO] Triggering session regeneration..."); await regenerateSession(); } return c.text(`Proxy updated to: ${proxy}`); } return c.text("Invalid proxy", 400); }); };