Goal: Apply different tree structures to subsets of the music collection shared with TwonkyMedia Server 5.0.x.
Reason: I usually browse my music tree by AlbumArtist/Year/Album. For Best-of compilations, however, I never remember (and hardly care) when they were issued. Thirdly, for soundtracks the Artist is irrelevant, I only care for the Album(-title); furthermore I do not want the list cluttered with all the regular albums (not all soundtracks are compilations, btw.).
Thus I need a disjoint tree structure. As there is no filter mechanism (yet?), I found another way which allowed me to reach this goal.
Means: <include>-node
Approach:
- Put the music data for each subset into a different folder shared in Twonky.
- Create separate .view.xml files for each subset.
- In the <view>-node assign each file the same path
- In the <include>-node replace the * <tree path='*' /> with the number of the different shares, starting with 15
- In the <view>-node use a subview other than the ones in default.view.xml. This way there is no irritating overlap with default.view. Copy the stuff you need from default.view and assign it to your subview(s)
- In case you want to have albums in more than one subset (e.g. best-of compilations in your usual artists collections), use symbolic links or junctions on hour hard drive structure.
First file ist mostly copied from default.view.xml
Code: Select all
<view name='artists' path='mypersonal.view' subviews="advanced,ipod,simple,folder">
<include>
<tree path='15' />
</include>
<navtree sortcriteria='+upnp:originalTrackNumber'>
<container name='music' id='music' multiview='1' sortcriteria='+dc:title' upnp:originalTrackNumber='1' createClass='object.item.audioItem.musicTrack'>
<container name='alltracks' visibility="advanced,ipod,simple" id='music/all' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container'/>
<container name='artistindex' visibility="advanced" id='music/artistindex' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:artist[3]' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:artist' sortcriteria='+dc:title' class='object.container.person.musicArtist' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
</container>
</container>
<container name='artistalbum' visibility="simple" id='music/artistalbum' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' buildon='upnp:album' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
<container buildon='upnp:albumArtist[5]' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:albumArtist[1]' sortcriteria='+dc:title' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:albumArtist' sortcriteria='+upnp:originalTrackNumber' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' class='object.container.album.musicAlbum' createClass='object.item.audioItem.musicTrack'/>
</container>
</container>
</container>
</container>
<container name='Interpret/Jahr/Album' visibility="simple" id='music/albumartists' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' buildon='upnp:album' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
<container buildon='upnp:albumArtist[5]' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:albumArtist[1]' sortcriteria='+dc:title' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:albumArtist' sortcriteria='+dc:title' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container name='albums'buildon='upnp:album' sortcriteria='+upnp:originalTrackNumber' upnp:originalTrackNumber='1' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' class='object.container.album.musicAlbum' createClass='object.item.audioItem.musicTrack'/>
</container>
<container buildon='dc:date[1:4]' albumart='1' sortcriteria='+dc:date' upnp:originalTrackNumber='2' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' class='object.container.album.musicAlbum' createClass='object.item.audioItem.musicTrack'/>
</container>
</container>
</container>
</container>
</container>
<container name='genre' visibility="advanced,ipod" id='music/genre' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:genre' sortcriteria='+dc:title' class='object.container.genre.musicGenre' createClass='object.item.audioItem.musicTrack' />
</container>
<container name='genrealbum' visibility="advanced" sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:genre' sortcriteria='+dc:title' class='object.container.genre.musicGenre' createClass='object.item.audioItem.musicTrack' >
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
</container>
<container name='genreartist' visibility="advanced" id='music/genreartistalbum' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' >
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' >
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
<container buildon='upnp:artist' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
</container>
<container buildon='upnp:genre' sortcriteria='+dc:title' class='object.container.genre.musicGenre' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' >
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
<container buildon='upnp:artist' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
</container>
</container>
<container name='rating' visibility="advanced" id='music/rating' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='pv:rating' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack' />
</container>
<container name='artist' visibility="ipod,advanced" id='music/artists' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' />
<container buildon='upnp:artist' sortcriteria='+dc:title' class='object.container.person.musicArtist' createClass='object.item.audioItem.musicTrack' />
</container>
<container name='album' visibility="ipod,advanced" id='music/albums' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' >
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
<container name='composer' visibility="ipod,advanced" id='music/composers' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container' >
<container buildon='upnp:author' sortcriteria='+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
</container>
<container name='folder' visibility="simple,advanced,folder" id='music/folders' class='object.container.storageFolder' createClass='object.item.audioItem.musicTrack'>
<container buildon='res' sortcriteria='+upnp:originalTrackNumber,+dc:title' createClass='object.item.audioItem.musicTrack' class='object.container.storageFolder' />
</container>
<container name='playlists' visibility="advanced,ipod,simple" id='music/playlists' class='object.container' createClass='object.item.audioItem.musicTrack,object.item.audioItem.online.musicTrack' sortcriteria='+upnp:originalTrackNumber,+dc:title' restricted='0' flags='pv:playlistRoot=Music' >
<container name='playlistrecentlyadded' filteron='pv:addedLast60' sortcriteria='-pv:addedTime' createClass='object.item.audioItem.musicTrack' maxitems='500' upnp:originalTrackNumber='3' restricted='1' class='object.container.playlistContainer' flags='pv:smartplaylist=1' />
<container name='playlistmostplayed' filteron='pv:playcount' sortcriteria='-pv:playcount' createClass='object.item.audioItem.musicTrack' maxitems='500' upnp:originalTrackNumber='1' restricted='1' class='object.container.playlistContainer' flags='pv:smartplaylist=1' />
<container name='playlistlastplayed' filteron='pv:lastPlayedTime' sortcriteria='-pv:lastPlayedTime' createClass='object.item.audioItem.musicTrack' maxitems='500' upnp:originalTrackNumber='2' restricted='1' class='object.container.playlistContainer' flags='pv:smartplaylist=1' />
<container name='playlisthighlyrated' filteron='pv:highrated' sortcriteria='-pv:rating' createClass='object.item.audioItem.musicTrack' maxitems='500' upnp:originalTrackNumber='4' class='object.container.playlistContainer' restricted='1' flags='pv:smartplaylist=1' />
<container buildon='upnp:playlist' sortcriteria='+upnp:originalTrackNumber' upnp:originalTrackNumber='5' createClass='object.item.audioItem.musicTrack,object.item.audioItem.online.musicTrack' class='object.container.playlistContainer' />
</container>
</container>
</navtree>
</view>
Code: Select all
<view name='best' path='mypersonal.view' subviews="advanced,ipod,simple,folder">
<include>
<tree path='16' />
</include>
<navtree sortcriteria='+upnp:originalTrackNumber'>
<container name='music' id='music' multiview='1' sortcriteria='+dc:title' upnp:originalTrackNumber='1' createClass='object.item.audioItem.musicTrack'>
<container name='Best Compilations' visibility="advanced, simple" id='music/bestcompilations' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' buildon='upnp:album' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
<container buildon='upnp:albumArtist[5]' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:albumArtist' sortcriteria='+dc:date' class='object.container.person.albumartist' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' class='object.container' createClass='object.item.audioItem.musicTrack' />
</container>
</container>
</container>
</container>
</navtree>
</view>
Code: Select all
<view name='soundtracks' path='mypersonal.view' subviews="advanced,ipod,simple,folder">
<include>
<tree path='17' />
</include>
<navtree sortcriteria='+upnp:originalTrackNumber'>
<container name='music' id='music' multiview='1' sortcriteria='+dc:title' upnp:originalTrackNumber='1' createClass='object.item.audioItem.musicTrack'>
<container name='Soundtracks' visibility="advanced, simple" id='music/soundtracks' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container name='allname' buildon='upnp:album' sortcriteria='+upnp:originalTrackNumber' createClass='object.item.audioItem.musicTrack' class='object.container.album.musicAlbum' />
<container buildon='upnp:album[5]' sortcriteria='+dc:title' class='object.container' createClass='object.item.audioItem.musicTrack'>
<container buildon='upnp:album' albumart='1' sortcriteria='+upnp:originalTrackNumber' class='object.container' createClass='object.item.audioItem.musicTrack'/>
</container>
</container>
</container>
</navtree>
</view>