Prepare pixelfed feed
This commit is contained in:
parent
da9bf72246
commit
f31a282a89
14
src/lib/feeds/feedTypes.ts
Normal file
14
src/lib/feeds/feedTypes.ts
Normal file
@ -0,0 +1,14 @@
|
||||
export interface AtomFeed {
|
||||
title: string | null;
|
||||
subtitle: string | null;
|
||||
updated: string | null;
|
||||
url: string | null;
|
||||
content: PixelfedFeed[];
|
||||
}
|
||||
|
||||
export interface PixelfedFeed {
|
||||
title: string | null;
|
||||
updated: string | null;
|
||||
imgUrl: string | null;
|
||||
pixelfedUrl: string | null;
|
||||
}
|
78
src/lib/feeds/pixelfed.svelte
Normal file
78
src/lib/feeds/pixelfed.svelte
Normal file
@ -0,0 +1,78 @@
|
||||
<script lang="ts">
|
||||
import type { AtomFeed, PixelfedFeed } from "./feedTypes";
|
||||
|
||||
export let pixelfedFeed: string;
|
||||
|
||||
const atomUrl = "https://pixelfed.scot/users/fbface.atom";
|
||||
|
||||
async function loadFeed(feed: string) {
|
||||
try {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(feed, "text/xml");
|
||||
|
||||
const feedTitle = doc.getElementsByTagName('title')[0].textContent;
|
||||
const feedSubtitle = doc.getElementsByTagName('subtitle')[0].textContent;
|
||||
const feedUpdated = doc.getElementsByTagName('updated')[0].textContent;
|
||||
|
||||
// Get link to profile
|
||||
const feedProfile = doc.querySelector('link[rel="alternate"][type="text/html"]');
|
||||
const feedProfileLink = feedProfile ? feedProfile.getAttribute('url') : null;
|
||||
|
||||
// Parse feed entries
|
||||
const entries = doc.getElementsByTagName('entry');
|
||||
|
||||
let entryArray: PixelfedFeed[] = [];
|
||||
|
||||
for (let i = 0; i < entries.length; i++) {
|
||||
const entry = entries[i];
|
||||
const entryMediaContent = entry.getElementsByTagName('media:content')[0];
|
||||
const entryPixelfedUrl = entry.getElementsByTagName('link')[0];
|
||||
|
||||
const feedItem: PixelfedFeed = {
|
||||
title: entry.getElementsByTagName('title')[0].textContent,
|
||||
updated: entry.getElementsByTagName('updated')[0].textContent,
|
||||
imgUrl: entryMediaContent ? entryMediaContent.getAttribute('url') : null,
|
||||
pixelfedUrl: entryPixelfedUrl ? entryPixelfedUrl.getAttribute('href') : null,
|
||||
};
|
||||
|
||||
entryArray.push(feedItem);
|
||||
}
|
||||
|
||||
const parsedFeed: AtomFeed = {
|
||||
title: feedTitle,
|
||||
subtitle: feedSubtitle,
|
||||
updated: feedUpdated,
|
||||
url: feedProfileLink,
|
||||
content: entryArray,
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(parsedFeed))
|
||||
return parsedFeed
|
||||
|
||||
} catch (err) {
|
||||
console.error("Unable to load Pixelfed feed", err);
|
||||
throw new Error("Unable to load Pixelfed feed");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{#await loadFeed(pixelfedFeed)}
|
||||
<h5>Conneting to Pixelfed</h5>
|
||||
{:then feedData}
|
||||
<h5><a href="{feedData?.url}">Pixelfed</a></h5>
|
||||
<p class="updated">{feedData?.updated}</p>
|
||||
{#each feedData.content as feedItem}
|
||||
<a href={feedItem.pixelfedUrl}>
|
||||
<img class="pixelfedImg" src="{feedItem.imgUrl}" alt="{feedItem.title}">
|
||||
</a>
|
||||
<caption>{feedItem.title}</caption>
|
||||
{/each}
|
||||
{:catch}
|
||||
<h5>Error connecting to Pixelfed</h5>
|
||||
{/await}
|
||||
|
||||
<style>
|
||||
.pixelfedImg {
|
||||
width: 50%;
|
||||
margin: auto;
|
||||
}
|
||||
</style>
|
11
src/routes/testing/+page.server.ts
Normal file
11
src/routes/testing/+page.server.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import type { PageServerLoad } from "./$types";
|
||||
|
||||
export const load: PageServerLoad = async () => {
|
||||
try {
|
||||
const res = await fetch("https://pixelfed.scot/users/fbface.atom")
|
||||
const xml = await res.text();
|
||||
return {xml: xml}
|
||||
} catch (err) {
|
||||
console.error("Error in load function", err)
|
||||
}
|
||||
}
|
8
src/routes/testing/+page.svelte
Normal file
8
src/routes/testing/+page.svelte
Normal file
@ -0,0 +1,8 @@
|
||||
<script lang="ts">
|
||||
import Pixelfed from "$lib/feeds/pixelfed.svelte";
|
||||
import type { PageData } from "../$types";
|
||||
|
||||
export let data: PageData;
|
||||
</script>
|
||||
|
||||
<Pixelfed pixelfedFeed={data.xml} />
|
Loading…
Reference in New Issue
Block a user