Page 1 of 3

Next Artist or Album

Posted: Mon May 29, 2006 2:59 am
by NickDiamond
Hi,
I can't find the function to switch to the next (or previous) artist (or Album) !

I'd like to have a short-cut for this function, so I could use this function with my remote control !

Hope someone can help me !

Nick

Posted: Mon May 29, 2006 4:16 am
by Steegy
You mean you just want to go to the next/previous node in the library tree?

Posted: Mon May 29, 2006 7:44 am
by NickDiamond
Yes,
but I think it is not that easy (Or I have just not seen the right button !?!?! )...

Is it possible to go to next node ? How ?


Nick

Sorry, hope you can understand my english...

Posted: Mon May 29, 2006 9:51 am
by Steegy
If you want to go next/previous only on the current node level (only sibling nodes), then use these methods:

Code: Select all

Sub GoToNextSiblingNode

    On Error Resume Next
    SDB.MainTree.CurrentNode = SDB.MainTree.NextSiblingNode(SDB.MainTree.CurrentNode)

End Sub

Sub GoToPreviousSiblingNode

    On Error Resume Next
    SDB.MainTree.CurrentNode = SDB.MainTree.PreviousSiblingNode(SDB.MainTree.CurrentNode)

End Sub
If you want to go to the next/previous node regardless of it's hierarchy, then use these methods:

Code: Select all

Sub GoToNextNode

    On Error Resume Next
    SDB.MainTree.CurrentNode = SDB.MainTree.NextNode(SDB.MainTree.CurrentNode)

End Sub

Sub GoToPreviousNode

    On Error Resume Next
    SDB.MainTree.CurrentNode = SDB.MainTree.PreviousNode(SDB.MainTree.CurrentNode)

End Sub
I don't have time to help you linking these methods to your remote, but I'm sure there are others here that can help you more.
(Peke seems to know a lot about remotes).


Cheers
Steegy

Posted: Tue May 30, 2006 7:03 am
by NickDiamond
THX for trying to help me,
but I think this is not exactly what I want.

It seems that mediamonkey does not support this function.

I just want to have the possibility to go to "next artist", the same way I can go to "next track" ,
with one button or hotkey...

Posted: Tue May 30, 2006 7:47 am
by rovingcowboy
you need a script to move the songs by artists instead of track names.

8)

Posted: Tue May 30, 2006 9:40 am
by Steegy
So you want that a push on the button of your remote: starts playing the next album/artist (the next in alphabet).
Do you want to switch the tracks view to that (newly chosen) artist/album, or do you want it to stay as it was?


I don't have time to make this right now. (If nobody has done this in a month or so, please remind us/me, maybe I'll have time then)

@Other scripters:

How it would work:
- Get current playing Artist/Album name.
- Query database for the songs (alphabetically ordered) that have an Artist/Album name that is next (limit results to 1).
- Send all songs from that Artist/Album to the player as nowplaying list and start playing.
- Optionally: Browse to the correct Artist/Album node (using my BrowseToNode script).

If the correct Artist/Album tracks view has to be shown, there's a second way to do this:
- Get current playing Artist/Album name.
- Browse to the correct Artist/Album node (using my BrowseToNode script).
- Send all songs in the track view to the player as nowplaying list and start playing.
(so definately easier, but requires to open the Artist/Album node)

At least, these are the 2 things I would use. The choice depends on the fact if the Artist/Album node has to be opened. With the first method, this can be made optional.

Cheers
Steegy

Posted: Tue Jun 06, 2006 2:31 am
by Guest
Steegy wrote:So you want that a push on the button of your remote: starts playing the next album/artist (the next in alphabet).
That's it !
Steegy wrote: Do you want to switch the tracks view to that (newly chosen) artist/album, or do you want it to stay as it was?
I want it to stay as it it, so that I can "skip to next track" AND "skip to next Album/Artist" !!

So, together with mediamonkey would make my computer a great audiostation, used with a remote control !!!

Sorry, I don't know much about programming or things like this, so I'm not able to help anyway...

thx, Nick

Posted: Tue Jun 06, 2006 7:33 am
by Steegy
I'll have a look at it this evening.

Cheers
Steegy

Posted: Tue Jun 06, 2006 12:12 pm
by Steegy
Here's the script you can use:

Code: Select all

'========================================================================== 
' 
' MediaMonkey Script 
' 
' NAME: Previous&Next Album(Artist) v0.5.2
' DESCRIPTION: 
'  Exposes methods "PlayNextAlbum", "PlayPreviousAlbum", "PlayNextAlbumArtist",
'    "PlayPreviousAlbumArtist", "PlayNextAlbumSameArtist", "PlayPreviousAlbumSameArtist"
'   These methods can e.g. be called from use with a remote control.
' 
' AUTHOR: Steegy aka RC (Ruben Castelein)
' DATE  : 06/06/2006
' UPDATE: 14/06/2006
' 
'========================================================================== 


Const AlwaysClearPlaylistAndStop = False   ' Setting this to true will always clear the now playing list and stop playback, even if no matching album has been found
Const ShowNode = True                      ' Setting this to True will let the chosen album's node automaticly be selected


Dim SDB : Set SDB = CreateObject("SongsDB.SDBApplication")


'*****************************************************
'****            COMMAND LINE PARAMETERS          ****
'*****************************************************

If Not IsEmpty(WScript) Then
    If WScript.Arguments.Named.Exists("PlayNextAlbum") Then
        Call PlayNextAlbum
    ElseIf WScript.Arguments.Named.Exists("PlayPreviousAlbum") Then
        Call PlayPreviousAlbum
    ElseIf WScript.Arguments.Named.Exists("PlayNextAlbumArtist") Then
        Call PlayNextAlbumArtist
    ElseIf WScript.Arguments.Named.Exists("PlayPreviousAlbumArtist") Then
        Call PlayPreviousAlbumArtist
    ElseIf WScript.Arguments.Named.Exists("PlayNextAlbumSameArtist") Then
        Call PlayNextAlbumSameArtist
    ElseIf WScript.Arguments.Named.Exists("PlayPreviousAlbumSameArtist") Then
        Call PlayPreviousAlbumSameArtist
    End If
End If


'*****************************************************
'****                 MAIN METHODS                ****
'*****************************************************

Sub PlayNextAlbum

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    ' Fill the now playing list with an album with the same name, but the next album artist in alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE (Albums.Album='" & DoubleUpSingleQuotes(CurrentAlbumName) & "' " _
            &         "AND StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=1) " _
            &     "ORDER BY Artists.Artist" _
            & ") ORDER BY Songs.SongOrder", True)
    
    ' If the now playing list has been filled (so there is such an album as searched for above) then exit the subroutine 
    If SDB.Player.PlaylistCount <> 0 Then Exit Sub

    ' If no such album was found, then get the next album with the next name in the alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Albums.Album, '" & DoubleUpSingleQuotes(CurrentAlbumName) & "')=1 " _
            &     "ORDER BY Albums.Album, Artists.Artist" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


Sub PlayPreviousAlbum

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    ' Fill the now playing list with an album with the same name, but the previous album artist in alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE (Albums.Album='" & DoubleUpSingleQuotes(CurrentAlbumName) & "' " _
            &         "AND StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=-1) " _
            &     "ORDER BY Artists.Artist DESC" _
            & ") ORDER BY Songs.SongOrder", True)
            
    ' If the now playing list has been filled (so there is such an album as searched for above) then exit the subroutine 
    If SDB.Player.PlaylistCount <> 0 Then Exit Sub

    ' If no such album was found, then get the previous album with the next name in the alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Albums.Album, '" & DoubleUpSingleQuotes(CurrentAlbumName) & "')=-1 " _
            &     "ORDER BY Albums.Album DESC, Artists.Artist DESC" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


Sub PlayNextAlbumArtist

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    ' Fill the now playing list with the first album of the next album artist in alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=1 " _
            &     "ORDER BY Artists.Artist, Albums.Album" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


Sub PlayPreviousAlbumArtist

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    ' Fill the now playing list with the first album of the previous album artist in alphabet
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=-1 " _
            &     "ORDER BY Artists.Artist DESC, Albums.Album" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


Sub PlayNextAlbumSameArtist

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=0 " _
            &     "AND StrComp(Albums.Album, '" & DoubleUpSingleQuotes(CurrentAlbumName) & "')=1 " _
            &     "ORDER BY Albums.Album" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


Sub PlayPreviousAlbumSameArtist

    If SDB.Player.CurrentSong Is Nothing Then Exit Sub
    Dim CurrentAlbumName : CurrentAlbumName = SDB.Player.CurrentSong.AlbumName
    Dim CurrentAlbumArtistName : CurrentAlbumArtistName = SDB.Player.CurrentSong.AlbumArtistName
    
    Call PlayFromQuery("" _
            & "AND Songs.IDAlbum IN (" _
            &     "SELECT TOP 1 Albums.ID " _
            &     "FROM (Albums INNER JOIN Artists ON Albums.IDArtist = Artists.ID) " _
            &     "WHERE StrComp(Artists.Artist, '" & DoubleUpSingleQuotes(CurrentAlbumArtistName) & "')=0 " _
            &     "AND StrComp(Albums.Album, '" & DoubleUpSingleQuotes(CurrentAlbumName) & "')=-1 " _
            &     "ORDER BY Albums.Album DESC" _
            & ") ORDER BY Songs.SongOrder", False)

End Sub


'*****************************************************
'****                WORKER METHOD                ****
'*****************************************************

Sub PlayFromQuery(Query, QueryFollows)
    
    If AlwaysClearPlaylistAndStop Or QueryFollows Then Call SDB.Player.PlaylistClear
    
    Dim FirstItem : Set FirstItem = Nothing
    
    Dim SongIter : Set SongIter = SDB.Database.QuerySongs(Query)
    If Not SongIter.EOF Then
        Call SDB.Player.PlaylistClear
        Set FirstItem = SongIter.Item
    End If
    Do While Not SongIter.EOF
        Call SDB.Player.PlaylistAddTrack(SongIter.Item)
        Call SongIter.Next
    Loop

    If Not FirstItem Is Nothing Then
        Call SDB.Player.Next
        If Not SDB.Player.isPlaying Then
            Call SDB.Player.Play
        End If
    
        If ShowNode Then
            If Not SDB.Objects("PreviousNodeFromRemote") Is Nothing Then SDB.MainTree.ParentNode(SDB.Objects("PreviousNodeFromRemote")).Expanded = False
            Dim NodeRef : Set NodeRef = GetNode(SDB.MainTree.FirstChildNode(SDB.MainTree.Node_Artist), Array(FirstItem.AlbumArtistName, FirstItem.AlbumName))
            If Not NodeRef Is Nothing Then SDB.MainTree.CurrentNode = NodeRef
            Set SDB.Objects("PreviousNodeFromRemote") = NodeRef
        End If
    Else
        If AlwaysClearPlaylistAndStop And Not QueryFollows Then Call SDB.Player.Stop
    End If

End Sub


Function GetNode(StartNode, PathToNode) 

    Set GetNode = Nothing
    
    On Error Resume Next 
    
    Dim Node2B : Set Node2B = StartNode
    
    Dim i
    For i = 0 To UBound(PathToNode)
        If i > 0 Then
            Node2B.Expanded = True 
            Set Node2B = SDB.MainTree.FirstChildNode(Node2B) 
        End If
        
        If Node2B.Caption <> PathToNode(i) Then 
            Do 
                Set Node2B = SDB.MainTree.NextSiblingNode(Node2B) 
                If Err <> 0 Then Exit Function 
            Loop While Node2B.Caption <> PathToNode(i) 
        End If 
    Next 
    
    Set GetNode = Node2B

End Function


'*****************************************************
'****               UTILITY METHOD                ****
'*****************************************************

Function DoubleUpSingleQuotes(strInput)

    DoubleUpSingleQuotes = Replace(strInput, "'", "''")
    
End Function
These methods "PlayNextAlbum", "PlayPreviousAlbum", "PlayNextAlbumArtist", "PlayPreviousAlbumArtist", "PlayNextAlbumSameArtist", "PlayPreviousAlbumSameArtist" can be called by the program (e.g. "Girder") that you use for your remote control.

The methods can be externaly called with command line parameters, e.g.:
C:\Program Files\MediaMonkey\Scripts\Previous&Next Album(Artist).vbs /PlayNextAlbum



In Girder, you'll probably need to set the application to execute to:
C:\Windows\System32\Wscript.exe

The command line parameters (next thing to specify in Girder) have to be set to something like:
C:\Program Files\MediaMonkey\Scripts\Previous&Next Album(Artist).vbs /PlayNextAlbum


How to add (for Girder 3.2.9b):
- Menu Edit > Add new Command
- Tabpage "O.S." > dropdown list > "Execute" (or something similar).
- Fill in the text areas as said above (one box for the wscript program location, one line for the command line parameters), and preferable set startup visibility to "hidden" (or "invisible").
- Click the apply button and then right-click the command icon in the left pane, and choose "test command".

For a more complete walkthrough with screenshots, please look at page 2.


Cheers
Steegy

Posted: Wed Jun 07, 2006 3:30 pm
by NickDiamond
Hi, thank you !!!

Will try it out.
I`m using Girder, and I hope I can make it work with you your help !!

...

Posted: Wed Jun 07, 2006 5:55 pm
by Peke
NickDiamond
what version of girder do you use and what Remote Control?

Posted: Thu Jun 08, 2006 2:21 am
by NickDiamond
I'm using Girder 3.2.9 (the last free version)

And a remote control from Leadtek, Winfast
(the one that came together with my "TV-Card Winfast 2000 Xpert" !! )

Posted: Thu Jun 08, 2006 3:43 am
by Peke
@NickDiamond
THX, I'm using ATI Remote Wonder I and Girder 3.3.2.

Warning From Moderator 2 Peke: Stay On Topic :lol: :roll:

Posted: Thu Jun 08, 2006 3:59 am
by NickDiamond
No problem,
but I just started to use Girder, so I have no idea how to the script !

I have found the possibility to enter a script, but it said "precompiling failed" .

Can someone guide me?
What do I have to do where in Girder ?

I tried, but without any success...