Skip to content

Instantly share code, notes, and snippets.

View szkrd's full-sized avatar

szabolcs kurdi szkrd

  • tralfamadore
View GitHub Profile
@szkrd
szkrd / md2pdf.js
Last active November 4, 2022 03:35
convert markdown to pdf using puppeteer
// first: `npm init -- yes && npm i -S [email protected] [email protected] [email protected] puppeteer-core`
// then: `node . --help`
const fs = require('fs');
const http = require('http');
const puppeteer = require('puppeteer-core');
const showdown = require('showdown');
const githubMarkdownCss = fs.readFileSync(require.resolve('github-markdown-css'), 'utf8');
const handler = require('serve-handler'); // without serve loading local files, like images, would not be possible
const die = (text = '', code = 1) => process.exit(~~console.error(text) + code);
@szkrd
szkrd / xiaomi-redmi-4x-unlock.md
Created August 10, 2021 16:32
Xiaomi Redmi 4x unlock, lineage install and root

Unlock Xiaomi Redmi 4X (santoni) and install Lineage OS via sideloading

So far the most useful documentation was at Lineage's Redmi section, random "mobile enthusiast" sites were "not very good" and youtube videos are to be avoided like the plague.

Files needed

  • SDK platform tools from android.com
  • mi flash unlock gui tool (miflash_unlock-en-5.5.224.24.zip)
  • newest twrp for device (twrp-3.5.2_9-0-santoni.img), from twrp site
@szkrd
szkrd / watch-log.js
Created July 5, 2021 11:15
watch for changes in a log file in a memory efficient way (like tail -f)
// npm init --yes && npm i -S chalk chokidar split
const fs = require("fs");
const { stat } = require("fs").promises;
const { red, cyan } = require("chalk");
const chokidar = require("chokidar");
const split = require("split");
let config = require("./config.json"); // { okPattern: string, nokPattern: string, logFile: string }
try {
config = require("./config.user.json");
} catch (err) {}
@szkrd
szkrd / youtube-listen.js
Created March 7, 2021 19:41
Listen to a youtube stream in puppeteer (headless chrome/chromium). By default plays Chillcow's channel, works on linux and windows, clicks on all the popup crap.
// first: `npm init -- yes && npm i chalk puppeteer-core`
// then: `node . --help`
const puppeteer = require('puppeteer-core');
const chalk = require('chalk');
// ---
const ifHasParam = (s = '') => process.argv.includes(s);
const paramValueOf = (s = '') => (process.argv.find(x => x.startsWith(`${s}=`)) || '').split('=')[1];
const DEFAULT_VIDEO_ID = '5qap5aO4i9A'; // ChillCow; his other channel is "DWcJFNfaw9c"
const DEBUG = ifHasParam('--debug');
const SHOW_HEAD = ifHasParam('--head');
@szkrd
szkrd / taskbar.au3
Last active January 31, 2021 14:23
Calling a dll with autoit
Func ToggleTaskbarAutohide($hide = False)
; this is the message id (from nf-shellapi-shappbarmessage documentation page at microsoft.com)
Local Static $ABM_SETSTATE = 0xA
; these two are message payloads, probably defined as constants in the dll / c lib itself
; a list could be found here: https://stackoverflow.com/a/44746235
Local Static $ABS_AUTOHIDE = 1, $ABS_ALWAYSONTOP = 2
; appbardata will be filled with the results (or prefilled with the input),
; the SHAppBarMessage documentation tells us how it looks:
@szkrd
szkrd / bookmarks-json-to-md.js
Created January 4, 2021 12:58
convert pinboard exported bookmarks json to markdown
const fs = require('fs');
const source = require('./pinboard_export.json');
const uniq = (value, index, self) => self.indexOf(value) === index;
let text = '';
source.forEach(bkm => {
text += `## ${bkm.description}\n`;
if (bkm.extended) text += `${bkm.extended}\n`
text += `${bkm.href}\n`
if (bkm.tags) {
const tags = bkm.tags.split(' ').map(t => {
@szkrd
szkrd / test-utils-json.js
Created September 17, 2020 10:05
Make json snapshots less painful: replace functions/classes with their names (if possible), convert dates to numbers, remove undefined enumerable properties
function logObject(obj) {
let result = JSON.stringify(obj, null, 2);
let hr = '';
for (let i = 0; i < 80; i++) { hr += '-'; }
const lines = result.split('\n');
result = lines.map(line => line.replace(/^(\s+)"([a-zA-Z0-9_$]*)"/, '$1$2')).join('\n');
console.log(`${hr}{{{\n${result}\n}}}${hr}`);
}
function stringifyComplexObjects(obj) {
@szkrd
szkrd / huskify.sh
Last active July 14, 2020 08:54
force install husky (probably v4.x only)
#!/usr/bin/env bash
function addHook() {
echo -e "#!/bin/sh\n# husky" > .git/hooks/$1
echo '. "$(dirname "$0")/husky.sh"' >> .git/hooks/$1
chmod +x .git/hooks/$1
}
DIRNAME="$(basename "${PWD}")"
if [ "${DIRNAME}" = 'server' ] || [ "${DIRNAME}" = 'client' ]; then echo "Do not run this script in the server/client subdir!"; exit 1; fi
if [ ! -f ./node_modules/husky/package.json ]; then echo "Project has no husky?"; exit 2; fi
@szkrd
szkrd / downgrade-all-to-128k-mp3.sh
Created July 4, 2020 19:25
convert all music files recursively to 128k mp3 (and then use cloudbeats or evermusic to stream them)
#!/usr/bin/env bash
read -p "This will RECURSIVELY process all music files and downgrade them; are you sure? " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
[[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
fi
shopt -s nullglob
# recursively find all music files and then convert them one by one to 128k mp3
find . -type f -iname "*.mp3" -o -iname "*.flac" -o -iname "*.mpc" -o -iname "*.ogg" | while read file; do
cd "$(dirname "${file}")"
@szkrd
szkrd / checkLocaleJsonValidity.js
Created March 2, 2020 14:30
check if locale json file is valid or not (parsable and has unique jeys only) - since git merge may cause headaches
const fs = require('fs');
const path = require('path');
const dir = path.join(__dirname, '/../locales');
fs.readdir(dir, (err, files) => {
files.filter(fn => /\.json$/.test(fn)).forEach(fn => {
fs.readFile(path.join(dir, fn), (err, s) => {
s = s + '';
let lang = {};
try {
lang = JSON.parse(s);