Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

Announcing Pegasus Frontend



  • Hey @fluffypillow

    I am not sure if this is a bug or just something odd to my setup but wanted to ask in case you were aware of anything. I'm trying to set up some launch commands using relative paths so I can have a portable emulation folder that I can move to other PCs.

    I have several launch batch files in a separate folder from my ROM directories. When I set up the launch scripts to absolute paths they work fine, but when I configure it as a relative path it will not traverse more than 1 parent directory. More detail on what I am seeing below.

    So my folder structure looks like this - this is on a Windows 10 x64 PC:

    .\pegasus\
        \config
    .\roms
        \nes
        \snes
        \....etc
    .\launch
        (launch bat files here)
    

    This issue is when i configure my launch command as:
    launch: "C:\emulation\launch\test.cmd" "{file.path}" it works fine

    but this does NOT work for some reason:
    launch: "..\..\test.cmd" "{file.path}"
    2019-01-05T23:52:32 [i] Executing command: "..\..\test.cmd" "C:\Emulation\roms\intellivision\Armor Battle (World).int"
    2019-01-05T23:52:32 [w] Could not run the command ..\..\test.cmd; either the invoked program is missing, or you don't have the permission to run it.

    The odd bit is as a test I moved the launch folder in the ROMs directory, and this command DOES work:
    launch: "..\launch\test.cmd" "{file.path}"
    2019-01-05T23:55:18 [i] Executing command: "..\launch\test.cmd" "C:\Emulation\roms\intellivision\Armor Battle (World).int"
    2019-01-05T23:55:18 [i] Process 4856 started

    So for some reason it will traverse up 1 level to find a relative path, but it won't accept the ..\..\ path to traverse 2 levels. If you think this is a bug I'm happy to log this on the git repo. Or any suggestions would be appreciated as well.

    I suppose I could put the launch commands into the ROM folders but I kind of like keeping config and scripts in their own area if I can help it. Just seems odd to me and I've probably just missed something obvious but I've spent too long staring at the screen to see it now!

    Other than this, it has been running great and I am quite happy with how everything has been working so far as I have been setting things up, it's a very nice frontend!



  • @wallmachine hmm that sounds like a really device and game specific thing to do. Perhaps scripts would be better suited for such task? I'm thinking of something like:

    if [game] is in [the list of games using 8-way stick], then
        run the command that toggles the stick
    

    @msheehan79 interesting, it seems as if the working directory isn't set correctly, which might be a bug. Will take a look on it tomorrow.



  • Also a weekly update! Not too many thing yet with the holidays and all, but the work now continues. The planned metadata changes are still in progress, but I've landed a few smaller changes in the meanwhile:

    • Themes can now remember things, for example the last played game, or any arbitrary data they want. You can access the new functions from under api.memory, documentation and example here. You can also check the repos of the ES simple and 9999999 theme for the last few commits.
    • Updated the Default, ES simple and 9999999 themes to remember the last launched game
    • Updated the French translation (thanks Genetik57!)


  • @fluffypillow thanks - let me know if you have any trouble replicating it your end or if you want me to test any other scenarios.



  • @msheehan79 I was in the middle of setting up the directory structure to reproduce the bug, but then noticed something in you comment: in "..\..\test.cmd" "C:\Emulation\roms\intellivision\Armor Battle (World).int", the ..\..\test.cmd part will be resolved to C:\Emulation\test.cmd. Perhaps you wanted to write ..\..\launch\test.cmd? Also how exactly your config files are set up, ie. are you using collections.txt or ES2 XMLs, and if so where are they placed?



  • Finally have the frontend running good showing assets and launching games on Nvidia shieldTV. Only issue is it doesn't seem to natively support Android TV. I was launching the app from sideload launcher then I found a way to create a shortcut on home screen but when I exit a game it brings me back to the my home screen as opposed to the frontend and also wondering if there is a way for the app to recognize my removable storage as it only seems to see native storage. I'm not sure if both issues are related to the app not being a Android TV app. Sorry I lack the technical knowledge of the frontend. But I just wanted to thank you for including Android in your supported devices its a great frontend and I hope to use it as my daily driver.



  • @fluffypillow yes your right, I did typo in my comment above. It was quite late and I had tried probably about 100 different combinations of paths, forward/back slashes, double slashes and everything else I could think of before posting. But in my files I did make sure it was ..\..\launch\test.cmd when I tested it that night.

    I am using collections.txt and metadata.txt launch commands in the various rom directories - I have quite a few game-specific launch commands so the ES2 xml files wouldn't cut it. Also note I just moved my setup to the E: drive so the path references are changed in my new log info below.

    Just to be 100% sure though I just retried and double-checked that the launch command relative path is OK using this command. Assuming the default working directory is E:\Emulation\roms\intellivision the command below should resolve to E:\Emulation\launch\Intellivision.cmd which is where the batch file is located. If I open a regular command prompt and type the command below from the working directory noted, it does work there.

    '..\..\launch\Intellivision.cmd'
    
    2019-01-08T21:57:00 [i] Executing command: `"..\..\launch\Intellivision.cmd" "E:\Emulation\roms\intellivision\Armor Battle (World).int" "jzintv" "intellivision\default-p1-left.kbd" "Intellivision Left" "Intellivision Right"`
    2019-01-08T21:57:00 [w] Could not run the command `..\..\launch\Intellivision.cmd`; either the invoked program is missing, or you don't have the permission to run it.
    
    

    Here is the contents of my collections.txt file for Intellivision - I pass along a few additional parameters to set up Xpadder for keymapping for many emulators which are the additional arguments. I don't think those would impact anything though.

    collection: Intellivision
    shortname: intellivision
    extensions: int
    launch: "..\..\launch\Intellivision.cmd" "{file.path}" "jzintv" "intellivision\default-p1-left.kbd" "Intellivision Left" "Intellivision Right"
    


  • @msheehan79 Thanks! I've managed to reproduce the error on Windows, it seems the working directories indeed don't work there as expected, even when explicitly set. Will make a workaround for it (but likely after the metadata changes).

    @jerzeeloon it's interesting there's such a big difference in the Android of the Shield. I wonder if these issues are common for other Android TVs or just happens on this device?



  • @fluffypillow not entirely sure as shield is the 1st and only Android TV device I've owned as it's become a scarce market aside from tvs with Android TV built in with TV os market being saturated by apple, Roku and ironically Amazon's Android based offering it seems stock Android TV is endangered. The one benefit of the shield is they've maintained steady firmware updates since the original 2015 release and emulation has benifited from good driver support on Nvidia's part. Unfortunately the actual natively supported app offerings are dismal in opposition to say a Android tablet or phone the native appstore on shield only offers a small mixture streaming apps and games that are outdated and Nvidia's native game store offerings are also pretty dismal a few ports of older PC game ports that are overpriced in comparison to the PC version and a andoid game library that seems to fluctuate what apps are Android TV compatible. There's litteraly games I've bought that dissapeared from the marketplace and now have to be side loaded and others that appear in the market but when you click on it there's no option to install it and even web browser play store will say it's not compatible with the shield? Anyway getting off track. What I like about shield is the ability to play my steam/Ubisoft PC library in better then console fidelity for a lower price and at least for now no subscription cost. And secondly it's emulation capabilities which imo far exeed the capability of a standard rasberry pi and even out paces newer more powerful/expensive sbc's like odroid where we lack is the plethora of themes and customization offered by pie devices like attract mode and emulation station and recal box. The only decent frontend I've found is Arcbrowser but it lacks video snap support and requires all custom artwork be in the same folder as the ROMs with the same name and different suffixes which gets tedious and unorganized imo. Other frontends haven't appealed to me and yours is like a ray of hope that I'll finally have a frontend that utilizes high quality scraped assets, has theme support and pretty much offers everything I've wanted in frontend and I retain the the emulation prowess shield provides I almost in a way downgraded to a retropie device for the sake of support even though I've heard it struggles to run certain games in opposition to shield. Sorry I just wrote a book just very enthusiastic about this project. I love your grid theme and really like @PlayingKarrde Gameos theme and can't wait to see how this thing develops. In the past there were alot of avenues to get side loaded apps recognized by shield as if it was native unfortunately the Oreo update broke alot of apps like apk2tv, TV apps repo and others. Sideload launcher still works but you have to go into it as opposed to having a shortcut to said sideloaded app on home screen and some apps don't play nicely. Yours works for the most part just doesn't return me to your frontend when I exit a emulated game which is a bummer and as I said it doesn't recognize my external hard drive where I primarily keep my ROM collection but I do have 100gb adopted storage flash drive I've moved some of my favorite systems too for the sake of using this great frontend. I thought maybe it was cause my removable storage was NTFS but seeing as you also support windows I assume That's not the case. I don't know if it interests you to try and natively support Android TV or the Shield derivative in this case but maybe you could touch base with other devs like the people who make dig or Arc browser totally your call and I can't be mad either way I'm just glad you supported Android in the 1st place as we usually get overlooked while Linux, pi and windows get all the love. I wish I was dev savvy and had answers but I'm just a Beneficiary who enjoys retrogaming. Anyway cheers and thank you. I look forward to the future of Pegasus regardless of whether you pledge support to shield as I'm sure you have a lot on your plate as is with multi platform support and the constant improvements your doing. Again sorry for the book. End of rant.



  • @fluffypillow Ok no worries! Just glad you could replicate the issue your end so I know it's not just some goofy issue with my specific setup. I'll keep an eye on your git updates and can retest once you do have time to implement a fix.

    Thanks for looking into this!



  • @jerzeeloon do you mind sharing your settings for the shield?

    Also, plus one here for proper Shield support. It really is an amazing emulator machine. I test all my changes for my theme on it but haven't spent any time getting the actual launching of games going. It's definitely a pain launching it from the sideload launcher too (I haven't even figured out how to get a shortcut on the home screen yet haha).

    If quitting games goes back to the home screen rather than the launcher that kind sucks though :( I was considering moving my main emulation platform over to it but may have to stick with PC if that's the case.



  • @PlayingKarrde I hear you my current scenario is that I have a potato laptop and shield is my only avenue for retro gaming for the moment, until I can save up to build a gaming PC. This frontend suits my needs but I would like to find a way to return to frontend on emulator exit and use external storage rom paths. Cheers to you for the great theme it's what I'm currently using. My current setup is quick and dirty as I just copied a few systems over from my external for testing and I'm actually using paid for standalone .emu apps for launching snes, Genesis and the free MupenFZ from the play store for N64 cause it was less parameters then retroarch but I plan on trying retroarch launching soon. Anyways here's the settings I'm currently using

    collection: snes
    extension: sfc,smc
    launch: am start --user 0 -a android.intent.action.VIEW -n
    com.explusalpha.Snes9xPlus/com.imagine.BaseActivity
    -d "file://{file.path}"

    collection: N64
    extension: v64,z64,n64
    launch: am start --user 0 -a android.intent.action.VIEW -n org.mupen64plusae.v3.fzurita/paulscode.android.mupen64plusae.SplashActivity -d "file://{file.path}"

    collection: Genesis
    extension: gen,md
    launch: am start --user 0 -a android.intent.action.VIEW -n com.explusalpha.MdEmu/com.imagine.BaseActivity -d "file://{file.path}"



  • Weekly update!

    • In progress
      • Initial implementation of the metadata changes is done, I'll write tests and finish what's left the next week (or two)
    • Android TV improvements
      • Pegasus is now a proper TV app and should no longer require sideloading (however it wasn't tested on actual hardware, so feel free to report if something doesn't work)
      • Added higher resolution launch icons for devices with huge screen resolutions


  • @fluffypillow Thank you so much for adding proper Android TV support. This is already imo the best frontend on Android and the fact that it's still considered alpha and your dedication to continuous improvement is relentless. I can only fathom how great it will be in the future. Thank you.



  • @fluffypillow I'm having another go at updating my theme but due to the scale I'm still struggling a bit. I'm just wondering, now that there's no concept of a current collection or current game you're doing the sorting and getting of those manually. I'm just wondering how you're handling that. Are you doing it all at the theme.qml level and sending those IDs down to each of your subsequent pages? Handling all game and collection management at the top level then? I mean that seems like the most efficient way but I just want to make sure before I go too far down that rabbit hole. I only have short bursts of time to spend on the theme these days so I'm not able to commit enough of a chunk of time to figure it out completely on my own.

    -edit- no matter. I went ahead with this method anyway and I've gotten it all updated. Now I can look into implementing some of these new features I was badgering you about haha

    I did notice that it isn't pulling the year from the metadata. Is this part of your current updates?



  • @PlayingKarrde actually at the moment none of my themes use custom sorting, they just use the default by-name order (yeah, I should really fix the filter panel in the default theme). Unlike graphical things though, sorting shouldn't be a performance bottleneck, so you can use it wherever you'd like to, eg. in the same file where you'd display a list of games is fine too.
    In practice when you have a model of which you want to have a sorted or filtered version, eg. api.allGames, instead of using it directly you'd create a SortFilterProxyModel, set the api.allGames as its input, and use this new object as the model of say, ListView. Here's a short example for using SortFilterProxyModel here: http://pegasus-frontend.org/docs/themes/api/#sorting-and-filtering, and you can find the theme update commits around the bottom part of this comment.

    As for the current selection, in my themes the collections and games are often managed in different files (eg. a system selector bar), so yes, in these case I had to route the collection (or its index) from one file to another. To do this, you can use the fact that propertyes of an item are accessible in its parent, and so can be set up as parameters for other objects.
    In the ES2 theme for example, the Collection screen has a currentCollection property that is updated when the collection changes. This property is accessible in its parent, ie. theme.qml, where then it is set (bound) as the value of the Details screen's similarly named property, here. So whenever the collection changes on the Collection screen, the Details screen's property is updated accordingly.
    For the reverse direction (changing the collection from the Details screen), I emit signals where I ask the Collection screen to select the next/prev collection. These are also handled in theme.qml, cause the Collection screen to change the current collection property, and in turn update the Details screen too. This also keeps the two screens in sync.

    Now this is just one way to do it, managing top-level index properties in theme.qml is also certainly a possibility (and I think I've used it in one of the themes). You can do whichever fits your use case or theme structure better.

    I did notice that it isn't pulling the year from the metadata

    Hm could you explain that a bit? Does it fails to read the release date from the metadata files?



  • @fluffypillow Yep I handled all my collection and game selection handling at the theme.qml level and either passed them down through bindings or used signals coming up to affect them. To be honest I think this way is actually a lot cleaner as now there's only one place I need to worry about controlling this information, although I've definitely had to get creative with naming haha.

    I actually haven't looked into sorting too much yet but will likely take a look at this today. It definitely seems very powerful. Would you liken it to doing a SQL request? If so there are definitely some cool things I'd like to try.

    Hm could you explain that a bit? Does it fails to read the release date from the metadata files?

    Year, month and day don't seem to pull anything back when called. I just get an undefined value. Release works so I guess I could just format that, but just wanted to let you know.



  • @PlayingKarrde

    Would you liken it to doing a SQL request?

    In terms of sorting and filtering a selection, yes, kind of like that. Nothing to JOIN though :)

    Year, month and day don't seem to pull anything back when called.

    Ah yes, they got renamed to releaseYear, etc. a few releases ago, then forgot to update the docs. But considering that these can be queried with simple JS calls too, it might be better to just remove them altogether.



  • @fluffypillow Ah perfect I'll just use the JS call instead thanks.

    BTW, do you happen to know how to get a gridview to automatically scroll to the correct index if it's loading from memory? The correct item is selected but the view won't switch to it unless I change the index first.



  • @PlayingKarrde I think it should scroll there if the index is changed after the view is initialized, ie. in Component.onCompleted or later, like here. If that doesn't seem to work, you can also scroll there manually with positionViewAtIndex.



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.