Skip to content

Instantly share code, notes, and snippets.

View johannschopplich's full-sized avatar

Johann Schopplich johannschopplich

View GitHub Profile
@johannschopplich
johannschopplich / backup-env.mjs
Created April 24, 2024 07:53
Backup all your .env files while keeping the directory structure of the source directory
import process from "node:process";
import fsp from "node:fs/promises";
import path from "node:path";
import fg from "fast-glob";
async function copyEnvFiles(sourceDir, backupDir) {
try {
const envFiles = await fg(["**/.env"], {
cwd: sourceDir,
ignore: ["**/node_modules/**"],
@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 / spreadsheet.ts
Last active February 12, 2024 13:19
Fetch data from Google Sheets API in TypeScript
export interface SpreadsheetValues {
majorDimension: "DIMENSION_UNSPECIFIED" | "ROWS" | "COLUMNS";
range: string;
values: string[][];
}
export async function getSpreadsheetValues(
id: string,
sheet: string
): Promise<Record<string, string>[]> {
@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 / 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 / kql.ts
Last active September 20, 2023 07:23
Vue composable to fetch KQL queries
import { $fetch } from "ofetch";
import { hash } from "ohash";
import { toValue } from "@vueuse/core";
import { useQuery } from "vue-unquery";
import { useI18n } from "@byjohann/vue-i18n";
import type { MaybeRefOrGetter } from "@vueuse/core";
import type { TurboVueOptions } from "vue-unquery";
import type { KirbyQueryRequest, KirbyQueryResponse } from "kirby-types";
let responseCache: KirbyQueryResponse | undefined;
@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 / MasonryGrid.vue
Last active July 4, 2023 12:06
Vue 3 component for masonry grid polyfill
<script setup lang="ts">
const props = withDefaults(
defineProps<{
columnMaxWidth?: string;
}>(),
{
columnMaxWidth: "25rem",
}
);
@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