Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
85420872ab
|
+2
-4
@@ -9,11 +9,9 @@ isHelp() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
echoReadmeInfo() {
|
echoReadmeInfo() {
|
||||||
local -r script="bs/${0##*bs/}"
|
local -r script="bs/${0##*/}"
|
||||||
local info
|
local info
|
||||||
if ! info="$(grep -A1 "## $script" "$readme" | tail -n1)"; then
|
info="$(grep -A1 "## $script" "$readme" | tail -n1)"
|
||||||
info="No info found in $readme for $script"
|
|
||||||
fi
|
|
||||||
cat <<-EOF
|
cat <<-EOF
|
||||||
$info
|
$info
|
||||||
Usage: $script [options]
|
Usage: $script [options]
|
||||||
|
|||||||
@@ -10,16 +10,21 @@ The plan is derived from:
|
|||||||
- Build scripts in `bs/` – only linting is required at this stage.
|
- Build scripts in `bs/` – only linting is required at this stage.
|
||||||
|
|
||||||
## Tasks
|
## Tasks
|
||||||
1. **API client** (DONE)
|
1. **Environment handling** (TODO)
|
||||||
|
- Create a small helper (`@core/env.ts`) that reads `.env.ts` (or falls back to process.env).
|
||||||
|
- Expose constants: `COMMAFEED_URL`, `USERNAME`, `PASSWORD`.
|
||||||
|
1. **API client** (TODO)
|
||||||
- Adds `src/api` folder to the project structure (update also @src/README.md).
|
- Adds `src/api` folder to the project structure (update also @src/README.md).
|
||||||
- Implement a lightweight wrapper around `fetch` in `src/api/fetchAPI.ts`.
|
- Implement a lightweight wrapper around `fetch` in `src/api/index.ts`.
|
||||||
- Build `authHeader()` that returns the Basic‑Auth header using for now hardcoded vars.
|
- Build `authHeader()` that returns the Basic‑Auth header using env vars.
|
||||||
1. **Episode service** (DONE)
|
1. **Episode service** (TODO)
|
||||||
- Add `src/api/episodes.ts` with `getEpisodes(feedId)` and `getEpisode(id)`.
|
- Add `src/api/episodes.ts` with `getEpisodes(feedId)` and `getEpisode(id)`.
|
||||||
- Add data types
|
- Add data types
|
||||||
- Use `/rest/feed/entries?feed_id=${feedId}` endpoint.
|
- Use `/rest/feed/entries?feed_id=${feedId}` endpoint.
|
||||||
|
1. **Route integration** (TODO)
|
||||||
|
- In `app-episodes/routes.ts`, call the service during `enter()` to pre‑fetch episodes.
|
||||||
|
- Pass fetched data via route context or set a global state (e.g., using Lit Labs signals).
|
||||||
1. **Page update** (TODO)
|
1. **Page update** (TODO)
|
||||||
- Add fetching all episodes
|
|
||||||
- Update `<app-episodes>` to reflect loading state(s).
|
- Update `<app-episodes>` to reflect loading state(s).
|
||||||
- Add episode list item component.
|
- Add episode list item component.
|
||||||
- Update `<app-episodes>` to render the episode list received from the route context.
|
- Update `<app-episodes>` to render the episode list received from the route context.
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
import { fetchAPI } from "./fetchAPI.js";
|
|
||||||
|
|
||||||
export interface Episode {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
published: string; // ISO string or similar
|
|
||||||
audio_url?: string;
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface FeedEntriesResponse {
|
|
||||||
entries: Episode[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetches all entries for a given feed.
|
|
||||||
* @param feedId - The ID of the feed.
|
|
||||||
*/
|
|
||||||
export async function getEpisodes(feedId: string= "all"): Promise<Episode[]> {
|
|
||||||
const response = await fetchAPI(`feed/entries?feed_id=${feedId}`);
|
|
||||||
if (!response.ok)
|
|
||||||
throw new Error(`Failed to fetch episodes: ${response.statusText}`);
|
|
||||||
const data = await response.json() as FeedEntriesResponse;
|
|
||||||
return data.entries || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetches a single episode by its ID.
|
|
||||||
* @param id - The ID of the episode.
|
|
||||||
*/
|
|
||||||
export async function getEpisode(id: string): Promise<Episode> {
|
|
||||||
const response = await fetchAPI(`feed/entry/${id}/`);
|
|
||||||
if (!response.ok)
|
|
||||||
throw new Error(`Failed to fetch episode: ${response.statusText}`);
|
|
||||||
return await response.json() as Episode;
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const url_server = "https://rss.jaandrle.cz";
|
|
||||||
const url_base = `${url_server}/rest`;
|
|
||||||
// @ts-expect-error S7016
|
|
||||||
import { users } from "ENV";
|
|
||||||
const [ username, password ] = users[0].split(':');
|
|
||||||
|
|
||||||
console.log(import.meta);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the Basic Authentication header.
|
|
||||||
*/
|
|
||||||
export function authHeader(): string {
|
|
||||||
const credentials = btoa(`${username}:${password}`);
|
|
||||||
return `Basic ${credentials}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A lightweight wrapper around fetch for the CommaFeed API.
|
|
||||||
* @param endpoint - The API endpoint (e.g., '/rest/feed/')
|
|
||||||
* @param options - Fetch options
|
|
||||||
*/
|
|
||||||
export async function fetchAPI(endpoint: string, options: RequestInit = {}): Promise<Response> {
|
|
||||||
|
|
||||||
const url = `${url_base}/${endpoint}`;
|
|
||||||
const auth = authHeader();
|
|
||||||
|
|
||||||
const headers = new Headers(options.headers);
|
|
||||||
headers.set('Authorization', auth);
|
|
||||||
|
|
||||||
return fetch(url, {
|
|
||||||
...options,
|
|
||||||
headers,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
+1
-2
@@ -34,8 +34,7 @@
|
|||||||
"types": ["mocha"],
|
"types": ["mocha"],
|
||||||
"lib": ["es2021", "dom", "DOM.Iterable"],
|
"lib": ["es2021", "dom", "DOM.Iterable"],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"],
|
"@/*": ["./src/*"]
|
||||||
"ENV": ["./.env.js"]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["**/*.ts"]
|
"include": ["**/*.ts"]
|
||||||
|
|||||||
Reference in New Issue
Block a user