Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bash scripts

License

Scripts marked with a 🌟 are ones I use a lot or am particularly proud of.

Image manipulation

  • 🌟 imagedate.sh: Rewrite file and metadata dates on images to increment in the order of the alphabetized filenames. Useful when you have a system (Snapfish) that will only order by date, but you want images ordered by filename.
  • minpic.sh: Minify JPEG and PNG images, losslessly, for the web. Really just a more convenient wrapper for Trimage.
  • 🌟 modimg.sh: Create optimized image formats for the web. Generate WebP, AVIF, and JXL images for browsers that support them, then optimize the fallback JPEG, PNG and GIF images. See the file for additional options and details.
  • webpjpg.sh: Convert webp images to lossless PNG first, then to JPEG.
  • 🌟 pdf2jpg.sh: Convert each page of a PDF to JPEG images, each with the same name as the PDF and the page number appended. Page range, image resolution and quality are configurable. Defaults to progressive JPEGs optimized for the web.

Video manipulation

  • avimp4.sh: Convert AVI videos to MP4 format. More thorough than ffmpeg's default process, resulting in both smaller and better-quality videos.
  • 🌟 convertvid.sh: Convert any video files readable by ffmpeg (including but not limited to MP4, MPG, M4V, MOV, WEBM, WMV, AVI, 3GP) into modern H265-encoded MP4 file. This will generally be smaller in file size and more widely playable than other video formats.
  • copyvid.sh: Quick conversion of any file format to MP4.
  • fadevid.sh: Add a fade-in and fade-out, both visually (from/to black) and audially (from/to silence) to a video clip.
  • joinvid.sh: Combine videos.
  • markvid.sh: Add a watermark image to a video.
  • minvid.sh: Minify a video by re-encoding it and stripping metadata.
  • minsmvid.sh: Reduce video size even more than minvid, with second argument for bitrate.
  • stripvid.sh: Strip metadata from a video.
  • trimvid.sh: Trim MP4 videos with a starting timecode and a duration or stop timecode.
  • 🌟 vidcap.sh: Create screencaps of a video, that is, individual images from different time codes of the video. (Not to be confused with video captioning.)

Boilerplate code

A collection of patterns and snippets I use when writing scripts, many derived from William E. Shotts, Jr. See boilerplate for an overview.

Test files

See test for sample files and sources.

Usage

Download the script files you want. You might need to run chmod +x *.sh to make them executable.

You can use them only in the folder in which they reside, or you can make them system-wide. To do the latter, move them to ~/bin. Then, if you're not doing so already, export this directory to your PATH in .bash_profile, .bashrc, .zshrc, etc.:

export PATH="$HOME/bin:$PATH"

If you wish, you can also add aliases for them, saving three whole characters!

alias minvid="minvid.sh"

Dependencies

All scripts note any dependencies required.

I have tested these on Linux (Linux Mint, based on Ubuntu/Debian) using the Z Shell, but they should run in any Bash-compatible environment.

Linting

All scripts have shellcheck run on them with every save and are auto-formatted with shfmt using the Sublime Text plugin.

Other resources

You may also be interested in my local dotfiles (Linux), which also has flavors in Mac and Windows, as well as a hosted (Linux) setup.

License

GNU Affero General Public License v3.0 or later (AGPL 3+). See LICENSE.