We have seen developer @deank cooking up some nice brew lately, the latest creation of sLaunch has now evolved into a new plugin called sMAN, bringing the original vision of the developer to this single plugin containing webMAN & sLaunch, rather then having two separate plugins loaded at boot time (like the preview releases) deank uses a single plugin slot while making sLaunch an even faster sprx loaded dynamically. For simplicity, he concatenated into just one file called sman.sprx the various sprx parts of the app (rawseciso/netiso/slaunch/sman) as well as the html parts of the XMB "Sman Games" feature. If you like to use this alternative UI for loading games, then you should use the sMAN plugin going forward, if you like the traditional way (w/ My Games) then you can use the XMB feature or simply switch to the webMAN plugin as both version will still available for users.

sman.jpg

  • Now, let's move forward to the next step...

    Later today I'll release the "sMAN" - which is webMAN + sLaunch in one plugin. The reason - this is what webMAN was supposed to be - the way I wanted to be since day one:
    • Use only one plugin slot
    • Use about 128KB less vsh memory (about 384KB total vsh memory)
    • Support for /dev_usb000 to /dev_usb128
    • No need for boot delays for scanning usb drives
    • No need for XML generation, "refresh xml" or other complicated tasks
    • No need for the "My Games" entry in XMB (no need for custom category_game.xml)
    • Simplified setup page, eject/unmount/rescan/grouping options available within sMAN's front-end (sLaunch)
    • Support for over 1000 games
    • FTP/WEB/NTFS/NETISO support by the sMAN's back-end (webMAN)
    • Simple use in any cobra compatible CFW by adding sman.sprx to boot_plugins.txt without modifying other files
    • The front-end (menu) is not using resources when not active (opposed to slaunch.sprx)
    • Updated - it now supports switching groups/content-type (ALL/PS1/PS2/PS3/PSP/VIDEO) - press the [SQUARE] button.

    sMAN
    : http://deanbg.com/sman.sprx

    Dean

    p.s. The features in bold will be gradually introduced for easier transition for the users who decide to switch to sMAN.

    Edit: eventually deank decided to add the XMB "Webman Games" feature to sMan as many end users were asking for it.
    It brings back the old XML creation problem he originally wanted to get rid of however it works quite well.
    The only real glitch in sMan 1.11n (& in the latest wMM actually) is found with a limited number of ntfs hdd where the partition cannot be read using the libntfs_ext library port. Hopefully this bug should get fixed after investigation...

    The XMB Game list remains optional however, to be toggled in the sMan settings page.


  • Random Comments about sMAN from deank
    • The good thing about sMAN is that it doesn't require large amounts of memory no matter how many games you have. It can handle 2000, 3000, 5000 games even.
    • sMAN is working a bit faster than sLaunch (at least it looks that way).
    • If you decide to use sman.sprx - remove webftp_server.sprx and slaunch.sprx from your boot_plugins.txt. It is not possible to use them at the same time.
    • Yes, fan-control is still there, because it is "webMAN" in the background. For languages - there is nothing different to webMAN - you'll have to compile it yourself with proper gui.h.


  • Video (POC Version)
    ScreenShot (from preview version)
    --------------------------------------------------------------------
    slaunch_preview.jpg


 
Last edited by a moderator:
u do have more options here though. with the 360, the name is derived from the default.xex (the main executable), so naming the folder it resides in (if it's a jtag rip) matters not. because of this, u have to alter the game names manually like if for example u wanted to remove all the trademarks as per @bguerville 's suggestion. u do have the html connection, which can be faster, but it's still unbearably slow especially with a lot of games. my suggestion is to name it uncharted 1, because I think it will still come last if u just leave it as uncharted. I can't think of a similarity with a 360 game. the closest I can come up with is gears of war 1,2,3 and gears of war judgment, but they're all ordered correctly by default. of course, u can hide games on the 360 in case u have multi-disc games. it doesn't matter which one u have as non-hidden, and it won't say disc 1 (default.xex again) or anything like that usually either. the hacked dash will still load the correct disc for the save u've loaded even if u were to try and trick it. :-P

good idea @sandungas . yeah, that two pass solution might have issues if using multi-region games. I'm at a loss with what to suggestion. sorry for the xbox 360 comparison - it's what I do when it comes to comparing apps to see which scene has a better solution to a problem. the problem persists on the 360 as well, but I think it may have a two pass method in determining game name, then the media id to determine which disc appears first - yeah, they don't always appear in order.
 
Obviously, a dev could program any kind of sorting algorithms, that's not the issue...
There is no way to sort the games list like you guys suggest without introducing a considerable performance hit in the list processing.
Adding 1, or even 2 passes to deal with the region issue, will result in added latency which is bound to annoy a lot more people than the current sorting does!
On top, adding passes might be fine with a few games but what about users dealing without hundreds of them? Thousands of them?

Remember also that the games list potentially comprises ps3netsrv games. You are all aware of the latency involved in building a games list with a few hundred games based on the network. deank posted the statistics a few weeks ago! I don't think it could suffer another pass, never mind 2 extra passes, unless users are ready to wait half an hour or more to get the list ready to display...
 
Last edited:
Obviously, a dev could program any kind of sorting algorithms, that's not the issue...
There is no way to sort the games list like you guys suggest without introducing a considerable performance hit in the list processing.
Adding 1, or even 2 passes to deal with the region issue, will result in added latency which is bound to annoy a lot more people than the current sorting does!
On top, adding passes might be fine with a few games but what about users dealing without hundreds of them? Thousands of them?
Could be optional, and disabled by default, people with lot of games should not enable the second pass because the performance penalty, but this is something personal, some people will be fine with the added delay, other dont, and some will not even notice it because his list doesnt have hundreds of games
 
The best thing to do is ask @deank for his opinion on the matter...

But unless there's a way to do this efficiently, I am not sure he will be interested in adding in sMan a sorting feature that could only be used in certain cases & not others without introducing a major performance penalty...
Still, who knows, he might prove me wrong. It's happened before... Lol
 
I think there is no efficient way to do this sorting, the only alternative i see is to use a hand made database with only the TITLE_ID of the games that had several versions

But this is not efficient either and creating the database itself could be a pita

Other than that... i dont see more ways
 
The best thing to do is ask @deank for his opinion on the matter...

But unless there's a way to do this efficiently, I am not sure he will be interested in adding in sMan a sorting feature that could only be used in certain cases & not others without introducing a major performance penalty...
Still, who knows, he might prove me wrong. It's happened before... Lol

prove u wrong? now, how often does that happen? ;)
 
I think in a case like this (if it bothered me) where its only a handful of games, I would just edit the PARAM.SFO so it reads properly. A simple way would be to add a full stop "." or a "1" to all the first games.
 
As I already explained in post #281, that's also what I would do...
Much easier overall & it would work with all back-up managers...
 
I think in a case like this (if it bothered me) where its only a handful of games, I would just edit the PARAM.SFO so it reads properly. A simple way would be to add a full stop "." or a "1" to all the first games.

adding a 1 is what I suggested several posts back. :-P
 
also, here's a thought: what about a sorting mechanic like psp filer? the psp sorts by time stamps, so with that app, u can manually input new time stamps to move a game up or down the list. that could be on top of the alphabetical sorting method, otherwise it would be a mess. just a thought.
 
The only sorting issue that really bugs me is when some games in a series have (R) in them and others don't.
 
The only sorting issue that really bugs me is when some games in a series have (R) in them and others don't.

I haven't used sman yet, so maybe this already exists, but how about the ability to modify the names of games in the indexer/database from within sman? u could get rid of that R that way without modifying the param.sfo . u can do this on the 360's hacked dash as well. ur only modifying the database, not the files responsible for the game name as read by the system itself.
 
@pinky @sandungas

Here is my understanding of the issue of annoying trailing characters & ways to remove them in sMan.
Remember that originally, there was no XMB integration in sMan. The feature was added later because users asked for it & deank was kind enough to oblige.
The scanned games information is therefore stored in the sman.bin file for use with slaunch.
Then the XMB integration was added, the new functions use the data stored in sman.bin to create the necessary xml for the games category.
There are many ways to modify the xml entries, for instance it's possible to tweak this function in main.c:
Code:
static void write_xml_entry(int fd, u16 rf, const char* icon, const char* title, const char* path, u8 type, const char* id, char* addr)
{
	snprintf(addr, 1024, "<Table key=\"%04i\"><Pair key=\"icon\"><String>%s</String></Pair><Pair key=\"title\"><String>%s</String></Pair><Pair key=\"module_name\"><String>" SPRX_PLUGIN "</String></Pair><Pair key=\"module_action\"><String>%s</String></Pair><Pair key=\"bar_action\"><String>none</String></Pair><Pair key=\"info\"><String>",
			rf, icon, title, path);
	for(u16 u=0;u<strlen(addr);u++) if(addr[u]==0xA) addr[u]=0x20;

	if(type==TYPE_PS3)
	{
		strcat(addr, id);
		strcat(addr, " | ");
	}
		 if(strstr(path, ".ntfs[")  ) strcat(addr, "NTFS");
	else if(strstr(path, "dev_usb") ) strcat(addr, "USB");
	else if(strstr(path, "dev_hdd0")) strcat(addr, "HDD");
	else if(strstr(path, "/net")    ) strcat(addr, "NET");
		 if(strstr(path, "/GAME")	) strcat(addr, " | JB");

	strcat(addr, "</String></Pair></Table>");

	cellFsWrite(fd, addr, strlen(addr), NULL);
}
The 'title' variable passed as parameter contains the title of the game. It's added to the xml fragment by the 1st line of code of this function using 'snprintf'.
Some code can be added before the 'snprintf' call to remove certain characters like TM, R...
The code would first compare the last character of the title to a list of characters to remove & if the character was found, it would be removed. Currently 'title' is a constant variable so to modify the game title, it either needs to be changed into a non constant variable (removing the 'const' keyword from the function declaration) or a copy could be made in another non constant temporary variable, tweaked & used instead.

Here are examples for both options removing [emoji768] & white spaces, note that those 2 code snippets are meant as examples & are untested!
.
1. Changing 'title' into a non constant & modifying its value:
Code:
static void write_xml_entry(int fd, u16 rf, const char* icon, char* title, const char* path, u8 type, const char* id, char* addr)
{
size_t i, t_len=strlen(title);
if(t_len>0) // extra safety check of the string length to avoid potential issues with the for loop initialization below....
{
for(i=t_len-1;i>=0;i--) //looping from the end of the string backwards
{
if((title[i]=='[emoji768]') || (title[i]==' '))title[i]='\0'; //if one of the character is found it is replaced by a null character
else break; // exits the loop
}
}
snprintf(....... // add the rest of the function unmodified
or instead copying the value of the constant 'title' into a temporary char array 'temp', tweak the temporary value then include it in the xml fragment.
Code:
static void write_xml_entry(int fd, u16 rf, const char* icon, const char* title, const char* path, u8 type, const char* id, char* addr)
{
char temp[140]; //max length of character array is 140, same as the slaunch.name variable serialized in sman.bin. It may be better to use a #define statement in a header somewhere rather than using 140 loosely... 
size_t i, t_len=strlen(title);
strncpy(temp, title, t_len+1);//here we use t_len+1, not t_len, to copy the null character at the end of the string. We could use t_len but we would need to tweak the declaration of the temp variable like this : char temp[140]=""; to set each character of the array to null prior to calling strncopy... 
if((t_len>0)&&(t_len<140)) // extra safety check of the string length to avoid potential issues with the for loop initialization below. This safety check may not be necessary in context because the length of the title string stored in sman.bin & currently passed to this function should always be valid however if ever the code evolves in the future, the check may become necessary so it's better to include it from the start than hunting errors later... 
{
for(i=t_len-1;i>=0;i--) //looping from the end of the string backwards
{
if((temp[i]=='[emoji768]') || (temp[i]==' '))temp[i]='\0'; //if one of the trailing characters has been found, it is replaced by a null character
else break; // exits the loop
}
}
snprintf(addr, 1024, "<Table key=\"%04i\"><Pair key=\"icon\"><String>%s</String></Pair><Pair key=\"title\"><String>%s</String></Pair><Pair key=\"module_name\"><String>" SPRX_PLUGIN "</String></Pair><Pair key=\"module_action\"><String>%s</String></Pair><Pair key=\"bar_action\"><String>none</String></Pair><Pair key=\"info\"><String>",
			rf, icon, temp, path);
.... // add the rest of the function unmodified
Note that it may be better to use ANSI/Unicode codes for certain special characters rather than the character themselves...

This code will not make changes to the game titles stored in sman.bin. Titles in slaunch should remain unchanged, in any case the second way ensures it...

To change the titles displayed in slaunch, the same kind of code snippet could be added in this slaunch.c function for instance:
Code:
static void sort_games(uint8_t type)
{
... 
}

Another way altogether would be to serialize both the original & the tweaked game titles in sman.bin for good & from the start so that either of them could be used whenever required, both in slaunch & XMB integration.

In any case, removing occasional trailing characters in this way should not bring performance penalties as bad as discussed previously.

Overall it's very hard to evaluate the potential performance impact of certain code changes without proper figures & statistics therefore testing would be required but still it might be possible to add additional sorting options without suffering from a huge performance penalty, even with a lot of games...
 
Last edited:
Well, as always with programming there are lots of possible ways to implement something & I only described a couple.
I didn't test any of the snippets above & I don't think I will any time soon as I am busy working on xai_plugin however in theory it should work fine.

Users can add/replace the character(s) they wish to remove in the if statement, the only requirement is to leave the whitespace...
Recompile & that's it...

If ever someone tries the modification, please report...[emoji4]
If someone needs further help with the modification just ask... [emoji6]
 
Last edited:
Well, as always with programming there are lots of possible ways to implement something & I only described a couple.
I didn't test any of the snippets above & I don't think I will any time soon as I am busy working on xai_plugin however in theory it should work fine.

Users can add/replace the character(s) they wish to remove in the if statement, the only requirement is to leave the whitespace...
Recompile & that's it...

If ever someone tries the modification, please report...[emoji4]
If someone needs further help with the modification just ask... [emoji6]

I'm sure ur help will be much appreciated. the truth is that I've not used sman. I'm still on wmm. my ps3 has been having some issues lately, so I need to fix that. I've just been so lazy to do so, and the lack of money hasn't helped. I just recently bought a new tv which has made me rethink my entire setup. I'll get around to sman eventually, but probably not for a while.
 
@bguerville the problem i was trying to solve is when we have a series of games named like this:

Awesomegame: kicking again (BLES01005)
Awesomegame: the finale (BLES02590)
Awesomegame: the first (BLES00932)

I odered them alphabetically, like actual backup managers does

In this example is not posible to know the order just by reading the TITLE so we cant relly only on it
This is where applyes my idea of reordering them in a second pass by using the TITLE_ID of this 3 games (BLES12345 or whatever) to find the chronological order of the license numbers (the 12345)

To identify how many games belongs to this group i suggested to read the first 5 characters of the string ("Uncha" for the uncharted examples i posted before, and "Aweso" for the examples im using now) but i think is more accurate to read the first word of the TITLE (all characters until an space is found), because in the first sorting pass (what actual backup managers does) are going to be located consecutivelly we can compare one game with the next game after if (in a for loop to manage all the list of games)

Now we know how many games belongs to this group (3 in the "Awesomegame" example im using now) is needed to reorden them based in the 5 last numbers of the TITLE_ID, so will be ordered this way, from older to newer (a.k.a. from smaller license number to bigger): 00932 -> 01005 -> 02590

Awesomegame: the first (BLES00932)
Awesomegame: kicking again (BLES01005)
Awesomegame: the finale (BLES02590)

But as said before, this will work fine only if the 3 games are from the same region
 
Last edited:
@bguerville the problem i was trying to solve is when we have a series of games named like this:

Awesomegame: kicking again (BLES01005)
Awesomegame: the finale (BLES02590)
Awesomegame: the first (BLES00932)

I odered them alphabetically, like actual backup managers does

In this example is not posible to know the order just by reading the TITLE so we cant relly only on it
This is where applyes my idea of reordering them in a second pass by using the TITLE_ID of this 3 games (BLES12345 or whatever) to find the chronological order of the license numbers (the 12345), so will be ordered this way, from older to newer (a.k.a. from smaller license number to bigger):

Awesomegame: the first (BLES00932)
Awesomegame: kicking again (BLES01005)
Awesomegame: the finale (BLES02590)

But as said before, this will only work if the 3 games are from the same region
I had understood the first time round, there was no need to re-explain... [emoji6]
I posted solutions to deal with trailing characters because the problem was mentioned by pinky..

But to go back to the issue you raised, I am more optimistic than before about the performance hit because further processing with the data stored in sman.bin should be more efficient than with scanning the drives.
In sMan there is already a sort algorithm. From the look of it, it already does most of what would be needed for TitleId re-ordering & the additional code would be minimal...
 
I had understood the first time round, there was no need to re-explain... [emoji6]
I posted solutions to deal with trailing characters because the problem was mentioned by pinky..

But to go back to the issue you raised, I am more optimistic than before about the performance hit because further processing with the data stored in sman.bin should be more efficient than with scanning the drives.
In sMan there is already a sort algorithm. From the look of it, it already does most of what would be needed for TitleId re-ordering & the additional code would be minimal...
Yep, good point about the sman.bin this coulp help to mantain performance, also it allows to do the second pass im suggesting in the background

As example... in the frst pass (what actual backup managers does) you can display the game list in xmb like is done right now (at this point the list is going to keep the sorting problems we are mentioning) and after that... while the user is scrolling the games or doing any other thing in XMB there could be an additional process running in the background that does that "second pass" to identify the groups of consecutive games that shares the same first word in the TITLE... then reorder that groups by the TITLE_ID

Then eventually when the second pass has been completed the list in XMB can be updated (maybe for the next reboot of the PS3)

Also, the TITLE_ID is somthing all backup manager reads at the time of processing the games, so im guessing this info is stored somewhere... so retrieving the TITLE_ID is not going to hit the performance because is already done

What hits performance are the comparisons... of text strings from the first word of TITLE (to identify the groups)... and numeric comparison from the licenses numbers (to see wich one is bigger or smaller)
 
Would this work I wonder, For sorting, assume everything has a 1 or a dot or an underscore on the end of it.

That would maybe be an easy way to sort the ones that are close to alphabetical but end in a number.
 

Featured content

Trending content

Back
Top