INTERACT FORUM
More => Old Versions => JRiver Media Center 29 for Windows => Topic started by: chrisG81 on October 19, 2022, 12:12:50 am
-
Hello,
i have a question regarding list manipulation expression.
For Genres and Subgenres I want to maintain only the Tag Genre in the file.
In JRiver I want to split the values in two new fields via expression depending on the value.
I thought ListFind() would be a good idea. For example:
Genre: Pop, Alt Pop, Alternative Rock, Hard Rock, Rock
Expression 1 for Genres: ListFind([Genre], Pop;Rock)
Expression 2 for Subgenres: ListFind([Genre], Alt Pop;Alternative Rock;Hard Rock)
This only works for 1 value, i think for the first. Any ideas how to achieve this?
Thank you for support.
-
You can use ListMix() to go through every element of the list.
Solution complexity depends little on how your data is set. e.g do you have genres like Pop/Rock or other genres like Jazz, Blues or whatever etc
If main genres doesn't overlap in the metadata and everything have Pop or Rock then one simple solution could be something like this:
SUB GENRES
ListRemove(ListMix(If(Compare(Find([L1],Rock),>,-1),[L1],),,[Genre]),Rock)
ListRemove(ListMix(If(Compare(Find([L1],Pop),>,-1),[L1],),,[Genre]),Pop)
GENRE
IfElse(
ListContains([Genre],Rock),
Rock,
ListContains([Genre],Pop),
Pop
)
Zelda test images
-
ListCombine is perfect for this:
Genre: ListCombine([genre], Pop;Rock,;,;,1)
SubGenre: ListCombine([genre], Alt Pop;Alternative Rock;Hard Rock,;,;,1)
Mode 2 of ListCombine seems to be broken. It would be ideal for the subgenres expression as a way to return everything except Pop;Rock:
SubGenre: ListCombine([genre], Pop;Rock,;,;,2) -> seems to be doing the same as mode 0, adding both lists instead of subtracting
@Matt, can you please take a look?
-
We just added the new ListCombine mode in 30.0.20:
NEW: Added another mode to ListCombine(...) expression function to allow outputting only values not common to both lists.
In mode 2, it outputs items not common to both lists.
Running:
ListCombine(a;a;b;c,c;d;e;a,;,;,2)
Outputs:
b;d;e
What do you think should work differently? Thanks.
-
Actually it seems I was still testing on v29, so that explains why mode 2 was behaving like mode 0 ::)
I think a mode 3 is also needed. A classic Venn diagram is useful here:
(https://images.nagwa.com/figures/explainers/403141497934/1.svg)
Mode 0 = A + B -> all elements, deduplicated
Mode 1 = A ∩ B -> purple area, common elements only
Mode 2 = (A + B) - (A ∩ B) -> green+blue, remove common purple elements
Mode 3 = A - B -> green area, remove B elements
This mode 3 would solve OP's problem:
Genre: ListCombine([genre],Pop;Rock,;,;,1) -> only Pop/Rock if present
SubGenre: ListCombine([genre],Pop;Rock,;,;,3) -> all except Pop and Rock
Possible bug: the function is not trimming the lists, so a space after/before the comma is actually giving different results:
ListCombine(a;a;b;c,c;d;e;a,;,;,2) = b;d;e
ListCombine(a;a;b;c,c;d;e;a ,;,;,2) = a;a;b;d;e;a
-
Thanks!
Next build:
Fixed: ListCombine mode 2 was not trimming spaces when it built the list.
NEW: Added a mode 3 to ListCombine that's A - B.
-
Wow! Just came back from work. Thank you for the comprehensive replies. I hope i have a little spare time this evening to check out some of the suggested solutions.
Looking forward to the next build!
-
Thanks!
Next build:
Fixed: ListCombine mode 2 was not trimming spaces when it built the list.
NEW: Added a mode 4 to ListCombine that's A - B.
Thank you! I assume you mean mode 3 :)
-
Thank you! I assume you mean mode 3 :)
What are you even talking about ;D
-
ListCombine is better and simpler than my take if genre and sub genre lists can be hard coded
But what about something generic which doesn't need any hard coded lists. One could think that sub genre always has the root word as a last word. so if there is only one word it would be root genre and other with two or more words are sub genres.
Following that logic something like this could also be used
Calculated Genre:
ListMix(If(Compare(Find([L1],/ ),=,-1),[L1],),,[Genre])
Calculated Sub Genre:
ListMix(If(Compare(Find([L1],/ ),=,-1),,[L1]),,[Genre])
-
"New Age" ;D
The list of ID3 genres contains a few more genres having a space:
https://www.esm.rochester.edu/ears/docs/lame/id3.html
PS: What is "109 - Porn Groove" :o
-
rm -fr genre="new age"
E: That id3 genre list though for me seems to also have some sub genres. There are also couple of actual genres which have two words. Anyway maybe easier to add those couple as exceptions in the expression than add all of them.
-
PS: What is "109 - Porn Groove" :o
Probably something deutch from the 70's ;D