Page 1 of 1

Expression Help - I can't seem to test for null or not exist.

Posted: 04 Dec 2021, 13:29
by HellPhantom
I have been stuck on this issue now for 2 days now.

Does not matter what I try I just can't figure this one out, please have pity on me.
I want to test when there is a subtitle or audio language and just get simple True or False.

When no subtitles or language exist my code just fails and does not execute my failed block, i want to do something when there is none.
I can't seem to successfully test for this. it does not seem to be null the var just seems to not exist or what ever @#$%#.
I have tried so many things and variables that I would be happy with something as simple as the below to just understand what to do.

Code: Select all

{answer = (audio.languages!=null && audio.languages.size() >0 ) ? 'Found' : 'Not found'}

Code: Select all

{answer = (text.languages!=null && text.languages.size() >0 ) ? 'Found' : 'Not found'}
Please save me from this syntax Hell.

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 04 Dec 2021, 13:42
by rednoah
e.g.

Code: Select all

{ 
	def x = any{ audio.language.size() > 0 }{ false }
}
:idea: Please read Learn how {expressions} work and useful Helper Functions for details.

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 10:13
by HellPhantom
Ok, so I managed to convert your answer into the following.
I have removed a lot of unnecessary code to try and only solve the bit that I cannot fix.
Because of those xattr I am struggling to add this bit where I have to determine all the variable lengths items in my filename.
I have read and tried so much code but I can't bring this together.

This works just fine.

Code: Select all

{t.colon(' - ')
	.take(259-160-(primaryTitle.length()*2)
	)
}
when I un-comment any of the 2 following variants it does not work, it appears the result from the if is a string and not a number.

Code: Select all

{t.colon(' - ')
	.take(259-160-(primaryTitle.length()*2)

	//1.  Determine Audio languages indicator length
//		-({if (any{audio.language.size() > 0} {false})
//			{(audio.language.size() == 1 ? 6 : 
//			{(audio.language.size() == 2 ? 18 : 
//			{(audio.language.size() >10 ? 24 : 25)})})}
//			else {0}})

	//2. Determine Audio languages indicator length
//		- ({def x= {if (any{audio.language.size() > 0} {false})
//			{(audio.language.size() == 1 ? 6 : 
//			{(audio.language.size() == 2 ? 18 : 
//			{(audio.language.size() >10 ? 24 : 25)})})}
//			else {0}}})
	)
}
Individually this gives me the correct answer although it appears to be a string

Code: Select all

		//Determine Audio languages indicator length
		-({if (any{audio.language.size() > 0} {false})
			{(audio.language.size() == 1 ? 6 : 
			{(audio.language.size() == 2 ? 18 : 
			{(audio.language.size() >10 ? 24 : 25)})})}
			else {0}})

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 11:29
by rednoah
I guess you mean to write some sort of nested set of conditions like this:

Code: Select all

{
	def x = any{ audio.language.size() }{ 0 }
	def m = x >= 10 ? 24 :
	        x ==  2 ? 18 :
	        x ==  1 ?  6 : 0

}
:!: This is notably not the way to find out the length of a String value.


Checking the length of a String value, and then doing different things depending on the situation, would look like this:

Code: Select all

{
	def x = any{ audioLanguages as String }{ '' }
	// e.g. "[eng, jpn]" => 10
	x.length() < 25 ? x : '[many languages]'
}

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 11:45
by HellPhantom
For the audio and subtitles I have a specific output and decided to not try to count the actual output but rather define certain lengths.
I would not even know how to count the length of the result of that expression and would probably have to duplicate that code to just count it.

My Possible outcomes and their lengths. I restrict them to only display 3 and cater for only 99 in my count + a similar set for subtitles
None or null = 0
.[eng] = 6
.[eng,afr].[Aud-2] = 18
.[eng, jpn, afr].[Aud-9] = 24
.[eng, jpn, afr].[Aud-10] = 25

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 11:55
by HellPhantom
The code for the language bit is long, and I am not covering everything in the length count.
I won't be able to count the length for this.
This xattr is making my life very difficult to get it to consistently work.
I don't know if there is maybe some 32bit dll or api on my windows 10 system interfering.
I am still trying to figure it out. when the path goes over 238+ the 21 chars for xattr it cannot write it period. not the system or folder method.

Code: Select all

{f.name.upper() =~/RIFFTRAX/?
	'.'+{def languages = [];
	any{audio.collect{ au -> languages << any{ au.'LanguageString3' }{'Unknown'}};
	'['+languages.unique().take(3).join(",")+',Rifftrax]'}	{'[None, Rifftrax]'}}:'.'+

	{def languages = [];
	any{audio.collect{ au -> languages << any{ au.'LanguageString3' }{'Unknown'}};
	'['+languages.unique().take(3).join(",")+']' }
	{'[None]'}}
	{'[None]'}}
	

	{text.language.size() > 0 ?
	'.'+{def subtitles = []; any{text.collect{ sub -> subtitles << any{ sub.'LanguageString3' }{'Unknown'} };
	'['+subtitles.unique().take(3).join(",")+']'}
	{'[None]'}}:{null}}

	{audio.language.size() > 1 || text.language.size() > 1 ?
	'.['+
	{audio.language.size() > 1 ? 'Aud-'+audio.language.size()+
	{text.language.size() > 1 ? ',Sub-'+text.language.size() : null}: 'Sub-'+text.language.size()}+
	']': null}

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 16:01
by kim

Code: Select all

{
	def languages = any{ audio.'LanguageString3' }{'Unknown'}
	'bla.bla.RIFFTRAX.bla.bla' =~/RIFFTRAX/
		? languages.unique().take(3) + 'Rifftrax'
		: '[None, Rifftrax]'
}

Re: Expression Help - I can't seem to test for null or not exist.

Posted: 05 Dec 2021, 19:46
by kim

Code: Select all

{ 	def languages = any{ audio['LanguageString3'].findAll().unique().take(3)*.upper() }{['Unknown']}
	def langSize = any{audio.language.findAll().unique().size()}{}
	def aud = '.[Aud-'+langSize+']'

	'.'+ ( 'bla.bla.RIFFTRAX.bla.bla' =~/RIFFTRAX/
	? any{langSize > 1 ? (languages + 'YES Rifftrax').toString() + aud : ''}{languages}
	: any{langSize > 1 ? (languages + 'NO Rifftrax').toString() + aud : ''}{languages})
}
{	def subtitles = any{ text.language.findAll().unique().take(3)*.upper() }{['Unknown']}
	def subSize = any{text.language.findAll().size()}{}
	'.'+ any{subSize > 1 ? subtitles.toString() + '.[Sub-'+subSize+']' : ''}{'[None]'}
}
sample:

Code: Select all

.[ENG, FRA, ITA, YES Rifftrax].[Aud-13].[EN, FR, IT].[Sub-9]