Skip to content

Instantly share code, notes, and snippets.

View mmodrow's full-sized avatar

Marc A. Modrow mmodrow

  • Bremen, Germany
View GitHub Profile
@mmodrow
mmodrow / Remove-ExitRotationFlags.ps1
Created January 9, 2026 21:46
Removes Metadata (Exit) Rotation from jpeg files using exiftool
gci *.jp*g | ForEach-Object{ & '..\exiftool-13.45_32\exiftool().exe' -Orientation=1 -n $_.FullName}
@mmodrow
mmodrow / Rotate-ImagesInPlace.ps1
Created January 9, 2026 21:45
Rotates images in Place using image magick
gci *.jp*g | ForEach-Object{ magick mogrify -rotate 90 $_.FullName}
@mmodrow
mmodrow / find-duplicates.ps1
Created January 8, 2026 14:19
Identify files with duplicate content and remove all but one (or perform some other action on the dupe sets)
$groupedDuplicates = Get-ChildItem -Recurse -File `
| Group-Object -Property Length `
| Where-Object { $_.Count -gt 1 } `
| ForEach-Object { $_.Group } `
| Get-FileHash `
| Group-Object -Property Hash `
| Where-Object { $_.Count -gt 1 } `
| ForEach-Object { $_.Group } `
| Group-Object -Property hash
git fsck --lost-found | grep "^dangling commit" | sed "s/^dangling commit //g" | xargs git show -s --oneline
@mmodrow
mmodrow / Set-GitCommitDate.ps1
Last active June 13, 2025 19:01
Manually set current git commit date
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[datetime]
$dateTime
)
$dateString = $dateTime.ToString("yyyy-MM-ddTHH:mm:ss")
git commit --amend --date=$dateString --no-edit --reset-author
@mmodrow
mmodrow / Remove-Trailing5Seconds.ps1
Created April 24, 2024 04:43
Removes the last 5 seconds from all mp4 files in the directory using ffmpeg and stores them in an adjacent directory.
$videos = Get-ChildItem *.mp4
foreach ($video in $videos) {
$duration = [float](ffprobe -i $video.fullName -show_entries format=duration -v quiet -of csv="p=0")
ffmpeg -i $video.fullName -ss 0 -to ($duration - 5) (Join-Path "..\trimmed" ($video.name))
}
@mmodrow
mmodrow / ConvertTo-SilentVideo.ps1
Last active March 26, 2024 19:55
Use FFMpeg to strip (unusable) Audio from video files
$videos = @(Get-ChildItem *.avi | Where-Object { -not $_.name.contains("_h264") -and -not $_.name.contains("_noAudio") })
$total = $videos.count
$current = 1
foreach ($video in $videos) {
$silentVideoName = $video.basename + "_noAudio_h264.mp4"
Write-Progress -Status "Stripping Audio and recoding video to h.264." -PercentComplete ($current / $total * 100) -Activity "Writing file $current of $total."
if ( -not (Test-Path $silentVideoName )) {
Write-Host ("Converting " + $silentVideo.name + " to " + $silentVideoName + ".")
ffmpeg -i $video.name -an -c:v libx264 -hide_banner -v warning $silentVideoName
@mmodrow
mmodrow / Remove-SilentVideoWithStatic.ps
Created March 26, 2024 17:56
Remove Video that had no (proper) audio and was stripped by ConvertTo-SilentVideo.ps1
$silentVideos = Get-ChildItem *.mp4 -Include @("*_noAudio*", "*_h264*") | Where-Object { $_.length -gt 0 }
foreach ($silentVideo in $silentVideos) {
$silentVideoName = ($silentVideo.basename.replace("_noAudio", "").replace("_h264", "")) + ".avi"
if (Test-Path($silentVideoName)) {
Write-Host ( "removing " + $silentVideoName)
Remove-Item $silentVideoName
}
}
@mmodrow
mmodrow / Export-DenormalizedTrelloCardData.ps1
Created March 14, 2024 06:52
Transform a single card from a Trello Board Export to denormalized JSON
[CmdletBinding()]
param (
[string]
$jsonImportPath,
[string]
$jsonExportPath,
[string]
$cardName
)
$trelloData = Get-Content $jsonImportPath -Encoding UTF8 | ConvertFrom-Json
@mmodrow
mmodrow / ConvertTo-Rtttl.ps1
Last active February 9, 2024 05:34
MIDI->RTTTL converter for BLHeli_32 and BlueJay Quadcopter ESCs
[CmdletBinding()]
param (
[string]
$midiFilePath,
[string]
$label = "Label",
[int[]]
$midiChannels = @(2),
[int]
$ticksPerQuarterNote = 192,