Versatile C++ game scraper: Skyscraper
-
@muldjord
Personally, I think it makes more sense to cache based on the hash of the actual ROM file itself and not the hash of the compressed file that contains it (because the hash of a 7z, ZIP or RAR file may change, even though the data it contains does not change).That said, you’re right, it is a lot simpler to just cache based on the base file’s hash. I can also understand why you wouldn’t want to spread the 7z unpack hack around further in the code. So I totally see your point. :)
Let me know if you need any more debug data on the incorrect hash bug.
-
@timb Yes, I do see your point in that aswell if I change it to be an option for '--nounpack' instead (so it would be default to always unpack and id from the files inside zips in the local cache). But it would mean that all users' current localdb's would break in an instant... So I'd need to convert the sha1's on the fly from zip sha1's to contained file sha1's in order for that not happen which means I'd need to sha1 twice for a long time in order to compare the sha1 from the localdb. Ugh... :D
-
@muldjord
Yeah, that’s kind of a mess. Though, there is a potential solution: I’m about halfway through writing a quick and dirty Python script that parses the database XML file and changes the SHA1 keys from the unpacked ROM to that of the packed 7z file. It could easily be modified to do the reverse. You could prompt the user to run it during an upgrade. Obviously it wouldn’t change entries where the original 7z file no longer exists, but the script could always trim those from the DB and run the Skyscraper cleanup option. Hmm, yeah, it seems totally doable.(If you do eventually decide to go this route, I’d be happy to write a real production ready version of such a script with proper error handling and such. I could also do it in Bash (ugh) if you didn’t want any dependencies.)
-
@timb Thank you, I'll give it some thought. I'm leaning towards a solution that does it automatically for each localdb entry when it is requested. That is, if I decide to go ahead with it at all. :) I'm also quite happy with the solution as it is if I get that weird bug fixed you posted about earlier.
-
@muldjord
Speaking of the weird bug, it gets weirder!Total number of games: 733 Successfully scraped games: 661 Skipped games: 72 (Filenames saved to '~/.skyscraper/skipped-screenscraper.txt')
Now, these same 733 games scraped just fine as extracted ROMs. If I use 7z on the Pi to extract these problem files (the same 7z Skyscraper is using) they extract fine and show the correct hashes. So I know it's not the archive or ROMs that are the problem.
All 72 of the skipped files are returning the same hash (that I posted earlier, it doesn't appear to change). Weird, right?
-
@timb I have a guess. Maybe it's because it checksums "no data" (or an error message) because of the way I use the QProcess read or something. It's very hacked. Haven't had time to look properly into this yet, I'm just guessing without having entirely checked your descriptions yet.
-
@muldjord
I had similar thoughts earlier. An easy way to see if it’s checksumming an error message from 7zip is to entirely suppress all output from it. We can do that with the following flags:7z e -y -bd -bso0 -bse0 -bsp0 -so
That essentially completely disables console, error and progress output and also answers ‘yes’ to any prompts. It’s the closest you can get to a “-qq” flag. I’ll add that to the source this afternoon, recompile and see if it makes any difference.
No rush on this, by the way. I appreciate you implementing it at all. :)
-
Please
git pull
and try it again. I've improved it quite a bit and added further error checking. I'm interested in knowing if you still get those weird same-sha1 errors. Also, I've added a 20 meg limit to using the unpacking feature to try and avoid running into mem limitations on the pi. Hopefully this is temporary as I would like it to read chunks instead, but so far I haven't gotten that to work reliably. So it take up the amount of ram the rom takes up on disk to calculate the checksums. And if you run several threads AND the compositor is working with images that spells trouble. -
Whatever you did seems to have fixed it! I’ll let you know how the other platforms go (I’ve only tried NES so far). I’m just putting the finishing touches on my script that swaps the SHA1 hashes in the DB files; I want to run it first before scraping the other platforms.
A 20MiB limit seems sensible for now. I don’t think any of my ROMs come close to that. (I keep my N64 stuff uncompressed as the emulator doesn’t support on the fly decompression.)
-
The only time I could see the 20 MiB limit coming in to play is if someone has zipped PSX PBP files. I am unsure if the PSX emulators allow for zipped media though.
-
@livefastcyyoung Yes, it would probably only be relevant for the "newer" platforms such as psx and n64 so I think it'll be ok. Thanks for your input guys, I appreciate all of it!
-
-
@timb Glad it works :) And you're welcome! I'll probably make a release with this in a few days.
-
This tool is amazing! Thanks for your work on this, @muldjord
Is there a way to get Skyscraper to scrape ALL of the systems in my RetroPie directory (or a selected set), rather than specifying one at a time? The selph scraper allows you to choose "ALL" or "Selected" systems, and I was looking for the same in Skyscraper but don't see it in the docs.
Also, I just scraped a bunch of MAME games and many of the videos Skyscraper got back were not playable (initial simple mode scrape). I can see altbeast.mp4 (2.8 MB) or centiped.mp4 (928 KB) for example, and they won't play via Mac or on the Pi. Any way to fix this?
-
@stevew25561 Thank you, glad you like it! :) No, there is no way to scrape all platforms, you'll have to script that youself. :)
Did you get those videos from screenscraper or arcadedb? I just scraped centiped from both arcadedb and screenscraper and they play just fine with mplayer. I did notice that it has some weird dimensions because centipede is a vertical game. So I'm guessing it's because EmulationStation has issues with that. Not really something I can fix I'm afraid, as I basically just download the videos and save them as is.
-
@muldjord
is there a way to get the media off of screenscraper that actually belong to the scraped game region ? For example there is multiple covers for this game:007 - The World Is Not Enough:
https://www.screenscraper.fr/gameinfos.php?gameid=102752&action=onglet&zone=gameinfosmediasThe covers are different for different regions of the game. Is it actually possible to get the cover for the german version through skyscraper?
In the source of skyscraper i found following regions:
eu
us
ss
uk
wor
jpAre there more options for the region parameter?
What do the parameter ss and wor stand for?
wor = world? -
@parasven If you want the German ones, just use '--region de' I believe it is. 'ss' simply means 'screenscraper' and is a generic region they apply to any media they don't have a region for. The regions listed in the source are just the priority list I use internally. 'wor' just means world I'm guessing. Probably for games that are regionless.
There are many more options, they are listed with this call (Chrome can view this url directly, otherwise save it and open it in a text editor):
https://www.screenscraper.fr/api/regionsListe.php?devid=xxx&devpassword=yyy&softname=zzz&output=xml&ssid=test&sspassword=testBtw, keep in mind that even though you set '--region de' it doesn't mean it will find german versions of all the covers. It always falls back to the internal regions if the one provided manually can't be found. So you will still see the others for the ones where a 'de' version didn't exist.
-
@muldjord
Thank you very much for that list. I found some of these regions by hand with try and error heheLove your scraper btw. It is very fast and works like a charm. The localDB is a very cool feature to be honest :)
-
@dorkvader Just noticed this now man.
Damned if I can see your email there though man. Is there something I'm supposed to do when I load your profile? I just can't find it.
-
@muldjord Thanks for the reply.
I used the simple mode to scrape so I can't tell what video source they came from. I'll try again in manual mode and specify screenscraper or arcadedb.
Additional questions:
-
Is there a command to scrape and overwrite just one rom file? For example, I have centiped.zip in /home/pi/RetroPie/roms/mame-libretro
-
What does scraping one rom do to the gamelist.xml file?
Thanks...
-
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.