Take and Scrape Your Own Screenshots
-
@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!
-
@meleu maybe you could add (if just for debug), exactly what filename the script is looking for and not finding? also, is it supposed to save a copy of the es gamelist to your rom dir? or is that just temporary? would i need to manually move it to the es gamelist dir when ES quits, so it won't be overwritten on exit?
-
@meleu you may want to use an environment variable rather than hardcoding if you want it to work irrespective of the platform: e.g.
[[ -d "$HOME/RetroPie" ]]
-
@meleu i didn't use the ~ in my config file, but retroarch changed it from home/pi/ to ~/
-
@herb_fargus but the script must get the directory from retroarch.cfg
screeshot_directory
. The user can put any valid path there.@gomisensei I used
/home/pi
and it works fine here...
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.