From 83a4c483c72460159f01cfe41c07e5cd51c738fe Mon Sep 17 00:00:00 2001 From: Ivan Reshetnikov Date: Sun, 12 Nov 2023 13:51:31 +0500 Subject: [PATCH] Migrate to markdown, add rss feed --- astro.config.mjs | 4 +- package-lock.json | 36 ++++ package.json | 1 + public/icons/rss.svg | 1 + src/components/Footer.astro | 101 ++++++---- src/components/Note.astro | 35 ---- src/components/NoteMetadata.astro | 25 --- src/content/config.ts | 15 ++ src/content/notes/carefree-mountain.md | 34 ++++ src/content/notes/self-hosting.md | 119 +++++++++++ src/content/notes/strelka.md | 38 ++++ src/env.d.ts | 1 + src/pages/index.astro | 48 +++-- src/pages/notes/[...slug].astro | 54 +++++ src/pages/notes/carefree-mountain.astro | 123 ----------- src/pages/notes/self-hosting.astro | 258 ------------------------ src/pages/notes/strelka.astro | 89 -------- src/pages/rss.xml.ts | 23 +++ 18 files changed, 416 insertions(+), 589 deletions(-) create mode 100644 public/icons/rss.svg delete mode 100644 src/components/Note.astro delete mode 100644 src/components/NoteMetadata.astro create mode 100644 src/content/config.ts create mode 100644 src/content/notes/carefree-mountain.md create mode 100644 src/content/notes/self-hosting.md create mode 100644 src/content/notes/strelka.md create mode 100644 src/pages/notes/[...slug].astro delete mode 100644 src/pages/notes/carefree-mountain.astro delete mode 100644 src/pages/notes/self-hosting.astro delete mode 100644 src/pages/notes/strelka.astro create mode 100644 src/pages/rss.xml.ts diff --git a/astro.config.mjs b/astro.config.mjs index 4890b6f..ce036a0 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,4 +1,6 @@ import { defineConfig } from 'astro/config' // https://astro.build/config -export default defineConfig({}) +export default defineConfig({ + site: 'https://comfycamp.space' +}) diff --git a/package-lock.json b/package-lock.json index c445e89..c3870f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "@astrojs/check": "^0.3.0", + "@astrojs/rss": "^3.0.0", "astro": "^3.5.2", "typescript": "^5.2.2" } @@ -128,6 +129,15 @@ "node": ">=18.14.1" } }, + "node_modules/@astrojs/rss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/rss/-/rss-3.0.0.tgz", + "integrity": "sha512-PMX8iqByk9gtOrusikten/oF5uHjOCZigL6RuXFBUu+xtdKQxXzfIohJ99V2haA4FJjVDyibDTGzXR81POBMxQ==", + "dependencies": { + "fast-xml-parser": "^4.2.7", + "kleur": "^4.1.5" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.0.4.tgz", @@ -2118,6 +2128,27 @@ "node": ">=8.6.0" } }, + "node_modules/fast-xml-parser": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -5603,6 +5634,11 @@ "node": ">=0.10.0" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/package.json b/package.json index 048dc63..8b8e0c8 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@astrojs/check": "^0.3.0", + "@astrojs/rss": "^3.0.0", "astro": "^3.5.2", "typescript": "^5.2.2" } diff --git a/public/icons/rss.svg b/public/icons/rss.svg new file mode 100644 index 0000000..1bccea6 --- /dev/null +++ b/public/icons/rss.svg @@ -0,0 +1 @@ +RSS diff --git a/src/components/Footer.astro b/src/components/Footer.astro index daa0336..70238ce 100644 --- a/src/components/Footer.astro +++ b/src/components/Footer.astro @@ -1,40 +1,56 @@ diff --git a/src/components/Note.astro b/src/components/Note.astro deleted file mode 100644 index 104518d..0000000 --- a/src/components/Note.astro +++ /dev/null @@ -1,35 +0,0 @@ ---- -interface Props { - date: string - title: string - href: string -} - -const { date, title, href } = Astro.props ---- - -
-
{ date }
-
- { title } -
- - diff --git a/src/components/NoteMetadata.astro b/src/components/NoteMetadata.astro deleted file mode 100644 index 055c79e..0000000 --- a/src/components/NoteMetadata.astro +++ /dev/null @@ -1,25 +0,0 @@ ---- -interface Props { - createdAt: string - updatedAt: string -} - -const { createdAt, updatedAt } = Astro.props ---- - -
-

Дата создания: { createdAt }

- { updatedAt !== createdAt &&

Последнее обновление: { updatedAt }

} -
- - diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..c5f2741 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,15 @@ +import { z, defineCollection } from 'astro:content' + +const notesCollection = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + description: z.string(), + pubDate: z.date(), + updatedAt: z.date().optional(), + }), +}) + +export const collections = { + 'notes': notesCollection, +} diff --git a/src/content/notes/carefree-mountain.md b/src/content/notes/carefree-mountain.md new file mode 100644 index 0000000..8cd20ac --- /dev/null +++ b/src/content/notes/carefree-mountain.md @@ -0,0 +1,34 @@ +--- +title: "Беспечная Гляденовская гора" +description: "Путешествие до Гляденовской горы." +pubDate: 2023-10-16 +--- + +Гляденовская гора - это красивый лес в Перми, за которым прячется деревянная часовня. +Здесь не будет рассказов про историю горы, ведь я не являюсь ни историком, ни археологом, +оставлю это занятие более компетентным людям. +Я всего лишь хочу показать вам это место от лица обывателя, +и, может быть, это сподвигнет вас отправиться когда-нибудь в небольшое путешествие. + +![Фотография поля с видом на пермский аэропорт](/carefree-mountain/1.webp) + +Гляденовская гора находится недалеко от пермского аэропорта. +Если до него самого добраться не составит большого труда, то дальше придётся идти вдоль дороги, хоть и совсем недолго. +Вскоре вы зайдете в лес, тогда идти станет проще и интереснее. + +Теперь, когда мы наконец-то в лесу, где нет проезжающих мимо машин, можно расслабиться. +Дальнейший путь представляет из себя череду деревянных ступенек. +Спускаться по ним довольно легко, но ещё проще подскользнуться. + +![Деревянные ступеньки в лесу](/carefree-mountain/2.webp) +![Белочка](/carefree-mountain/3.webp) +![Деревянные ступеньки в лесу](/carefree-mountain/4.webp) + +В конце пути нас ожидает деревянная церковь. +Теперь можно неспеша осмотреться вокруг. +В таких местах почти ничего не просиходит, внешнего мира как будто не существует. +Он остался там, за горой, здесь же царит тишина и спокойствие. + +![Деревянная церковь в лесу](/carefree-mountain/5.webp) + +*Удивительное рядом.* diff --git a/src/content/notes/self-hosting.md b/src/content/notes/self-hosting.md new file mode 100644 index 0000000..b0514a1 --- /dev/null +++ b/src/content/notes/self-hosting.md @@ -0,0 +1,119 @@ +--- +title: "Свободные альтернативы популярным сервисам" +description: "Список самых популярных независимых альтернатив коммерческим социальным сетям и сервисам." +pubDate: 2023-08-27 +updatedAt: 2023-10-01 +--- + +Это статья для тех, кто никогда не слышал про альтернативы современным социальным сетям и сервисам. + +Мы стали слишком сильно полагаться на централизованные сервисы, такие как vk, youtube, telegram или twitter. +Если у вас начали появляться претензии, будь то цензура, отсутствие нужных функций или +пренебрежительное отношение к личным данным, я предлагаю вам обратить внимание на альтернативы, +которые вы можете запустить на своем сервере. + +Хотя, строго говоря, иметь свой сервер вовсе не обязательно, +но в таком случае вы должны доверять владельцу сервера, ведь именно он будет хранить ваши данные. +Это не особо касается социальных сетей без личных сообщений, там всё и так публично. +Мессенджеры, поддерживающие шифрование, защищают вас от лишних глаз, можете без опасений выбирать публичный сервер. +А вот хранить файлы у незнакомцев я бы не стал. + +## Социальные сети - Fediverse + +![Скриншот fediverse.party](/selfhosted/fediverse-party.webp) + +Fediverse - это группа из нескольких социальных сетей, представляющие аналоги популярным сервисам. + +| Оригинальный сервис | Альтернативы | +| --- | --- | +| Twitter | [Mastodon](https://joinmastodon.org/), [Misskey](https://misskey-hub.net/en/) и [Pleroma](https://pleroma.social/) | +| Vk, Facebook | [Friendica](https://friendi.ca/) | +| Instagram | [Pixelfed](https://pixelfed.org/) | +| Reddit | [Lemmy](https://join-lemmy.org/) | +| YouTube | [Peertube](https://joinpeertube.org/) | +| Soundcloud | [Funkwhale](https://funkwhale.audio/) | + +Создать свой сервер может любой желающий, и его пользователи смогут общаться с пользователями на других серверах. +Зачастую можно общаться даже с пользователями других платформ. + +Если вы ищете простое место для старта, рекомендую обратить внимание на mastodon. +Выберите сервер, на котором вы хотите зарегистрироваться, +в этом вам может помочь [каталог русскоязычных серверов](https://ru.index.community/communities). + +Вот парочка советов: +* Ознакомтесь с правилами сервера. На разных серверах модераторы могут запрещать разные вещи. +* Не регистрируйтесь на больших серверах. Вы не получите от этого особых плюсов, а лишь усилите централизацию. + +У меня есть свой [сервер mastodon](https://m.comfycamp.space), жду вас в гости! + +## Мессенджеры - Matrix, XMPP + +![Скриншот matirx.org](/selfhosted/matrix.webp) + +В мире децентрализованного общения сейчас популярны 2 протокола: xmpp (ранее jabber) и matrix. +Идея такая же, как и в случае с fediverse: любой желающий может поднять свой сервер, а пользователи разных серверов могут общаться между собой. + +По сравнению с другими платформами, например telegram или whatsapp, +вы получаете end-to-end шифрование на всех устройствах и множество клиентов с открытым исходным кодом, +а для регистрации не нужно указывать номер телефона. + +Какой из них вам понравится больше - сказать тяжело. Попробуйте оба. + +## Облако - Nextcloud + +![Скриншот менеджера файлов в nextcloud](/selfhosted/nextcloud.webp) + +[Nextcloud](https://nextcloud.com/) - это больше, чем просто облако. +Это и хранилище файлов, и календарь, и задачи, и контакты, и ещё много всего. +Своим функционалом nextcloud способен заменить целые экосистемы. + +При желании к nextcloud можно подключить офисный редакторор, например onlyoffice, тогда nextcloud превращается ещё и в альтернативу Google Docs. +Это может быть очень кстати для разных компаний. + +Список контактов, календари и задачи можно синхронизировать между своими устройствами. +Для этого используются обычные протоколы сaldav и carddav. + +## Стриминг - Jellyfin + +![Скриншот jellyfin с открытой страницей фильма](/selfhosted/jellyfin.webp) + +[Jellyin](https://jellyfin.org/) - это ваш личный стриминговый сервис. + +Вы просто указываете путь до вашей медиатеки и получаете возможность смотреть и слушать её онлайн. +Jellyfin поддерживает фильмы, сериалы, музыку, аудиокниги и комиксы. + +Jellyfin может перекодировать файлы на лету, если посчитает, что ваше устройство не поддерживает исходный формат. +Это зачастую необходимо для браузеров, так как они могут воспроизодить только самые простые форматы. +Если вы хотите снизить нагрузку на сервер, можно найти клиенты, позволяющие транслировать видео напрямую в ваш плеер +(см. [jellyfin-mpv-shim](https://github.com/jellyfin/jellyfin-mpv-shim). + +Jellyfin поддерживает DLNA, а это значит, что в пару кликов можно включить любой фильм на телевизоре, который находится в той же сети, что и сервер. +А ещё можно организовывать комнаты для просмотра и синхронизировать воспроизведение на нескольких устройствах, если вы хотите посмотреть +что-нибудь в компании. + +Jellyfin - это не обязательно синоним пиратства. +Вы можете стримить легально приобретенный контент, если у вас есть такое желание. + +## Фото и видео - Photoprism + +![Скриншот photoprism, на котором видно несколько фотографий](/selfhosted/photoprism.webp) + +Многие пользуются сервисами от Apple или Google, чтобы хранить личные фотографии и видео. +Если вам становится некомфортно от мысли, что компании, владеющие рекламными сетями, +имеют доступ к вашим фотографиям, можно обратиться к [Photoprism](https://www.photoprism.app/). + +Photoprism позволяет легко просматривать фото в браузере, редактировать метатеги, +и даже умеет распознавать объекты на фото (хотя, честно говоря, эта функция работает не идеально). +Вы можете создавать альбомы и делиться ими с другими людьми. + +Загружать фото можно через веб-интерфейс, импортировать с директории на вашем сервере или же +загружать их по протоколу webdav с того же nextcloud. + +Photoprism умеет конвертировать фотографии формата raw, чтобы их можно было открыть в браузере. +Также вы без проблем можете загрузить свои видео, они при необходимости будут сконвертированы. + +## Вместо заключения - Awesome Selfhosted + +Один из самых популярных репозиториев на Github: [Awesome Selfhosted](https://github.com/awesome-selfhosted/awesome-selfhosted). +Это большой список всевозможных сервисов, которые вы можете запустить на своем сервере. +В этой статье я не покрыл и 10% доступных вариантов. Однако, надеюсь, что я смог хотя бы приоткрыть дверь в эту кроличью нору. diff --git a/src/content/notes/strelka.md b/src/content/notes/strelka.md new file mode 100644 index 0000000..057c402 --- /dev/null +++ b/src/content/notes/strelka.md @@ -0,0 +1,38 @@ +--- +title: "Мыс Стрелка" +description: "Фотографии с путешествия на мыс Стрелка." +pubDate: 2023-11-11 +--- + +*Некоторые вещи стоят того, чтобы встать в 6 утра в воскресенье.* + +## Куда мы едем? + +Мыс Стрелка - это скала, у которой соединяются 2 реки: Кама и Чусовая. +Находится она недалеко от города, добраться до ближайших деревень можно на электричке, +а дальше нужно пару километров пройти пешком. + +Точную дорогу мы заранее не посмотрели и пришли не на скалу, а к её основанию. +Подняться, как оказалось, можно и у самой скалы, в самом тяжёлом месте есть верёвка. + +![Вершина скалы](/strelka/1.jpg) +![Вид с мыса Стрелка](/strelka/2.jpg) +![Вид с мыса Стрелка](/strelka/3.jpg) + +На вершине скалы довольно ветрено, но красиво. +Совсем рядом находятся макушки деревьев, а дальше только вода. + +Спустившись буквально на пару шагов можно укрыться от ветра и отдохнуть. +Если вы оказались здесь осенью, то чай будет очень кстати. + +![Пьем чай на скале](/strelka/4.jpg) + +## Путь обратно + +У нас оставалось несколько часов до электрички, поэтому мы отправились изучать ближайшие деревни. +Вроде бы мы находились совсем недалеко от города, но атмосфера уже другая. + +![Железная дорога в деревне](/strelka/5.jpg) + +Наши похождения закончились довольно быстро, но на станции можно спокойно дождаться электрички. +В итоге получилось короткое, но запоминающееся путешествие. diff --git a/src/env.d.ts b/src/env.d.ts index f964fe0..acef35f 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1,2 @@ +/// /// diff --git a/src/pages/index.astro b/src/pages/index.astro index 6742ef4..ce581c1 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,6 +1,13 @@ --- import Layout from '../layouts/Layout.astro' -import Note from '../components/Note.astro' +import { getCollection } from 'astro:content' + +const notes = await getCollection('notes') +notes.sort((a, b) => { + if (a.data.pubDate < b.data.pubDate) return 1 + if (a.data.pubDate > b.data.pubDate) return -1 + return 0 +}) --- @@ -14,22 +21,31 @@ import Note from '../components/Note.astro'

Заметки

- - - + {notes.map(note => ( +
+
{note.data.pubDate.toLocaleDateString("ru", {year: "numeric", month: "long", day: "numeric"})}
+
+ { note.data.title } +
+ ))}
diff --git a/src/pages/notes/[...slug].astro b/src/pages/notes/[...slug].astro new file mode 100644 index 0000000..94e66ef --- /dev/null +++ b/src/pages/notes/[...slug].astro @@ -0,0 +1,54 @@ +--- +import { getCollection } from 'astro:content' +import Layout from '../../layouts/Layout.astro' + +export async function getStaticPaths() { + const blogEntries = await getCollection('notes') + return blogEntries.map(entry => ({ + params: { slug: entry.slug }, + props: { entry }, + })) +} +const { entry } = Astro.props +const { Content } = await entry.render() +const formatDate = (date: Date) => { + return date.toLocaleDateString("ru", {year: "numeric", month: "long", day: "numeric"}) +} +--- + + +

{entry.data.title}

+ +
+ +
+
+ + diff --git a/src/pages/notes/carefree-mountain.astro b/src/pages/notes/carefree-mountain.astro deleted file mode 100644 index e5a3142..0000000 --- a/src/pages/notes/carefree-mountain.astro +++ /dev/null @@ -1,123 +0,0 @@ ---- -import Layout from '../../layouts/Layout.astro' -import NoteMetadata from '../../components/NoteMetadata.astro' ---- - - -

Беспечная Гляденовская гора

- - - -

- Гляденовская гора - это красивый лес в Перми, за которым прячется деревянная часовня. - Здесь не будет рассказов про историю горы, ведь я не являюсь ни историком, ни археологом, - оставлю это занятие более компетентным людям. - Я всего лишь хочу показать вам это место от лица обывателя, - и, может быть, это сподвигнет вас отправиться когда-нибудь в небольшое путешествие. -

- - Фотография поля с видом на пермский аэропорт -

- Гляденовская гора находится недалеко от пермского аэропорта. - Если до него самого добраться не составит большого труда, то дальше придётся идти вдоль дороги, хоть и совсем недолго. - Вскоре вы зайдете в лес, тогда идти станет проще и интереснее. -

- -

- Теперь, когда мы наконец-то в лесу, где нет проезжающих мимо машин, можно расслабиться. - Дальнейший путь представляет из себя череду деревянных ступенек. - Спускаться по ним довольно легко, но ещё проще подскользнуться. -

- -

-
- Деревянные ступеньки в лесу -
-
- Белочка -
-
- Деревянные ступеньки в лесу -
-
- -

- В конце пути нас ожидает деревянная церковь. - Теперь можно неспеша осмотреться вокруг. - В таких местах почти ничего не просиходит, внешнего мира как будто не существует. - Он остался там, за горой, здесь же царит тишина и спокойствие. -

- - Деревянная церковь в лесу - -

Удивительное рядом.

-
- - diff --git a/src/pages/notes/self-hosting.astro b/src/pages/notes/self-hosting.astro deleted file mode 100644 index a1f3745..0000000 --- a/src/pages/notes/self-hosting.astro +++ /dev/null @@ -1,258 +0,0 @@ ---- -import Layout from '../../layouts/Layout.astro' -import NoteMetadata from '../../components/NoteMetadata.astro' ---- - - -

Свободные альтернативы популярным сервисам

- - - -

- Это статья для тех, кто никогда не слышал про альтернативы современным социальным сетям и сервисам. -

- -

- Мы стали слишком сильно полагаться на централизованные сервисы, такие как vk, youtube, telegram или twitter. - Если у вас начали появляться претензии, будь то цензура, отсутствие нужных функций или - пренебрежительное отношение к личным данным, я предлагаю вам обратить внимание на альтернативы, - которые вы можете запустить на своем сервере. -

- -

- Хотя, строго говоря, иметь свой сервер вовсе не обязательно, - но в таком случае вы должны доверять владельцу сервера, ведь именно он будет хранить ваши данные. - Это не особо касается социальных сетей без личных сообщений, там всё и так публично. - Мессенджеры, поддерживающие шифрование, защищают вас от лишних глаз, можете без опасений выбирать публичный сервер. - А вот хранить файлы у незнакомцев я бы не стал. -

- -

Социальные сети - Fediverse

- - Скриншот fediverse.party -

Скриншот fediverse.party.

- -

- Fediverse - это группа из нескольких социальных сетей, представляющие аналоги популярным сервисам. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Оригинальный сервисАльтернативы
Twitter - Mastodon, - misskey и - pleroma -
Vk, facebook - Friendica -
Instagram - Pixelfed -
Reddit - Lemmy -
YouTube - Peertube -
Soundcloud - Funkwhale -
- -

- Создать свой сервер может любой желающий, и его пользователи смогут общаться с пользователями на других серверах. - Зачастую можно общаться даже с пользователями других платформ. -

- -

- Если вы ищете простое место для старта, рекомендую обратить внимание на mastodon. - Выберите сервер, на котором вы хотите зарегистрироваться, - в этом вам может помочь каталог русскоязычных серверов. -

- -

- Вот парочка советов: - -

    -
  • Ознакомтесь с правилами сервера. На разных серверах модераторы могут запрещать разные вещи.
  • -
  • Не регистрируйтесь на больших серверах. Вы не получите от этого особых плюсов, а лишь усилите централизацию.
  • -
-

- -

- У меня есть свой сервер mastodon, жду вас в гости! -

- -

Мессенджеры - Matrix, XMPP

- - Скриншот matirx.org -

Скриншот matrix.org.

- -

- В мире децентрализованного общения сейчас популярны 2 протокола: xmpp (ранее jabber) и matrix. - Идея такая же, как и в случае с fediverse: любой желающий может поднять свой сервер, а пользователи разных серверов могут общаться между собой. -

- -

- По сравнению с другими платформами, например telegram или whatsapp, - вы получаете end-to-end шифрование на всех устройствах и множество клиентов с открытым исходным кодом, - а для регистрации не нужно указывать номер телефона. -

- -

- Какой из них вам понравится больше - сказать тяжело. Попробуйте оба. -

- -

Облако - Nextcloud

- - Скриншот менеджера файлов в nextcloud - -

- Nextcloud - это больше, чем просто облако. - Это и хранилище файлов, и календарь, и задачи, и контакты, и ещё много всего. - Своим функционалом nextcloud способен заменить целые экосистемы. -

- -

- При желании к nextcloud можно подключить офисный редакторор, например onlyoffice, тогда nextcloud превращается ещё и в альтернативу Google Docs. - Это может быть очень кстати для разных компаний. -

- -

- Список контактов, календари и задачи можно синхронизировать между своими устройствами. - Для этого используются обычные протоколы сaldav и carddav. -

- -

Стриминг - Jellyfin

- - Скриншот jellyfin с открытой страницей фильма Taxi Driver - -

- Jellyfin - это ваш личный стриминговый сервис. -

- -

- Вы просто указываете путь до вашей медиатеки и получаете возможность смотреть и слушать её онлайн. - Jellyfin поддерживает фильмы, сериалы, музыку, аудиокниги и комиксы. -

- -

- Jellyfin может перекодировать файлы на лету, если посчитает, что ваше устройство не поддерживает исходный формат. - Это зачастую необходимо для браузеров, так как они могут воспроизодить только самые простые форматы. - Если вы хотите снизить нагрузку на сервер, можно найти клиенты, позволяющие транслировать видео напрямую в ваш плеер - (см. jellyfin-mpv-shim). -

- -

- Jellyfin поддерживает DLNA, а это значит, что в пару кликов можно включить любой фильм на телевизоре, который находится в той же сети, что и сервер. - А ещё можно организовывать комнаты для просмотра и синхронизировать воспроизведение на нескольких устройствах, если вы хотите посмотреть - что-нибудь в компании. -

- -

- Jellyfin - это не обязательно синоним пиратства. - Вы можете стримить легально приобретенный контент, если у вас есть такое желание. -

- -

Фото и видео - Photoprism

- - Скриншот photoprism, на котором видно несколько фотографий - -

- Многие пользуются сервисами от Apple или Google, чтобы хранить личные фотографии и видео. - Если вам становится некомфортно от мысли, что компании, владеющие рекламными сетями, - имеют доступ к вашим фотографиям, можно обратиться к Photoprism. -

- -

- Photoprism позволяет легко просматривать фото в браузере, редактировать метатеги, - и даже умеет распознавать объекты на фото (хотя, честно говоря, эта функция работает не идеально). - Вы можете создавать альбомы и делиться ими с другими людьми. -

- -

- Загружать фото можно через веб-интерфейс, импортировать с директории на вашем сервере или же - загружать их по протоколу webdav с того же nextcloud. -

- -

- Photoprism умеет конвертировать фотографии формата raw, чтобы их можно было открыть в браузере. - Также вы без проблем можете загрузить свои видео, они при необходимости будут сконвертированы. -

- -

Вместо заключения - Awesome Selfhosted

- -

- Один из самых популярных репозиториев на Github: Awesome Selfhosted. - Это большой список всевозможных сервисов, которые вы можете запустить на своем сервере. - В этой статье я не покрыл и 10% доступных вариантов. Однако, надеюсь, что я смог хотя бы приоткрыть дверь в эту кроличью нору. - - - diff --git a/src/pages/notes/strelka.astro b/src/pages/notes/strelka.astro deleted file mode 100644 index d4066de..0000000 --- a/src/pages/notes/strelka.astro +++ /dev/null @@ -1,89 +0,0 @@ ---- -import Layout from '../../layouts/Layout.astro' -import NoteMetadata from '../../components/NoteMetadata.astro' ---- - - -

Мыс Стрелка

- - - -

- Некоторые вещи стоят того, чтобы встать в 6 утра в воскресенье. -

- -

Куда мы едем?

- -

- Мыс Стрелка - это скала, у которой соединяются 2 реки: Кама и Чусовая. - Находится она недалеко от города, добраться до ближайших деревень можно на электричке, - а дальше нужно пару километров пройти пешком. -

- -

- Точную дорогу мы заранее не посмотрели и пришли не на скалу, а к её основанию. - Подняться, как оказалось, можно и у самой скалы, в самом тяжёлом месте есть верёвка. -

- - Вершина скалы - -
- Вид с мыса Стрелка - Вид с мыса Стрелка -
- -

- На вершине скалы довольно ветрено, но красиво. - Совсем рядом находятся макушки деревьев, а дальше только вода. -

- -

- Спустившись буквально на пару шагов можно укрыться от ветра и отдохнуть. - Если вы оказались здесь осенью, то чай будет очень кстати. -

- Пьем чай на скале - -

Путь обратно

-

- У нас оставалось несколько часов до электрички, поэтому мы отправились изучать ближайшие деревни. - Вроде бы мы находились совсем недалеко от города, но атмосфера уже другая. -

- - Железная дорога в деревне - -

- Наши похождения закончились довольно быстро, но на станции можно спокойно дождаться электрички. - В итоге получилось короткое, но запоминающееся путешествие. -

-
- - diff --git a/src/pages/rss.xml.ts b/src/pages/rss.xml.ts new file mode 100644 index 0000000..203b661 --- /dev/null +++ b/src/pages/rss.xml.ts @@ -0,0 +1,23 @@ +import type { APIContext } from 'astro' +import rss from '@astrojs/rss' +import { getCollection } from 'astro:content' + +export async function GET(context: APIContext) { + const notes = await getCollection('notes') + notes.sort((a, b) => { + if (a.data.pubDate < b.data.pubDate) return 1 + if (a.data.pubDate > b.data.pubDate) return -1 + return 0 + }) + return rss({ + title: 'Уютный домик', + description: 'Заметки с сайта comfycamp.space', + site: context.site || "https://comfycamp.space", + items: notes.map((note) => ({ + title: note.data.title, + pubDate: note.data.pubDate, + description: note.data.description, + link: `/notes/${note.slug}/`, + })), + }) +}