Skip to content

Instantly share code, notes, and snippets.

View johannschopplich's full-sized avatar

Johann Schopplich johannschopplich

View GitHub Profile
@johannschopplich
johannschopplich / blueprint.yaml
Created April 19, 2024 05:43 — forked from lukaskleinschmidt/blueprint.yaml
Kirby 4 query pages from a searchengine for the pages field
fields:
articles:
type: pages
query: kirby.collection('articles')
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Patrick Marsceill, software designer</title>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/favicon-32x32.png"
@johannschopplich
johannschopplich / storage.ts
Created October 30, 2023 11:05
Capacitor Preferences binding for VueUse `useStorageAsync`
import { Preferences } from "@capacitor/preferences";
import type {
MaybeRefOrGetter,
RemovableRef,
StorageLikeAsync,
UseStorageAsyncOptions,
} from "@vueuse/core";
const capacitorPreferenceStorage: StorageLikeAsync = {
async getItem(key: string): Promise<string | null> {
@johannschopplich
johannschopplich / main.js
Created September 5, 2023 07:20
Check which tables are available for Seven SwansSEVEN SWANS restaurant in Frankfurt am Main
// Function to fetch reservation data from API
async function fetchReservationData(date, capacity = 2, agentId = 2) {
const baseUrl =
'https://9110-api.quandoo.com/merchants/56296/reservation-options'
const url = `${baseUrl}?date=${date}&capacity=${capacity}&agentId=${agentId}`
try {
const response = await fetch(url)
const data = await response.json()
@johannschopplich
johannschopplich / auth.server.ts
Last active September 22, 2023 07:51
Nuxt API Party usage with auth store
import { useAuthStore } from '~/stores/auth'
export default defineNuxtPlugin(async () => {
const authStore = useAuthStore()
// Refresh the token once on the server
if (authStore.isLoggedIn && authStore.isTokenExpired()) {
await authStore.refresh()
}
})
@johannschopplich
johannschopplich / nginx.conf
Last active June 21, 2023 09:30
Custom nginx caching headers for Ploi.io for Kirby CMS
# assets and media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|heic|webp|svgz?|mp3|m4a|aac|ogg|wav|mp4|mov|webm|mpe?g|avi|ogv|wmv|woff2?)$ {
try_files $uri $uri/ /index.php?$query_string;
add_header Cache-Control "public, max-age=31536000, immutable";
access_log off;
}
@johannschopplich
johannschopplich / README.md
Last active June 23, 2023 15:45
OpenAI audio transcriptions from folder

Create Transcripts from Audio Files

This script uses OpenAI's Whisper ASR (Automatic Speech Recognition) system to generate transcripts from the audio files.

In addition to the Python packages mentioned above, you need to provide an OpenAI API key as an environment variable:

export OPENAI_API_KEY=your-api-key
@johannschopplich
johannschopplich / better-scroller.client.ts
Created June 7, 2023 17:19
Nuxt plugin for `vue-router-better-scroller` with with Suspense route resolution
import { createRouterScroller } from 'vue-router-better-scroller'
interface ScrollPositionCoordinates {
behavior?: ScrollOptions['behavior']
left?: number
top?: number
}
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(
@johannschopplich
johannschopplich / password.ts
Last active May 3, 2023 21:40
Password strength meter calculation
const SPECIAL_CHAR_RE = /[^A-Za-z0-9]/g
const LOWERCASE_RE = /[a-z]/g
const UPPERCASE_RE = /[A-Z]/g
const NUMBER_RE = /[0-9]/g
const SCORE_MAP = ['risky', 'guessable', 'weak', 'safe', 'secure'] as const
export function getPasswordStrength(input: string | number) {
const score = typeof input === 'string' ? getPasswordScore(input) : input
return SCORE_MAP[score]
@johannschopplich
johannschopplich / index.ts
Created April 20, 2023 09:58
Rust-like result type in TypeScript
/**
* First, create a type helper that represents
* the Result that we'll get from our safe function
*/
type Result<T> =
| {
ok: true;
value: T;
}
| {