Skip to content

Instantly share code, notes, and snippets.

View mara004's full-sized avatar

mara004

View GitHub Profile
@mara004
mara004 / SOFTWARE_TODO.txt
Last active April 14, 2025 00:59
My software tasks
pypdfium2
- matrix render helper & CLI
- input mode selection in CLI
- think about mutex sharing, and plugging in a mutex into the autoclose machinery
- native sourcebuild script (-> implicit fallback on setup) WIP
- download the pdfium version in autorelease record by default, not latest
ghostscript:
- handle formats
@mara004
mara004 / ghostscript_ffi.py
Last active April 14, 2025 01:06
PDF rendering with Ghostscript, revisited (ABI bindings, in-memory approach)
# Four lines intentionally left blank
# SPDX-FileCopyrightText: 2025 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0 OR GPL-3.0-or-later
# Note that Ghostscript is AGPL-licensed, so this code is altogether affected by copyleft
# Written with Ghostscript 9.56.1 on Fedora.
@mara004
mara004 / dvd_rip.sh
Last active March 24, 2025 22:28
DVD ripping
# see also https://wiki.ubuntuusers.de/DVDs_manuell_rippen/#Komplette-Spur-rippen
lsdvd /dev/sr0 # to show available tracks and their length
mplayer dvd://n -dvd-device /dev/sr0 # to preview a track -- where n is the track number (1-based)
mplayer dvd://n -dvd-device /dev/sr0 -v -dumpstream -dumpfile filename.vob # to rip track
@mara004
mara004 / interesting_windows.md
Last active December 27, 2024 23:32
Interesting Windows(-only) software
@mara004
mara004 / labelling.py
Last active January 9, 2025 23:09
Enumerate data using letters rather than numbers
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
from string import ascii_uppercase as ALPHABET
N_CHARS, ORD_A = len(ALPHABET), ord("A") # 26, 65
def idx_to_label(i):
count, remainder = divmod(i, N_CHARS)
char = ALPHABET[remainder] # chr(remainder + ORD_A)
@mara004
mara004 / deferred_imports.py
Last active April 12, 2025 00:49
Various attempts at deferred ("lazy") imports. None of these seems particularly satisfying, though. Missing PEP 690...
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause OR MPL-2.0
import sys
import importlib.util
def v1_deferred_import(modpath):
# FIXME If modpath points to a submodule (e.g. PIL.Image), the parent module will be loaded immediately when this function is called. What's more, non-deferred imports of the submodule will break. This seems to be a nasty limitation of the importlib APIs used here.
@mara004
mara004 / ghostscript_shell.py
Last active April 2, 2025 00:41
PDF rendering with Ghostscript (via subprocess)
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-FileCopyrightText: 2024 James R. Barlow <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Initial code derived from ocrmypdf/_exec/ghostscript.py
# Note that Ghostscript is AGPL-licensed. However, we are calling it via subprocess here, so not sure whether copyleft would actually apply.
# See also https://www.gnu.org/licenses/gpl-faq.en.html#MereAggregation
import io
import os
@mara004
mara004 / pymupdf.py
Created July 11, 2024 20:10
PDF rendering with pymupdf
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Note that (py)mupdf is AGPL-licensed, so this code is altogether affected by copyleft
import PIL.Image
import fitz as pymupdf
def invoke_pymupdf(filepath, index, scale=4, rotation=0, password=None):
@mara004
mara004 / poppler_qt5.py
Last active July 13, 2024 14:31
PDF rendering with poppler-qt5
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Note that Poppler is GPL-licensed, so this code is altogether affected by copyleft
import io
import PIL.Image
from popplerqt5 import Poppler
from PyQt5.QtCore import QByteArray, QBuffer
@mara004
mara004 / poppler.py
Last active July 11, 2024 20:35
PDF rendering with python-poppler
# SPDX-FileCopyrightText: 2024 geisserml <[email protected]>
# SPDX-License-Identifier: MPL-2.0
# Note that Poppler is GPL-licensed, so this code is altogether affected by copyleft
import PIL.Image
import poppler # python-poppler
from poppler.cpp.page_renderer import render_hint
def _translate_rotation(rotation):