Take and Scrape Your Own Screenshots
-
Yes, I tested the code. ;-)
If you want to avoid the copy'n'paste process you can get it with this command:
wget "https://raw.githubusercontent.com/meleu/share/master/screeper.sh"
And then rename it to
runcommand-onend.sh
. -
@herb_fargus
Man! I've updated the script to create an entry for the games that aren't present ingamelist.xml
. I updated my big post above including the changes (yes! I tested my code!).You can get the updated code at github:
wget "https://raw.githubusercontent.com/meleu/src/master/screeper.sh"
Dude, it was really fun to accomplish this task. Thanks for this challenge!
When you have time to test it (and agree with my method) maybe we can edit the wiki to use this method. It's up to you. (If you agree I can edit it next night).
Cheers!
-
@meleu so where does metadata fit in with this ;)
-
@herb_fargus
one of the prerequisites is:- it was made to work after a scraping (the
$HOME/.emulationstation/gamelists/$system/gamelist.xml
or/etc/emulationstation/gamelists/$system/gamelist.xml
files must exist).
I think it's better to leave the scraping up to the user, because it is very time consuming to be in
runcommand-onend.sh
. - it was made to work after a scraping (the
-
@meleu that is true. and the download-images-false flag with sselphs scraper can pull the metadata without the images- or I guess they may have to scrape metadata first unless its appended.
-
I think the code as is may have a bug. I haven't run it but just reading it over and following the logic.
ROMs named:
Advanced Dungeons & Dragons - Eye of the Beholder (USA).smc
Zool - Ninja of the 'Nth' Dimension (USA).smc
Will scrape to something like:
<image>./images/Zool - Ninja of the 'Nth' Dimension (USA).png</image>
so the regex used to find and replace the old entry won't work and a new entry will be appended.That brings up a second bug with the appending code. If a rom is named with a quote in it will probably parse okay but an ampersand would be considered invalid and skipped:
<path>./Advanced Dungeons & Dragons - Eye of the Beholder (USA).smc</path>
instead of
<path>./Advanced Dungeons & Dragons - Eye of the Beholder (USA).smc</path>
If the file named happened to have a < or > things would be very bad
test <US>.bin
would convert to:
<path>test <US>.bin</path>
and the extra<US>
would throw off the parser.
it should be something like
<path>test <US>.bin</path>
Using something like passing the file name through
sed "s/\&/\&/g;s/>/\>/g;s/</\</g;s/'/\'/g"
might work to convert things to a similar the escaped XML. -
Something else that may be an issue, but I'm not 100% certain, is having files with names like
test [!].bin
this seems like it would create a grep statement likegrep "test [!].bin"
which means the [ and ] wouldn't be taken literally. Also the ! probably causes issues. -
@sselph good points! I'll fix it!
Thanks! -
@sselph
Thanks a lot for your comments! I googled a bit about what you said and I think I've fixed it.Sharing some info...
From what I understand we have three levels of interpretation to take care of:
- shell
- XML
- sed/grep
shell
As we are getting the file names from
runcommand.sh
, they are already valid. I know that file names with strange characters (eg.: percent sign) don't work in emulationstation... So, there's a lot of filtering before the filename gets in theruncommand-onend.sh
.XML
As far as I know (from this source), we have five characters to take care:
" " ' ' < < > > & &
I did it this way:
function echo_xml_safe() { output="$(sed 's#\&#\&#g' <<< "$@")" output="$( sed " s#\"#\"#g s#'#\'#g s#<#\<#g s#>#\>#g" <<< "$output" )" echo "$output" }
[EDIT:
echo
has a limitation: it won't print these exact strings:-e
or-n
. And the use of theprintf
alternative would add another series of strings to be escaped. Well... the "scrape your own screenshot" trick won't work for roms named-e.ext
or-n.ext
. We can survive with it... :-) ]sed/grep
For a safe sed/grep used this function:
function echo_regex_safe() { echo "$(sed 's#[][&\^]#\\&#g' <<< "$@")" }
-
@herb_fargus
I've created another wiki page describing my method.https://github.com/RetroPie/RetroPie-Setup/wiki/Take-and-Scrape-Your-Own-Screenshots-(method-2)
I took the freedom to take several parts of your text. I hope you don't mind. :-)
A huge thanks to @sselph for predict the bugs!
Cheers!
-
Now I would like to share some info I obtained during the time I was working on this script for future references.
I made intensive tests with several
really% $trange&char*cter's [in] ^ROM\ <file> "names".ext
and I've got some conclusions:-
Linux file systems (and most of the UNIX-like file systems) are very permissive with characters used in filenames. Actually, the only two reserved chars for filenames in POSIX systems are
/
and null char (source). -
Many of the files with strange chars don't even launch the emulator.
-
Some failed launches occur due to ES limitations: the ES try to launch a game and I can't see the runcommand dialog, then it goes back to ES.
-
Aloshi says in the gamelists documentation: "One thing to be aware of: the EmulationStation text rendering code doesn't currently support Unicode. If I fix this in the future, it will probably use UTF-8. For now, you'll just have to convert names and descriptions to ASCII. Sorry!"
-
Some other failed launches occur due to runcommand limitations: I can see the runcommand dialog, then it goes back to ES.
-
if the rom name has two or more consecutive spaces, the game launches OK, but the RetroArch isn't able to create a screenshot for this game. Everything seems to be OK, I play the game, I take screenshots with no failed messages, but when I look at the screenshots directory the image isn't there. It seems to be a RetroArch bug.
All the games I managed to launch AND take screenshot, my scrape method worked fine.
Example of strange rom name that worked fine:
mega$ man[vs]dr& willy\< USA >[!].nes
-
-
@meleu I don't like the idea of two wiki pages explaining the same thing. It would make more sense to just have a heading in the original wiki page for each method. The less pages we can have in the wiki the better as its getting quite large
-
@herb_fargus
I'm gonna try to edit and put both methods in one page. -
@herb_fargus
When trying to merge the common info I realized a few things that I would like to know your opinion:retroarch.cfg
method 1
The
runcommand-onstart.sh
always force the configsauto_screenshot_filename = "false" screenshot_directory = "$HOME/RetroPie/roms/$system/images"
Pros:
- no need to manually edit the
retroarch.cfg
. - simplifies the
scraper
command.
Cons:
- if the user want to configure these options with different values in
retroarch.cfg
the script will always overwrite the changes with those from the script. It can bring confusion. - if the user wants to disable the script, he must to delete the
runcommand-onstart.sh
AND manually edit every single systemretroarch.cfg
(therefore, it invalidates the first pro).
method 2
The user must to edit
retroarch.cfg
manually.Pros:
- Respect what is in
retroarch.cfg
. - Only user comfortable with file editing will feel confident to do it. (ok, ok... putting this as a pro is a matter of opinion)
Cons:
- Inexperienced users will avoid it. (the very same thing of the 2nd pro, but put in other point of view).
My question
Do you want to keep that
runcommand-onstart.sh
in the wiki?[EDIT]
We can instruct the users to manually set the configs in the system'sretroarch.cfg
as expected by the method 1 instead of using the script. - no need to manually edit the
-
@meleu yes I think we should keep the runcommand option, I didn't think about the whole configs staying thing but I think we could technically add a function to remove the configs with onend or really tbh if people are going to be using this method I would expect they have a basic competency in editing files and if they dont I would expect they have a basic enough competency to learn.
I think we've coddled people too much with RetroPie . The pi is for learning and doing cool things and that requires taking the time to learn it and make mistakes.
I think both approaches are valid and as you mentioned both have their pros and cons. We should allow the user to make a decision on what will work best for them, and if they become confused on it they should take the time to troubleshoot and learn why so they can actually learn.
-
@herb_fargus
Merged the two methods in the wiki. I hope you like it.
[EDIT: if you have you have time, could you check it for grammar mistakes? English is not my native language.] -
@meleu looks great, thanks for doing that :)
-
OK, the method2 onend script isn't working. It saves a copy of the gamelist.xml from the ES gamelist dir to my rom dir (if one doesn't already exist there) , there is definitely an image file called "pacman.png" (or whatever) in the "~/RetroPie/roms/arcade/images" dir, but the log says
--- start of runcommand-onend.sh ---
There is no screenshot for "pacman" in the "~/RetroPie/roms/arcade/images" folder.
Exiting...file is there, everything is set correctly, I think
-
@gomisensei
It worked fine for me. Let's see what is happening...According to what you said, it's failing on this test:
if ! [[ -f "$screenshot_dir/$image" ]]; then
Can you paste here the output of
ls -l ~/RetroPie/roms/arcade/images/*.png
?[EDIT: you are right, everything is set correctly. Otherwise the script would interrupt before and with other log messages. I'm suspecting of file names...]
-
@gomisensei
I reproduced your problem. I've just realized that theif
statement doesn't recognize the tilde~
symbol as the home directory! Look:pi@retropie:~ $ [[ -d "~/RetroPie" ]] && echo directory exists pi@retropie:~ $ [[ -d "/home/pi/RetroPie" ]] && echo directory exists directory exists pi@retropie:~ $
Well, to make it work for you, change your
screenshot_directory
in the respective retroarch.cfg to/home/pi/RetroPie/...
I'll update the wiki mentioning this issue. Thanks for your feedback!
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.