πŸ§–πŸ»β€β™€οΈ Symlink your Steam screenshots to a sensible place

Overview

lnshot

Rust

πŸ§–πŸ»β€β™€οΈ Symlink your Steam games' screenshot directories into your Pictures folder

About

This is a little utility to work around a bugbear of mine with the Steam client. Steam provides a pretty handy in-game screenshot tool, but the screenshots are stored deep in Steam's own folder hierarchy, despite lacking any cloud sync function other than uploading them manually.

Running lnshot will generate a set of symbolic links (basically, folders which are shortcuts) for each game's screenshot directory within your normal Pictures folder. This means you get this:

πŸ“‚ ~/Pictures/Steam Screenshots
β”” πŸ“‚ Ticky
  β”œ πŸ“‚ Hardspace Shipbreaker
  β”‚ β”” 🌌 20221020102933_1.jpg
  β”œ πŸ“‚ Need for Speed: Most Wanted
  β”‚ β”” πŸŒƒ 20221005164632_1.jpg
  β”” πŸ“‚ The Big Con
    β”” 🏞 20221005164632_1.jpg

Instead of this:

πŸ“‚ ~/.local/share/Steam/userdata
β”” πŸ“‚ 69420691
  β”” πŸ“‚ 760
    β”” πŸ“‚ remote
      β”œ πŸ“‚ 1139280
      β”‚ β”” πŸ“‚ screenshots
      β”‚   β”” 🏞 20221005164632_1.jpg
      β”œ πŸ“‚ 1161580
      β”‚ β”” πŸ“‚ screenshots
      β”‚   β”” 🌌 20221020102933_1.jpg
      β”” πŸ“‚ 6547380
        β”” πŸ“‚ screenshots
          β”” πŸŒƒ 20221005164632_1.jpg

lnshot can detect Steam's installation directory, and automatically find your Pictures folder across all three supported Steam platforms.

User folders are generated for each Steam user logged into your system (filtering is not yet supported). Game folders will be named after your game title for non-Steam shortcuts, and named the same as the steamapps/common installation folder for games managed by Steam, which is usually a reasonable name. This may change to use the full Steam app name in the future.

lnshot does this offline, using only the metadata Steam already has stored on your hard disk.

Installation

Builds are not currently provided, so it's currently expected that you know your way around the Rust compiler.

Clone this repository and run cargo install --path . inside it.

Usage

Run lnshot to automatically symlink to Steam Screenshots within your Pictures folder.

lnshot --help provides information about other options, including using a different name for the Steam Screenshots folder.

Automation

lnshot provides a "daemon" mode, allowing for monitoring the file system for changes in the Steam screenshot folders.

Linux (Steam Deck)

On Steam Deck, we can take advantage of systemd to run lnshot automatically.

  1. Run mkdir -p ~/.config/systemd/user to create the folder we need
  2. Create ~/.config/systemd/user/lnshot.service (easy mode: nano ~/.config/systemd/user/lnshot.service), and paste this into it:
    [Unit]
    Description=Steam Screenshot Symlinking Service
    
    [Service]
    ExecStart=%h/.cargo/bin/lnshot daemon
    Restart=always
    
    [Install]
    WantedBy=default.target
  3. Save the file
  4. Run systemctl enable --user lnshot.service to make it automatically start in the future.
Comments
  • shortcuts.vdf does not exist

    shortcuts.vdf does not exist

    My Steam config folder does not contain a config/shortcuts.vdf, so this tool fails at that step. Do I need to instruct Steam to create shortcuts for every game when I install them for this to exist?

    opened by kode54 3
  • Bump clap from 4.1.1 to 4.1.4

    Bump clap from 4.1.1 to 4.1.4

    Bumps clap from 4.1.1 to 4.1.4.

    Release notes

    Sourced from clap's releases.

    v4.1.4

    [4.1.4] - 2023-01-24

    Fixes

    • (help) Respect disable_colored_help when using arg_required_else_help

    Performance

    • Speed up compiling arg! macro

    v4.1.3

    [4.1.3] - 2023-01-23

    Fixes

    • (error) Improve suggested flag/value/subcommand when two share a long preifx
    • (error) When suggesting one of several subcommands, use the plural subcommands, rather than subcommand

    v4.1.2

    [4.1.2] - 2023-01-23

    Fixes

    • In documentation, refer to get_flag, rather than get_one::<bool>
    Changelog

    Sourced from clap's changelog.

    [4.1.4] - 2023-01-24

    Fixes

    • (help) Respect disable_colored_help when using arg_required_else_help

    Performance

    • Speed up compiling arg! macro

    [4.1.3] - 2023-01-23

    Fixes

    • (error) Improve suggested flag/value/subcommand when two share a long preifx
    • (error) When suggesting one of several subcommands, use the plural subcommands, rather than subcommand

    [4.1.2] - 2023-01-23

    Fixes

    • In documentation, refer to get_flag, rather than get_one::<bool>
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump anyhow from 1.0.66 to 1.0.68

    Bump anyhow from 1.0.66 to 1.0.68

    ⚠️ Dependabot is rebasing this PR ⚠️

    Rebasing might not happen immediately, so don't worry if this takes some time.

    Note: if you make any changes to this PR yourself, they will take precedence over the rebase.


    Bumps anyhow from 1.0.66 to 1.0.68.

    Release notes

    Sourced from anyhow's releases.

    1.0.68

    • Opt out of -Zrustdoc-scrape-examples on docs.rs for now

    1.0.67

    • Improve the backtrace captured when context() is used on an Option (#280)
    Commits
    • 867763b Release 1.0.68
    • c0a87d0 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 1cc707b Release 1.0.67
    • 613b261 Update build status badge
    • 0f922d7 Disable backtrace CI on Rust 1.50
    • acecd9b Update ui test suite to nightly-2022-12-15
    • 0bac51f Time out workflows after 45 minutes
    • 60e8800 Fix renamed let_underscore_drop lint
    • 8d1c734 Update ui test suite to nightly-2022-11-16
    • 451651b Update ui test suite to nightly-2022-11-11
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump clap from 4.0.18 to 4.1.1

    Bump clap from 4.0.18 to 4.1.1

    Bumps clap from 4.0.18 to 4.1.1.

    Release notes

    Sourced from clap's releases.

    v4.1.1

    [4.1.1] - 2023-01-14

    Fixes

    • (error) Small softening attempt for "unexpected argument" error

    v4.0.32

    [4.0.32] - 2022-12-22

    Fixes

    • (parser) When overriding required(true), consider args that conflict with its group

    v4.0.31

    [4.0.31] - 2022-12-22

    Performance

    • Speed up parsing when a lot of different flags are present (100 unique flags)

    v4.0.30

    [4.0.30] - 2022-12-21

    Fixes

    • (error) Improve error for args_conflicts_with_subcommand

    v4.0.29

    [4.0.29] - 2022-11-29

    v4.0.28

    [4.0.28] - 2022-11-29

    Fixes

    • Fix wasm support which was broken in 4.0.27

    v4.0.26

    [4.0.26] - 2022-11-16

    Fixes

    • (error) Fix typos in ContextKind::as_str

    v4.0.25

    [4.0.25] - 2022-11-15

    Features

    ... (truncated)

    Changelog

    Sourced from clap's changelog.

    [4.1.1] - 2023-01-14

    Fixes

    • (error) Small softening attempt for "unexpected argument" error

    [4.1.0] - 2023-01-13

    Compatibility

    MSRV changed to 1.64.0

    For apps with custom --help and --version flags:

    • Descriptions for --help and --version changed

    When apps have errors imitating clap's error style:

    • Error message style was changed, including
      • Moving away from "did you mean" to tips
      • Leading letter is lower case
      • "For more" added some punctuation

    Features

    • ArgMatches::get_occurrences support for argument values to be grouped by their occurrence

    Fixes

    • (derive) Allow upgrade_from when arguments / subcommands are explicitly marked as required
    • (help) Try be more clearer and succinct with --help and --version (also helps with overflow)
    • (error) Try to be more clearer and succinct with error messages
    • (error) Officially adopt an error style guide

    [4.0.32] - 2022-12-22

    Fixes

    • (parser) When overriding required(true), consider args that conflict with its group

    [4.0.31] - 2022-12-22

    Performance

    • Speed up parsing when a lot of different flags are present (100 unique flags)

    [4.0.30] - 2022-12-21

    Fixes

    • (error) Improve error for args_conflicts_with_subcommand

    ... (truncated)

    Commits
    • 74a82d7 chore: Release
    • 06f392a docs: Update changelog
    • 4d913fa Merge pull request #4639 from epage/error
    • 162a556 fix(error): Try to soften unexpected argument/value errors
    • 34d856b chore: Release
    • 889ca7a chore: Bump versions for 4.1
    • 2bafb9b docs(contrib): Define a compatibility policy for help/error output
    • a41ca2e docs: Update changelog
    • 523adc2 Merge pull request #4635 from epage/stablize
    • b4f111a feat: Stablize ArgMatches::get_occurrences
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump steamlocate from 1.0.2 to 1.1.0

    Bump steamlocate from 1.0.2 to 1.1.0

    Bumps steamlocate from 1.0.2 to 1.1.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump serde from 1.0.145 to 1.0.152

    Bump serde from 1.0.145 to 1.0.152

    Bumps serde from 1.0.145 to 1.0.152.

    Release notes

    Sourced from serde's releases.

    v1.0.152

    • Documentation improvements

    v1.0.151

    • Update serde::{ser,de}::StdError to re-export core::error::Error when serde is built with feature="std" off and feature="unstable" on (#2344)

    v1.0.150

    • Relax some trait bounds from the Serialize impl of HashMap and BTreeMap (#2334)
    • Enable Serialize and Deserialize impls of std::sync::atomic types on more platforms (#2337, thanks @​badboy)

    v1.0.149

    • Relax some trait bounds from the Serialize impl of BinaryHeap, BTreeSet, and HashSet (#2333, thanks @​jonasbb)

    v1.0.148

    • Support remote derive for generic types that have private fields (#2327)

    v1.0.147

    • Add serde::de::value::EnumAccessDeserializer which transforms an EnumAccess into a Deserializer (#2305)

    v1.0.146

    Commits
    • ccf9c6f Release 1.0.152
    • b25d0ea Link to Hjson data format
    • 4f4557f Link to bencode data format
    • bf400d6 Link to serde_tokenstream data format
    • 4d2e36d Wrap flexbuffers bullet point to 80 columns
    • df6310e Merge pull request #2347 from dtolnay/docsrs
    • 938ab5d Replace docs.serde.rs links with intra-rustdoc links
    • ef5a0de Point documentation links to docs.rs instead of docs.serde.rs
    • 5d186c7 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 44bf363 Release 1.0.151
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Configure Renovate

    Configure Renovate

    Mend Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    🚦 To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • Cargo.toml (cargo)

    Configuration Summary

    Based on the default config's presets, Renovate will:

    • Start dependency updates only once this onboarding PR is merged
    • Enable Renovate Dependency Dashboard creation.
    • If Renovate detects semantic commits, it will use semantic commit type fix for dependencies and chore for all others.
    • Ignore node_modules, bower_components, vendor and various test/tests directories.
    • Autodetect whether to pin dependencies or maintain ranges.
    • Rate limit PR creation to a maximum of two per hour.
    • Limit to maximum 10 open PRs at any time.
    • Group known monorepo packages together.
    • Use curated list of recommended non-monorepo package groupings.
    • A collection of workarounds for known problems with packages.

    πŸ”‘ Would you like to change the way Renovate is upgrading your dependencies? Simply edit the renovate.json in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.


    What to Expect

    With your current configuration, Renovate will create 2 Pull Requests:

    Update Rust crate steam_shortcuts_util to 1.1
    • Schedule: ["at any time"]
    • Branch name: renovate/steam_shortcuts_util-1.x
    • Merge into: main
    • Upgrade steam_shortcuts_util to 1.1
    Update Rust crate steamlocate to 1.1
    • Schedule: ["at any time"]
    • Branch name: renovate/steamlocate-1.x
    • Merge into: main
    • Upgrade steamlocate to 1.1

    ❓ Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 0
  • Hard-code built-in apps

    Hard-code built-in apps

    Some apps, like the Steam client itself, are not "installed" games, but do have a Steam app ID (7, in the case of the client). These probably need to be hard-coded.

    opened by ticky 0
  • πŸ“ Use Steam app names instead of folder names

    πŸ“ Use Steam app names instead of folder names

    opened by ticky 0
  • Steam game folder names aren't always sensible

    Steam game folder names aren't always sensible

    Game folders will be named after your game title for non-Steam shortcuts, and named the same as the steamapps/common installation folder for games managed by Steam, which is usually a reasonable name.

    NFS Unbound breeches this social contract, instead using its codename of "Excalibur", so this behaviour may need revision.

    opened by ticky 0
Owner
Jessica Stokes
Cute queer cybersorceress. Rad software maker. Aspiring nomad.
Jessica Stokes
Some Steam patches, fixing broken Steam features on Asus Rog Ally

Ally Steam Patches Ally Steam Patches is a tool designed to enhance your Steam experience by applying patches to the Steam client. Installation To ins

MIkhail Kozlov 2 Jul 10, 2023
Some Steam patches, fixing broken Steam features on Asus Rog Ally

βš™οΈ Steam Patch Steam Patch is a tool designed to enhance your Steam experience by applying patches to the Steam client. ?? Installation To install Ste

MIkhail Kozlov 3 Jul 18, 2023
CLI tool for checking ProtonDB compatibility of your Steam games.

protondb-check protondb-check is currently in active development stage, there might be bugs or other problems. Table Of Contents About Available comma

Giorgi Anakidze 3 Apr 1, 2024
A CLI tool for getting screenshots of URLs using headless chrome

rustywitness ?? ?? ?? Web screenshot utility A CLI tool for getting screenshots of URLs using headless chrome Built with ❀︎ by swanandx and contributo

Swanand Mulay 16 Jan 3, 2023
πŸ“Έ website screenshots as a service

website-screenshot ?? website screenshots as a service Features ?? powered by Rust ?? blazing fast ?? ‍‍ built-in ratelimiter ?? built-in storage prov

Tomio 13 Oct 22, 2022
sg = Steam Guard, access sg verification code locally.

Steam Guard CLI Access your Steam Guard token locally. Credit https://github.com/steevp/UpdogFarmer/blob/master/app/src/main/java/com/steevsapps/idled

Vanilla's Lab 7 Nov 10, 2022
Decryptor for Steam app: 2378900

IelmenDecryptor A batch decryption program for the files of a game on Steam that has the app ID: 2378900 It will process all encrypted .png, .json, an

null 3 Nov 14, 2023
Run Electron Steam games natively on Linux*

Boson βš›οΈ Boson is a Steam compatibility tool that allows you to run Electron-based games with a native build of Electron, rather than using the game's

Fyra Labs 5 Feb 13, 2024
This repo contains crates that are used to create the micro services and keep shared code in a common place.

MyEmma Helper Crates This repo contains crates that can are reused over different services. These crate are used in projects at MyEmma. But these crat

MyEmma 1 Jan 14, 2022
Logging for text that should stay in the same place in a console.

console_static_text Crate for logging text that should stay in the same place in a console. This measures words to handle wrapping and has some consol

David Sherret 8 Dec 25, 2022
🐒 Atuin replaces your existing shell history with a SQLite database, and records additional context for your commands

Atuin replaces your existing shell history with a SQLite database, and records additional context for your commands. Additionally, it provides optional and fully encrypted synchronisation of your history between machines, via an Atuin server.

Ellie Huxtable 4.6k Jan 1, 2023
Save image from your clipboard πŸ“‹ as an image file directly from your command line! πŸ”₯

Clpy ?? Save copied image from clipboard as an image file directly from your command line! Note It works only on windows as of now. I'll be adding sup

Piyush Suthar 13 Nov 28, 2022
FastSSH is a TUI that allows you to quickly connect to your services by navigating through your SSH config.

Connect quickly to your services ?? FastSSH is a TUI that allows you to quickly connect to your services by navigating through your SSH config. Instal

Julien 85 Dec 14, 2022
Deadliner helps you keep track of the time left for your deadline by dynamically updating the wallpaper of your desktop with the time left.

Deadliner Watch the YouTube video What's Deadliner? Deadliner is a cross-platform desktop application for setting deadline for a project and keeping t

Deadliner 34 Dec 16, 2022
By mirroring traffic to and from your machine, mirrord surrounds your local service with a mirror image of its cloud environment.

mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both Visual Studio Code extension and

MetalBear 2.1k Jan 3, 2023
A Yocto setup and management tool that helps you keep your environment up-to-date and in-sync with your team

yb (Yocto Buddy) yb is designed to make it easy to setup and (perhaps more importantly) keep Yocto environments up-to-date and in-sync with your team.

null 13 Oct 31, 2022
Print your git contributions in your terminal, blazingly fast

Takoyaki Blazingly fast git contribution graph in your terminal Features βœ”οΈ Customizable βœ”οΈ Plugins to support a bunch of cloud based git repositories

kyeboard 13 Feb 6, 2023
Convert your favorite images and wallpapers with your favorite color palettes/themes

dipc doprz' image palette converter Convert your favorite images and wallpapers with your favorite color palettes/themes Color Palettes/Themes catppuc

null 50 Apr 26, 2023
Get your loadshedding schedule in your calendar and never be left in the dark! Open-source, up-to-date, and developer friendly.

Loadshedding schedules in your digital calendar. No apps, no ads, up-to-date, and developer friendly. Get it β€’ Key Features β€’ Using the data β€’ Project

Boyd Kane 117 Apr 26, 2023