Description:
Nodes are the elements of the navigation tree structure of the MediaMonkey interface. The Magic Nodes is a script which offers a simple and highly configurable way of creating new nodes to help you manage your music library. The Magic Nodes are defined using masks which are loosely based on the way MediaMonkey auto-organize works.
This thread is intended to help users to find some specific Magic Nodes (MN) masks for their needs. If you want to use masks included in this thread, it is recommended to download latest "unofficial" version of the script. In the following thread you could find this modified version, which enable their work with 3.x version of MediaMonkey, but it has also many bug-fixes and additions: http://www.mediamonkey.com/forum/viewtopic.php?t=19168. If you are a first-time user of the MN, before you start using this script it is also recommended to download and read the manual in the PDF format: http://west-penwith.org.uk/misc/MagicNodes.pdf (it covers only v1.6.x version of the script) or even better: http://west-penwith.org.uk/misc/MagicNodes17.pdf (v1.7.x draft).
This thread is not intended to replace the manual. If you find some of included masks useful for you, but you wish they should have another sub-nodes or its different positions, e.g. instead of ...\<Artist>\<Albums> you want ...\<Genre>\Albums>, please read mentioned PDF manual first and you will see how is easy to modify the existing mask. Also state if you want to implement some qualifier, for example Trim to display only first character of Albums or Artist. By default, included masks are considered for use with MediaMonkey v3.x (MM3), but there are also some masks which could work only within MediaMonkey v2.x (MM2) and those masks are properly indicated.
Here you could find some of the masks which I wrote by myself, but in many cases they are written by other users and just copied from posts in the Forum. I'll be glad if you want to contribute with your own masks, so please post them in this thread. I have also a plan to include same MN masks with the next major upgrade of the MN script, to help inexperienced users who would choose them directly inside of the dialog box in MM. Masks which contain the Filter and SQL Filter qualifiers are the most welcome because they are harder to define for beginners who don't have SQL experience. I'd like to concentrate here on the hardest ones which are not so easy to construct, even after reading the manual.
Masks:
Instead of the tutorial in the mentioned PDF manual which starts with the easiest masks and slowly introduce more and more complicated ones, I think that I should first present the most wanted mask which is probably the most complicated. Some of you who was reading MN forum already know my opinion about Incomplete Albums masks/scripts (http://www.mediamonkey.com/forum/viewto ... 855#121855), but anyway here you could find currently most accurate solution for this, which is extracted from Bex's Tagging Inconsistencies. I highly recommend his script, even for incomplete albums (Missing Tracks), because it is easier to configure. For example, with it you could specify minimal song length for albums which have just one or two tracks (do you remember Tubular Bells?). If you need to do same settings with this MN mask, you need to change it, which is not so easy for beginners (here is a hint - go and find SongLength >= 2400000, the previous number is in milliseconds which is 40 minute):
Code: Select all
Incomplete Albums (Bex's algorithm)|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM (SELECT Songs.IDAlbum IDAlbum FROM Songs, (SELECT IDAlbum, SUM(Non3Digits) AS CountNon3Digits, SUM(Cnt) AS Cont FROM (SELECT IDAlbum, COUNT(CASE WHEN Length(TrackNumber) = 3 THEN NULL ELSE 1 END) as Non3Digits, COUNT(*) AS Cnt, COUNT(CASE WHEN TrackNumber = '' THEN NULL ELSE 1 END) AS NonBlanks, MAX(Cast(TrackNumber as INTEGER)) AS MaxNr, COUNT(CASE WHEN SongLength >= 2400000 THEN 1 ELSE NULL END) AS SngLngth FROM Songs WHERE IDAlbum > 0 GROUP BY IDAlbum, TrackNumber) AS Inline1 GROUP BY IDAlbum HAVING COUNT(*) = SUM(Cnt) AND SUM(Cnt) = SUM(NonBlanks) AND MAX(MaxNr) > SUM(Cnt) AND (SUM(SngLngth) > 0 OR SUM(Cnt) >= 2)) Inline2 WHERE Songs.IDAlbum = Inline2.IDAlbum AND Songs.IDAlbum > 0 GROUP BY Songs.IDAlbum, CASE WHEN CountNon3Digits = 0 THEN Substr(TrackNumber, 1, 1) ELSE '0' END HAVING Cast(Substr(MIN(TrackNumber), -2, 2) as INTEGER) || (MAX(Cast(TrackNumber as INTEGER)) - MIN(Cast(TrackNumber as INTEGER)) + 1 - COUNT(*)) <> '10' AND MAX(cast(TrackNumber as INTEGER)) >= COUNT(*)) GROUP BY IDAlbum)\<Album|Statistic:Count(Tracks), Max(Track Number)>
Code: Select all
Incomplete Albums|SQL filter: Songs.IDAlbum IN (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Count(TrackNumber) <> Max(CAST(TrackNumber AS integer)) AND Count(TrackNumber) > 1)\<Album|Statistic:Count(Tracks), Max(Track Number)>
Code: Select all
Complete Albums|SQL filter: Songs.IDAlbum IN (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Count(TrackNumber) = Max(Cast(TrackNumber As integer)) AND Count(TrackNumber) > 3)\<Album Artist>\<Album|Statistic:Count(All)>
Code: Select all
Complete Albums with 1 star|SQL filter: Songs.IDAlbum IN (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Count(*) >= Max(Cast(Songs.TrackNumber As Integer)) AND Count(*) > 3 AND Min(Cast(Songs.Rating / 20.0 + 0.5 As Integer)) = 1 AND Max(Cast(Songs.Rating / 20.0 + 0.5 As Integer)) = 1)\<Album>
Code: Select all
Compilations|Filter:<Album Artist> = 'Various Artists'\<Genre>\<Album|Statistic:Max(Year)>
Code: Select all
Compilations|SQL Filter: Songs.IDAlbum IN (SELECT DISTINCT Albums.ID FROM Albums INNER JOIN Songs ON Albums.ID = Songs.IDAlbum WHERE Albums.IDArtist <> Songs.IDArtist AND Songs.IDAlbum > 0)\<Genre>\<Album|Statistic:Max(Year)>
Code: Select all
Compilations|SQL Filter: Songs.IDAlbum IN (SELECT DISTINCT Songs.IDAlbum FROM Songs WHERE Songs.Artist <> Songs.AlbumArtist AND Songs.IDAlbum > 0)\<Genre>\<Album|Statistic:Max(Year)>
Code: Select all
Compilations|SQL Filter: Songs.IDAlbum IN (SELECT IDAlbum FROM Songs WHERE IDAlbum > 0 GROUP BY IDAlbum HAVING Count(DISTINCT Artist) > 1)\<Genre>\<Album|Statistic:Max(Year)>
Code: Select all
<Group|Name:Problematic tracks|Show tracks:No|Child of:FilesToEdit|Position:Last child>\Tracks without lyrics|Filter:<Lyrics> = ''\<Title>
Code: Select all
<Group|Name:Problematic tracks|Show tracks:No|Child of:FilesToEdit|Position:Last child>\Tracks without comment|Filter:<Comment> = ''\<Title>
Now, if I have entered the Involved People field like this: vocal:Bono;guitar:The Edge;bass:Adam Clayton;drums:Larry Mullen, Jr. I could use the following mask and get displayed nodes with guitarists:
Code: Select all
Guitarists\<Involved people|Exclusive Right of:guitar:|Right until:;>
Code: Select all
By Kind\<Custom 1|Unknown:No|Exclusive right of:kind.|Right until: >\<Artist>\<Album>
Code: Select all
Specific style (Prog-Rock)|Filter:<Custom 1> Like '%Prog-Rock%'\<Album Artist>\<Album>
Code: Select all
Best of 70s|Filter:<Rating> >= 80 AND <Year> Between 1970 And 1979\<Artist>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with average track rating >= 4 stars|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Avg(Rating) >= 80)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with average track ratings >= 3 and less than 4|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Avg(Rating) Between 60 AND 79)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with average track ratings >= 2 and less than 3|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Avg(Rating) Between 40 AND 59)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with average track ratings >= 1 and less than 2|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Avg(Rating) Between 20 AND 39)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with average track ratings less than 1|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Avg(Rating) Between 0 AND 19)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with all tracks rated|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Min(Rating) >= 0)\<Album|Statistic:Count(All), Avg(Rating)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with some tracks rated|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Min(Rating) < 0 AND Max(Rating) >= 0)\<Album|Statistic:Count(All)>
Code: Select all
<Group|Name:Album Ratings|Show tracks:No>\Albums with no tracks rated|Filter:Songs.IDAlbum In (SELECT IDAlbum FROM Songs GROUP BY IDAlbum HAVING Max(Rating) < 0)\<Album|Statistic:Count(All)>
If you want to display artists who have more than one album (http://www.mediamonkey.com/forum/viewto ... 808#116808):
Code: Select all
Artists with more then one album|SQL filter:Songs.Artist IN (SELECT Songs.Artist FROM Songs, ArtistsSongs, Artists WHERE Songs.ID = ArtistsSongs.IDSong AND ArtistsSongs.IDArtist = Artists.ID AND Songs.IDAlbum > 0 AND (ArtistsSongs.PersonType = 1 OR ArtistsSongs.PersonType IS NULL) GROUP BY Artists.ID HAVING Count(DISTINCT Songs.IDAlbum)> 1)\<Artist>\<Album>
Code: Select all
Artists with more then one album|SQL filter:Songs.IDArtist IN (SELECT CountArtist FROM (SELECT DISTINCT IDArtist AS CountArtist, IDAlbum FROM Songs WHERE IDAlbum > 0) GROUP BY CountArtist HAVING Count(CountArtist) > 1)\<Artist>\<Album>
Code: Select all
Tracks with same Name from same Artists|SQL Filter: Songs.SongTitle || '@#$' || Songs.Artist IN (SELECT SongTitle || '@#$' || Artist FROM Songs WHERE Length(SongTitle) > 0 GROUP BY SongTitle, Artist HAVING Count(*) > 1 AND Count(DISTINCT Artist) = 1)\<Title|Trim:1>\<Title>\<Artist>
Code: Select all
Tracks with same Name from same Artists with different ratings|SQL Filter: Songs.SongTitle || '@#$' || Songs.Artist IN (SELECT SongTitle || '@#$' || Artist FROM Songs WHERE Length(SongTitle) > 0 GROUP BY SongTitle, Artist HAVING Count(*) > 1 AND Count(DISTINCT Artist) = 1 AND Min(Rating) <> Max(Rating))\<Title|Trim:1>\<Title>\<Artist>
Code: Select all
Tracks with Same Name from different Artists|SQL Filter: Songs.SongTitle IN (SELECT DISTINCT Songs.SongTitle FROM Songs INNER JOIN Songs As Inline ON Songs.SongTitle = Inline.SongTitle AND Songs.ID <> Inline.ID AND Songs.IDArtist <> Inline.IDArtist)\<Title|Trim:1>\<Title>
Code: Select all
Tracks with same Name from different Artists|SQL Filter: Songs.SongTitle IN (SELECT SongTitle FROM Songs WHERE Length(SongTitle) > 0 GROUP BY SongTitle HAVING Count(DISTINCT Artist) > 1)\<Title|Trim:1>\<Title>\<Artist>
Here we have Bex's mask for artists who have tracks with different genres which works only in MM2 (http://www.mediamonkey.com/forum/viewto ... 2778#22778):
Code: Select all
Multiple Genres|SQL Filter:Songs.IDArtist IN (SELECT Inline.IDArtist FROM (SELECT Songs.IDArtist, Songs.Genre FROM Songs INNER JOIN Genres ON Songs.Genre = Genres.IDGenre GROUP BY Songs.IDArtist, Songs.Genre) As Inline GROUP BY Inline.IDArtist HAVING Count(Inline.IDArtist) > 1)\<Artist>\<Genre>
Code: Select all
Artists with different Genres|SQL Filter:Songs.Artist IN (SELECT Songs.Artist FROM Songs, ArtistsSongs, Artists, GenresSongs, Genres WHERE Songs.ID = ArtistsSongs.IDSong AND ArtistsSongs.IDArtist = Artists.ID AND Songs.IDAlbum > 0 AND (ArtistsSongs.PersonType = 1 OR ArtistsSongs.PersonType IS NULL) AND Songs.ID = GenresSongs.IDSong AND GenresSongs.IDGenre = Genres.IDGenre GROUP BY Artists.ID HAVING Count(DISTINCT Genres.IDGenre) > 1)\<Artist>\<Genre>
Code: Select all
Multiple Bitrates|SQL Filter:Songs.IDAlbum IN (SELECT Inline1.IDAlbum FROM (SELECT IDAlbum, Bitrate FROM Songs WHERE Songs.VBR = 0 GROUP BY IDAlbum, Bitrate HAVING IDAlbum > 0) Inline1 GROUP BY Inline1.IDAlbum HAVING Count(Inline1.IDAlbum) > 1)\<Album>\<Bitrate>
Code: Select all
Multiple Years in Album|SQL Filter:Songs.IDAlbum IN (SELECT Inline1.IDAlbum FROM (SELECT IDAlbum, Year FROM Songs GROUP BY IDAlbum, Year HAVING IDAlbum > 0) Inline1 GROUP BY Inline1.IDAlbum HAVING Count(Inline1.IDAlbum) > 1)\<Album>
Code: Select all
Multiple Genres in Album|SQL Filter:Songs.IDAlbum IN (SELECT Inline1.IDAlbum FROM (SELECT IDAlbum, Genre FROM Songs GROUP BY IDAlbum, Genre HAVING IDAlbum>0) Inline1 GROUP BY Inline1.IDAlbum HAVING Count(Inline1.IDAlbum)>1)\<Album>
Code: Select all
Multiple FileTypes|SQL Filter:Songs.IDAlbum IN (SELECT Inline1.IDAlbum FROM (SELECT IDAlbum, Right(SongPath, 3) FROM Songs GROUP BY IDAlbum, Right(SongPath, 3) HAVING IDAlbum > 0) Inline1 GROUP BY Inline1.IDAlbum HAVING Count(*) > 1)\<Album>\<Format>
Code: Select all
<Group|Name:Albums with multiple...|Show tracks:No>\Bitrates|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM Songs WHERE IDAlbum > 0 AND Songs.VBR = 0 GROUP BY IDAlbum HAVING Count(DISTINCT Round(Bitrate / 1000)) > 1)\<Album>\<Bitrate|Statistic:Count(All)>
Code: Select all
<Group|Name:Albums with multiple...|Show tracks:No>\Years|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM Songs WHERE IDAlbum > 0 AND CAST(substr(Songs.Year, 1, 4) AS integer) > 1900 GROUP BY IDAlbum HAVING Count(DISTINCT CAST(substr(Songs.Year, 1, 4) AS integer)) > 1)\<Album>\<Year|Statistic:Count(All)>
Code: Select all
<Group|Name:Albums with multiple...|Show tracks:No>\different Genres|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM Songs, GenresSongs, Genres WHERE IDAlbum > 0 AND Songs.ID = GenresSongs.IDSong AND GenresSongs.IDGenre = Genres.IDGenre GROUP BY IDAlbum HAVING Count(DISTINCT Genres.IDGenre) > 1)\<Album>\<Genre|Statistic:Count(All)>
Code: Select all
<Group|Name:Albums with multiple...|Show tracks:No>\multi-item Genres|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM Songs WHERE IDAlbum > 0 GROUP BY IDAlbum HAVING Count(DISTINCT Genre) > 1)\<Album>\<Genre|Statistic:Count(All)>
Code: Select all
<Group|Name:Albums with multiple...|Show tracks:No>\FileTypes|SQL Filter:Songs.IDAlbum IN (SELECT IDAlbum FROM Songs WHERE IDAlbum > 0 GROUP BY IDAlbum HAVING Count(DISTINCT Upper(CASE WHEN substr(Songpath, -3, 1) = '.' THEN substr(Songpath, -2, 2) WHEN substr(Songpath, -4, 1) = '.' THEN substr(Songpath, -3, 3) WHEN substr(Songpath, -5, 1) = '.' THEN substr(Songpath, -4, 4) WHEN substr(Songpath, -6, 1) = '.' THEN substr(Songpath, -5, 5) ELSE substr(Songpath, -6, 6) END)) > 1)\<Album>\<Format|Statistic:Count(All)>
Code: Select all
Songs In Playlist|SQL filter: Exists (SELECT * FROM PlaylistSongs WHERE IDSong = Songs.ID)\<Artist>
Code: Select all
Songs Not In Any Playlist|SQL filter: Not Exists (SELECT * FROM PlaylistSongs WHERE IDSong = Songs.ID)\<Artist>
Code: Select all
Albums with Same Name|SQL Filter: Songs.IDAlbum IN (SELECT DISTINCT Albums.ID FROM Albums INNER JOIN Albums As Inline ON Albums.Album = Inline.Album AND Albums.ID <> Inline.ID)\<Album with Album Artist>
Code: Select all
Only tracks with similar Comment|SQL filter:Songs.ID IN (SELECT Memos.IDSong FROM Memos, (SELECT Left(Memos.MemoText, 4) AS Comment FROM Memos WHERE Memos.MemoType = 20001 GROUP BY Left(Memos.MemoText, 4) HAVING Count(*) > 1) As Inline WHERE Left(Memos.MemoText, 4) = Inline.Comment)\<Comment|Trim:4>
Code: Select all
Only tracks with similar Comment|SQL filter:substr(Songs.Comment, 1, 4) IN (SELECT substr(Comment, 1, 4) FROM Songs GROUP BY substr(Comment, 1, 4) HAVING Count(*) > 1)\<Comment|Trim:4>
Code: Select all
<Group|Name:Playing statistics>\Played Today|Filter:<Days since last played> = 0\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played This Week|Filter:<Weeks since last played> = 0\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played This Month|Filter:<Months since last played> = 0\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played This Year|Filter:<Years since last played> = 0\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played Yesterday|Filter:<Days since last played> = 1\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played Previous Week|Filter:<Weeks since last played> = 1\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played Previous Month|Filter:<Months since last played> = 1\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Playing statistics>\Played Previous Year|Filter:<Years since last played> = 1\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
<Group|Name:Added statistics>\Added Previous Week|Filter:<Weeks since added> = 1\<Album|Statistic:Count(All), Sum(File Size), Sum(Length)>
Code: Select all
Genre, Artist and Album (with number of items)\<Genre|Statistic:Count(Items)>\<Artist|Statistic:Count(Items)>\<Album|Statistic:Count(All)>
Code: Select all
Albums (sorted by Custom 1 and Year)\<Album|Sort by:Max(Custom 1), Max(Year)|Show Sort Key:2>
Code: Select all
Tracks which have track leveling but no album leveling applied|Filter:Songs.NormalizeTrack > -999999.0 AND Songs.NormalizeAlbum = -999999.0\<Album>
Code: Select all
Artists with more than 30 characters in the name (including spaces)|SQL Filter:Length(Songs.Artist) > 30\<Artist>
Code: Select all
Artists with more than 5 words in the name|SQL Filter:Length(Songs.Artist) - Length(Replace(Songs.Artist, ' ','')) > 5\<Artist>
Code: Select all
One Hit Wonders\<Artist|Max tracks:5>