Auto Album DJ 3.8 - Updated 08/08/2010

Download and get help for different MediaMonkey Addons.

Moderators: Peke, Gurus

Auto Album DJ 3.8 - Updated 08/08/2010

Postby trixmoto » Tue Jan 24, 2006 9:28 am

This script can be selected as the AutoDJ source and it will fill the Now Playing list as specified in your options. When switched on, whenever you play the last track in your now playing list (N.B. turn shuffle off!) a random album will appear (in track order) at the end of your list. This means you will never run out of albums to listen to.

As always, the installation package is available to download from my website. Here's the code too...

Code: Select all
'
' MediaMonkey Script
'
' NAME: AutoAlbumDJ 3.8
'
' AUTHOR: trixmoto (http://trixmoto.net)
' DATE : 08/08/2010
'
' Thanks to Abel for suggesting getting the ID range from the database
' Thanks to Randy for fixing the random number falling outside of range
' Thanks to Bex for the filter code which I've adapted
'
' INSTALL: Copy to Scripts directory
'
' FIXES: 
'

Option Explicit
Dim MinTracks,AvgRating,MinRating,Capacity,Attempts,TheGenre,ModeNum
Dim Mode3f1,MaxTracks,Unplayed,Earliest,Debug,MaxDays,AvgPlays,IgnoreNon
Dim Filters(),FilterName,FilterSQL,Toolbar,Trayicon,MinDays,ApplyFilter
Public styleOn

MinTracks = 5        ' minimum tracks per album
AvgRating = 3        ' minimum average rating (stars) per album
MinRating = -1       ' minimum rating (stars) per song
Capacity = 10        ' number of albums to remember
Attempts = 100       ' number of queries to attempt
TheGenre = ""        ' comma separated list, blank means any genre
Mode3f1 = False      ' 3-from-1 mode
MaxTracks = 999      ' maximum tracks per album
Unplayed = False     ' only select unplayed albums?
Earliest = ""        ' earliest date in format "YYYYMMDD"
Debug = False        ' create a debug log?
MaxDays = 9999       ' maximum number of days since added
AvgPlays = 999       ' maximum average playcount per album
IgnoreNon = False    ' ignore albums without a name
ModeNum = 3            ' 3-from-1 mode control
Toolbar = False      ' show toolbar button for selecting new album
FilterName = "- No Filter -"
FilterSQL = ""
MinDays = 0          ' minimum number of days since last played
Trayicon = False     ' show tray icon menu item for selecting new album
ApplyFilter = False  ' apply filter to tracks as well as album

Sub Install()
  'set default values
  Dim ini : Set ini = SDB.IniFile
  ini.StringValue("AutoAlbumDJ","Enabled") = "0" 'switch off old version
  If ini.StringValue("AutoAlbumDJ","MinTracks") = "" Then
    ini.IntValue("AutoAlbumDJ","MinTracks") = MinTracks
  End If
  If ini.StringValue("AutoAlbumDJ","AvgRating") = "" Then
    ini.IntValue("AutoAlbumDJ","AvgRating") = AvgRating
  End If
  If ini.StringValue("AutoAlbumDJ","MinRating") = "" Then
    ini.IntValue("AutoAlbumDJ","MinRating") = MinRating
  End If
  If ini.StringValue("AutoAlbumDJ","Capacity") = "" Then
    ini.IntValue("AutoAlbumDJ","Capacity") = Capacity
  End If
  If ini.StringValue("AutoAlbumDJ","Attempts") = "" Then
    ini.IntValue("AutoAlbumDJ","Attempts") = Attempts
  End If
  If ini.StringValue("AutoAlbumDJ","TheGenre") = "" Then
    ini.StringValue("AutoAlbumDJ","TheGenre") = TheGenre
  End If
  If ini.StringValue("AutoAlbumDJ","Mode3f1") = "" Then
    ini.BoolValue("AutoAlbumDJ","Mode3f1") = Mode3f1
  End If
  If ini.StringValue("AutoAlbumDJ","MaxTracks") = "" Then
    ini.IntValue("AutoAlbumDJ","MaxTracks") = MaxTracks
  End If
  If ini.StringValue("AutoAlbumDJ","Unplayed") = "" Then
    ini.BoolValue("AutoAlbumDJ","Unplayed") = Unplayed
  End If
  If ini.StringValue("AutoAlbumDJ","Earliest") = "" Then
    ini.StringValue("AutoAlbumDJ","Earliest") = Earliest
  End If 
  If ini.StringValue("AutoAlbumDJ","Debug") = "" Then
    ini.BoolValue("AutoAlbumDJ","Debug") = Debug
  End If 
  If ini.StringValue("AutoAlbumDJ","MaxDays") = "" Then
    ini.IntValue("AutoAlbumDJ","MaxDays") = MaxDays
  End If 
  If ini.StringValue("AutoAlbumDJ","AvgPlays") = "" Then
    ini.IntValue("AutoAlbumDJ","AvgPlays") = AvgPlays
  End If
  If ini.StringValue("AutoAlbumDJ","IgnoreNon") = "" Then
    ini.BoolValue("AutoAlbumDJ","IgnoreNon") = IgnoreNon
  End If
  If ini.StringValue("AutoAlbumDJ","ModeNum") = "" Then
    ini.IntValue("AutoAlbumDJ","ModeNum") = ModeNum
  End If 
  If ini.StringValue("AutoAlbumDJ","Toolbar") = "" Then
    ini.BoolValue("AutoAlbumDJ","Toolbar") = Toolbar
  End If     
  If ini.StringValue("AutoAlbumDJ","FilterName") = "" Then
    ini.StringValue("AutoAlbumDJ","FilterName") = FilterName
  End If 
  If ini.StringValue("AutoAlbumDJ","MinDays") = "" Then
    ini.IntValue("AutoAlbumDJ","MinDays") = MinDays
  End If   
  If ini.StringValue("AutoAlbumDJ","Trayicon") = "" Then
    ini.BoolValue("AutoAlbumDJ","Trayicon") = Trayicon
  End If
  If ini.StringValue("AutoAlbumDJ","ApplyFilter") = "" Then
    ini.BoolValue("AutoAlbumDJ","ApplyFilter") = ApplyFilter
  End If               

  'add ini entries
  Set ini = SDB.Tools.IniFileByPath(SDB.ApplicationPath&"Scripts\Scripts.ini")
  If Not (ini Is Nothing) Then
    ini.StringValue("AutoAlbumDJ","Filename") = "AutoAlbumDJ3.vbs"
    ini.StringValue("AutoAlbumDJ","DisplayName") = "Auto Album DJ"
    ini.StringValue("AutoAlbumDJ","Description") = "An AutoDJ which selects whole albums"
    ini.StringValue("AutoAlbumDJ","Language") = "VBScript"
    ini.StringValue("AutoAlbumDJ","ScriptType") = "4"
    ini.StringValue("AutoAlbumDJ2","Filename") = "AutoAlbumDJ3.vbs"
    ini.StringValue("AutoAlbumDJ2","Procname") = "DoSelectAlbum"
    ini.StringValue("AutoAlbumDJ2","DisplayName") = "Auto Album DJ - Play a new album"
    ini.StringValue("AutoAlbumDJ2","Description") = "Auto Album DJ - Play a new album"
    ini.StringValue("AutoAlbumDJ2","Language") = "VBScript"
    ini.StringValue("AutoAlbumDJ2","ScriptType") = "0"   
    SDB.RefreshScriptItems
  End If 

  'add toolbar button
  Dim but : Set but = SDB.Objects("AADJ-Button")
  If but Is Nothing Then
    Set but = SDB.UI.AddMenuItem(SDB.UI.Menu_TbStandard,0,0)
    but.Caption = "Play a new album"
    but.IconIndex = SDB.RegisterIcon("Scripts\AADJ.ico",0)
    but.UseScript = SDB.ApplicationPath&"Scripts\AutoAlbumDJ3.vbs"
    but.OnClickFunc = "SelectAlbum"
    but.Visible = SDB.IniFile.BoolValue("AutoAlbumDJ","Toolbar")
    Set SDB.Objects("AADJ-Button") = but
  End If
 
  'add tray icon menu item
  Dim itm : Set itm = SDB.Objects("AADJ-Tray")
  If itm Is Nothing Then
    Set itm = SDB.UI.AddMenuItem(SDB.UI.Menu_TrayIcon,2,0)
    itm.Caption = "Play a new album"
    itm.IconIndex = SDB.RegisterIcon("Scripts\AADJ.ico",0)
    itm.UseScript = SDB.ApplicationPath&"Scripts\AutoAlbumDJ3.vbs"
    itm.OnClickFunc = "SelectAlbum"
    itm.Visible = SDB.IniFile.BoolValue("AutoAlbumDJ","Trayicon")
    Set SDB.Objects("AADJ-Tray") = itm
  End If   
 
  'initialise objects
  Set SDB.Objects("AADJSongList") = Nothing
  Set SDB.Objects("AADJOptsForm") = Nothing
  Set SDB.Objects("AADJClearBtn") = Nothing
  Set SDB.Objects("AADJClearBtn2") = Nothing
  Set SDB.Objects("AADJModeCapt") = Nothing
End Sub

Sub InitConfigSheet(Sheet)
  Dim wsh : Set wsh = CreateObject("WScript.Shell") 
  Dim loc : loc = wsh.ExpandEnvironmentStrings("%TEMP%")&"\AutoAlbumDJ.log"
  Dim ui : Set ui = SDB.UI
  Dim ini : Set ini = SDB.IniFile
  Mode3f1 = ini.BoolValue("AutoAlbumDJ","Mode3f1") 
  ModeNum = ini.IntValue("AutoAlbumDJ","ModeNum")
  Debug = ini.BoolValue("AutoAlbumDJ","Debug")   
 
  Dim edt : Set edt = ui.NewCheckbox(Sheet)
  edt.Common.SetRect 0, 2, 400, 20 
  edt.Common.ControlName = "AADJDebug"
  edt.Caption = "Create logfile '"&loc&"'"
  edt.Checked = Debug
 
  Set edt = ui.NewCheckbox(Sheet)
  edt.Common.SetRect 0, 23, 400, 20 
  edt.Common.ControlName = "AADJMode3f1"
  edt.Caption = "Enable "&ModeNum&"-from-1 mode (adds "&ModeNum&" random tracks from selected album)"
  edt.Checked = Mode3f1
  Set SDB.Objects("AADJModeCapt") = edt

  Set edt = ui.NewButton(Sheet)
  edt.Common.SetRect 390, 20, 45, 21
  edt.Caption = "More"
  Call Script.RegisterEvent(edt,"OnClick","InitExtraSheet")
  Set SDB.Objects("AADJOptsForm") = Nothing
End Sub

Sub InitExtraSheet()
  Dim ini : Set ini = SDB.IniFile
  MinTracks = ini.IntValue("AutoAlbumDJ","MinTracks")
  AvgRating = ini.StringValue("AutoAlbumDJ","AvgRating")
  MinRating = ini.StringValue("AutoAlbumDJ","MinRating")
  Capacity = ini.IntValue("AutoAlbumDJ","Capacity")
  Attempts = ini.IntValue("AutoAlbumDJ","Attempts")
  TheGenre = ini.StringValue("AutoAlbumDJ","TheGenre")
  MaxTracks = ini.IntValue("AutoAlbumDJ","MaxTracks")
  Unplayed = ini.BoolValue("AutoAlbumDJ","Unplayed")
  Earliest = ini.StringValue("AutoAlbumDJ","Earliest")   
  MaxDays = ini.IntValue("AutoAlbumDJ","MaxDays")
  AvgPlays = ini.IntValue("AutoAlbumDJ","AvgPlays")
  IgnoreNon = ini.BoolValue("AutoAlbumDJ","IgnoreNon")
  ModeNum = ini.IntValue("AutoAlbumDJ","ModeNum")
  Toolbar = ini.BoolValue("AutoAlbumDJ","Toolbar")
  FilterName = ini.StringValue("AutoAlbumDJ","FilterName")
  MinDays = ini.IntValue("AutoAlbumDJ","MinDays")
  Trayicon = ini.BoolValue("AutoAlbumDJ","Trayicon")
  ApplyFilter = ini.BoolValue("AutoAlbumDJ","ApplyFilter")

  Dim ui : Set ui = SDB.UI
  Dim Form : Set Form = ui.NewForm
  Form.Common.SetRect 100, 100, 460, 375
  Form.BorderStyle  = 3   
  Form.FormPosition = 4   
  Form.Caption = "AutoAlbumDJ Settings"
   
  Dim edt : Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 10, 50, 20
  edt.Caption = "Min. tracks:"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 7, 50, 20
  edt.Common.ControlName = "AADJMinTracks"
  edt.MinValue = 0
  edt.MaxValue = 99
  edt.Value = MinTracks
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 185, 10, 50, 20
  edt.Caption = "Min. avg-rating:"
  edt.Autosize = False
 
  Set edt = ui.NewDropDown(Form)
  edt.Common.SetRect 285, 7, 100, 20
  edt.Common.ControlName = "AADJAvgRating"
  edt.AddItem("0")
  edt.AddItem("0.5")
  edt.AddItem("1")
  edt.AddItem("1.5")
  edt.AddItem("2")
  edt.AddItem("2.5")
  edt.AddItem("3")
  edt.AddItem("3.5")
  edt.AddItem("4")
  edt.AddItem("4.5")
  edt.AddItem("5")
  edt.AddItem("Unknown")
  If AvgRating = "-1" Then
    edt.ItemIndex = 11
  Else
    edt.ItemIndex = Int(AvgRating*2)
  End If 
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 35, 50, 20
  edt.Caption = "Max. tracks:"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 32, 50, 20
  edt.Common.ControlName = "AADJMaxTracks"
  edt.MinValue = 0
  edt.MaxValue = 999
  edt.Value = MaxTracks 

  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 185, 35, 50, 20
  edt.Caption = "Min. rating:"
  edt.Autosize = False
 
  Set edt = ui.NewDropDown(Form)
  edt.Common.SetRect 285, 32, 100, 20
  edt.Common.ControlName = "AADJMinRating"
  edt.AddItem("0")
  edt.AddItem("0.5")
  edt.AddItem("1")
  edt.AddItem("1.5")
  edt.AddItem("2")
  edt.AddItem("2.5")
  edt.AddItem("3")
  edt.AddItem("3.5")
  edt.AddItem("4")
  edt.AddItem("4.5")
  edt.AddItem("5")
  edt.AddItem("Unknown")
  If MinRating = "-1" Then
    edt.ItemIndex = 11
  Else
    edt.ItemIndex = Int(MinRating*2)
  End If
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 60, 50, 20
  edt.Caption = "Attempts:"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 57, 50, 20
  edt.Common.ControlName = "AADJAttempts"
  edt.MinValue = 0
  edt.MaxValue = 999
  edt.Value = Attempts
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 185, 60, 50, 20
  edt.Caption = "Max. avg-plays:"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 285, 57, 50, 20
  edt.Common.ControlName = "AADJAvgPlays"
  edt.MinValue = 0
  edt.MaxValue = 999
  edt.Value = AvgPlays 
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 85, 50, 20
  edt.Caption = "Earliest (days):"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 82, 50, 20
  edt.Common.ControlName = "AADJMaxDays"
  edt.MinValue = 0
  edt.MaxValue = 9999
  edt.Value = MaxDays
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 185, 85, 50, 20
  edt.Caption = "Earliest (date):"
  edt.Autosize = False
 
  Set edt = ui.NewEdit(Form)
  edt.Common.SetRect 285, 82, 100, 20
  edt.Common.ControlName = "AADJEarliest"
  edt.Common.Hint = "Date in format: YYYYMMDD"
  edt.Text = Earliest 
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 185, 110, 50, 20
  edt.Caption = "LastPlayed (days):"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 285, 107, 50, 20
  edt.Common.ControlName = "AADJMinDays"
  edt.MinValue = 0
  edt.MaxValue = 999
  edt.Value = MinDays
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 135, 50, 20
  edt.Caption = "Memory slots:"
  edt.Autosize = False 
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 132, 50, 20
  edt.Common.ControlName = "AADJCapacity"
  edt.MinValue = 0
  edt.MaxValue = 99
  edt.Value = Capacity   
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 160, 50, 20
  edt.Caption = "Memory:"
  edt.Autosize = False   
 
  Dim ddl : Set ddl = ui.NewDropDown(Form)
  ddl.Common.SetRect 85, 157, 300, 20
  ddl.Common.ControlName = "ddl"
  ddl.Style = 2
  Script.RegisterEvent ddl, "OnSelect", "DisplayCount"
 
  Dim btn : Set btn = ui.NewButton(Form)
  btn.Common.SetRect 390, 156, 50, 23
  btn.Caption = "Clear"
  Script.RegisterEvent btn, "OnClick", "ClearMemory" 
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 185, 50, 20
  edt.Caption = "Genre filter:"
  edt.Autosize = False
 
  Set edt = ui.NewEdit(Form)
  edt.Common.SetRect 85, 182, 300, 20
  edt.Common.ControlName = "AADJTheGenre"
  edt.Common.Hint = "Comma separated list, blank means any genre"
  edt.Text = TheGenre
 
  Set btn = ui.NewButton(Form)
  btn.Common.SetRect 390, 181, 50, 23
  btn.Caption = "List"
  Script.RegisterEvent btn, "OnClick", "ListGenres" 
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 210, 50, 20
  edt.Caption = "Library filter:"
  edt.Autosize = False 
 
  Set edt = ui.NewDropDown(Form)
  edt.Common.SetRect 85, 207, 200, 20
  edt.Style = 2
  edt.Common.ControlName = "AADJFilterName"
  Call CreateFiltersArray()
  Call FillDropDownFromArray(edt,Filters)
  edt.ItemIndex = GetFiltersArrayID(FilterName)
 
  Set edt = ui.NewCheckbox(Form)
  edt.Common.SetRect 5, 235, 400, 20
  edt.Common.ControlName = "AADJApplyFilter"
  edt.Caption = "Apply library filter to tracks within selected album?"
  edt.Checked = ApplyFilter
 
  Set edt = ui.NewCheckbox(Form)
  edt.Common.SetRect 5, 255, 400, 20
  edt.Common.ControlName = "AADJUnplayed"
  edt.Caption = "Only select albums which have not been played before?"
  edt.Checked = Unplayed 
 
  Set edt = ui.NewCheckbox(Form)
  edt.Common.SetRect 5, 275, 400, 20
  edt.Common.ControlName = "AADJIgnoreNon"
  edt.Caption = "Ignore albums without a name?"
  edt.Checked = IgnoreNon
 
  Set edt = ui.NewCheckbox(Form)
  edt.Common.SetRect 5, 295, 400, 20
  edt.Common.ControlName = "AADJToolbar"
  edt.Caption = "Show toolbar button for selecting new album?"
  edt.Checked = Toolbar
 
  Set edt = ui.NewCheckbox(Form)
  edt.Common.SetRect 5, 315, 400, 20
  edt.Common.ControlName = "AADJTrayicon"
  edt.Caption = "Show tray icon menu for selecting new album?"
  edt.Checked = Trayicon
 
  Set edt = ui.NewLabel(Form)
  edt.Common.SetRect 5, 110, 50, 20
  edt.Caption = "Mode ?-from-1:"
  edt.Autosize = False
 
  Set edt = ui.NewSpinEdit(Form)
  edt.Common.SetRect 85, 107, 50, 20
  edt.Common.ControlName = "AADJModeNum"
  edt.MinValue = 0
  edt.MaxValue = 999
  edt.Value = ModeNum 
 
  Set SDB.Objects("AADJClearBtn") = btn
  Call DisplayMemory(ddl)   
 
  Dim btn2 : Set btn2 = ui.NewButton(Form)
  btn2.Common.SetRect 320, 206, 120, 23
  btn2.Caption = "Clear current album"
  Script.RegisterEvent btn2, "OnClick", "ClearCurrent"   
  Set SDB.Objects("AADJClearBtn2") = btn2 
 
  Dim BtnCancel : Set BtnCancel = ui.NewButton(Form)
  BtnCancel.Caption = "&Cancel"
  BtnCancel.Common.Top = 305
  BtnCancel.Common.Left = Form.Common.Width - BtnCancel.Common.Width -25
  BtnCancel.Cancel = True
  BtnCancel.ModalResult = 2
 
  Dim BtnBackup : Set BtnBackup = ui.NewButton(Form)
  BtnBackup.Caption = "&Ok"
  BtnBackup.Common.Top = BtnCancel.Common.Top
  BtnBackup.Common.Left = BtnCancel.Common.Left - BtnBackup.Common.Width -5
  BtnBackup.Default = True
  BtnBackup.ModalResult = 1
   
  'show form
  Set SDB.Objects("AADJOptsForm") = Form
  If Form.ShowModal = 1 Then   
    Set edt = SDB.Objects("AADJModeCapt")
    If Not (edt Is Nothing) Then
      ModeNum = Form.Common.ChildControl("AADJModeNum").Value
      edt.Caption = "Enable "&ModeNum&"-from-1 mode (adds "&ModeNum&" random tracks from selected album)"
    End If
  End If
End Sub
 
Sub CloseConfigSheet(Sheet,SaveConfig)
  Dim ini : Set ini = SDB.IniFile
  Dim clr : clr = False
  If ini.BoolValue("AutoAlbumDJ","Debug") Then
    clr = True
  End If
 
  If SaveConfig Then
    ini.BoolValue("AutoAlbumDJ","Mode3f1") = Sheet.Common.ChildControl("AADJMode3f1").Checked
    ini.BoolValue("AutoAlbumDJ","Debug") = Sheet.Common.ChildControl("AADJDebug").Checked   
    If ini.BoolValue("AutoAlbumDJ","Debug") Then
      clr = True
    End If   
   
    Dim Form : Set Form = SDB.Objects("AADJOptsForm")
    If Not (Form Is Nothing) Then
      ini.IntValue("AutoAlbumDJ","MinTracks") = Form.Common.ChildControl("AADJMinTracks").Value
      ini.IntValue("AutoAlbumDJ","Capacity") = Form.Common.ChildControl("AADJCapacity").Value
      ini.IntValue("AutoAlbumDJ","Attempts") = Form.Common.ChildControl("AADJAttempts").Value
      ini.StringValue("AutoAlbumDJ","TheGenre") = Form.Common.ChildControl("AADJTheGenre").Text
      ini.IntValue("AutoAlbumDJ","MaxTracks") = Form.Common.ChildControl("AADJMaxTracks").Value
      ini.BoolValue("AutoAlbumDJ","Unplayed") = Form.Common.ChildControl("AADJUnplayed").Checked
      ini.IntValue("AutoAlbumDJ","MaxDays") = Form.Common.ChildControl("AADJMaxDays").Value
      ini.IntValue("AutoAlbumDJ","AvgPlays") = Form.Common.ChildControl("AADJAvgPlays").Value 
      ini.BoolValue("AutoAlbumDJ","IgnoreNon") = Form.Common.ChildControl("AADJIgnoreNon").Checked
      ini.IntValue("AutoAlbumDJ","ModeNum") = Form.Common.ChildControl("AADJModeNum").Value
      Dim edt : Set edt = Form.Common.ChildControl("AADJFilterName")
      ini.StringValue("AutoAlbumDJ","FilterName") = edt.ItemText(edt.ItemIndex)
      ini.BoolValue("AutoAlbumDJ","Toolbar") = Form.Common.ChildControl("AADJToolbar").Checked
      SDB.Objects("AADJ-Button").Visible = Form.Common.ChildControl("AADJToolbar").Checked
      ini.BoolValue("AutoAlbumDJ","Trayicon") = Form.Common.ChildControl("AADJTrayicon").Checked
      SDB.Objects("AADJ-Tray").Visible = Form.Common.ChildControl("AADJTrayicon").Checked
      ini.IntValue("AutoAlbumDJ","MinDays") = Form.Common.ChildControl("AADJMinDays").Value
      ini.BoolValue("AutoAlbumDJ","ApplyFilter") = Form.Common.ChildControl("AADJApplyFilter").Checked
     
      Dim val : val = Form.Common.ChildControl("AADJMinRating").ItemIndex
      If val = 11 Then
        ini.StringValue("AutoAlbumDJ","MinRating") = "-1"
      Else
        ini.StringValue("AutoAlbumDJ","MinRating") = val/2
      End If
     
      val = Form.Common.ChildControl("AADJAvgRating").ItemIndex
      If val = 11 Then
        ini.StringValue("AutoAlbumDJ","AvgRating") = "-1"
      Else
        ini.StringValue("AutoAlbumDJ","AvgRating") = val/2
      End If
     
      Dim mem : mem = SDB.IniFile.StringValue("AutoAlbumDJ","Memory")
      If Not (mem = "") Then
        mem = Mid(mem,2,Len(mem)-2)
        Dim arr : arr = Split(mem,"|")
        Dim cap : cap = ini.IntValue("AutoAlbumDJ","Capacity")
        If UBound(arr)+1 > cap Then
          mem = "|"
          For val = UBound(arr)-cap+1 To UBound(arr)
            mem = mem&arr(val)&"|"
          Next
          ini.StringValue("AutoAlbumDJ","Memory") = mem
        End If     
      End If 
     
      mem = Form.Common.ChildControl("AADJEarliest").Text
      If Not (mem = "") Then
        If ValidDate(mem) Then
          ini.StringValue("AutoAlbumDJ","Earliest") = mem
        Else
          ini.StringValue("AutoAlbumDJ","Earliest") = ""
          Call SDB.MessageBox("AutoAlbumDJ: Earliest date invalid, should be YYYYMMDD.",mtError,Array(mbOk))
        End If
      End If
    End If
  End If
 
  Set SDB.Objects("AADJClearBtn") = Nothing
  Set SDB.Objects("AADJClearBtn2") = Nothing 
  Set SDB.Objects("AADJModeCapt") = Nothing 
  If clr Then
    Call clear()
  End If
End Sub

Sub DoSelectAlbum()
  Call SelectAlbum(Nothing)
End Sub

Sub SelectAlbum(but)
  Debug = SDB.IniFile.BoolValue("AutoAlbumDJ","Debug")
  If Debug Then
    Call out("[SelectAlbum]")
  End If     
 
  Dim song : Set song = SDB.Player.CurrentSong
  If song Is Nothing Then
    Exit Sub
  End If
  Dim aid : aid = song.Album.ID
  If aid < 0 Then
    Exit Sub
  End If
 
  Dim list : Set list = SDB.Objects("AADJSongList")
  If Not (list Is Nothing) Then
    If list.Count > 0 Then
      If list.Item(0).Album.ID = aid Then 
        Set SDB.Objects("AADJSongList") = Nothing
        SDB.IniFile.StringValue("AutoAlbumDJ","SongList") = ""
      End If
    End If
  End If 
 
  Dim vol : vol = SDB.Player.Volume
  SDB.Player.Volume = 0
  SDB.Player.Next
  While (SDB.Player.CurrentSong.Album.ID = aid)
    Call SDB.Tools.Sleep(100) 
    SDB.ProcessMessages
    If SDB.Player.CurrentSongIndex+1 = SDB.Player.PlaylistCount Then
      SDB.Player.Volume = vol
      Exit Sub
    End If
    SDB.Player.Next
  WEnd
  SDB.Player.Volume = vol
End Sub

Function GenerateNewTrack
  Debug = SDB.IniFile.BoolValue("AutoAlbumDJ","Debug")
  If Debug Then
    Call out("[GenerateNewTrack]")
  End If
 
  Dim iter,i,str,arr
  Dim list : Set list = SDB.Objects("AADJSongList")
  If Not (list Is Nothing) Then
    If list.Count = 0 Then
      Set list = Nothing
    End If
  End If 
  If list Is Nothing Then
    str = SDB.IniFile.StringValue("AutoAlbumDJ","SongList")
    If str = "" Then
      Call AutoAlbumDJ(list)
    Else
      arr = Split(str,",")
      Set list = SDB.NewSongList
      For i = 0 To UBound(arr)
        Set iter = SDB.Database.QuerySongs("ID="&arr(i))
        If Not iter.EOF Then
          Call list.Add(iter.Item)
        End If
      Next
      If list.Count = 0 Then
        Set list = Nothing
      End If
    End If   
  End If 
 
  If list Is Nothing Then
    FilterName = SDB.IniFile.StringValue("AutoAlbumDJ","FilterName")
    FilterSQL = GetFilterSQL(FilterName)
    Set iter = SDB.Database.OpenSQL("SELECT ID FROM Songs WHERE ID>0 "&FilterSQL&" ORDER BY Random(*) LIMIT 1")
    Set iter = SDB.Database.QuerySongs("ID="&iter.ValueByIndex(0))
    Set GenerateNewTrack = iter.Item
    If Debug Then
      Call out("Random track: "&GenerateNewTrack.Title&" ("&GenerateNewTrack.ID&")")
    End If   
    Set SDB.Objects("AADJSongList") = Nothing
  Else
    Set GenerateNewTrack = list.Item(0)
    If Debug Then
      Call out("Next track: "&GenerateNewTrack.Title&" ("&GenerateNewTrack.ID&")")
    End If   
    If list.Count = 1 Then
      If Debug Then
        Call out("(End of list)")
      End If
      Call AutoAlbumDJ(list)
    Else
      Call list.Delete(0)
    End If   
    Set SDB.Objects("AADJSongList") = list
  End If
 
  str = ""
  If Not (list Is Nothing) Then
    If list.Count > 0 Then
      str = list.Item(0).ID
      For i = 1 To list.Count-1
        str = str&","&list.Item(i).ID
      Next
    End If
  End If
  SDB.IniFile.StringValue("AutoAlbumDJ","SongList") = str
End Function

Sub AutoAlbumDJ(list)
  'populate variables
  Dim ini : Set ini = SDB.IniFile
  MinTracks = ini.IntValue("AutoAlbumDJ","MinTracks")
  AvgRating = ini.StringValue("AutoAlbumDJ","AvgRating")*1
  MinRating = ini.StringValue("AutoAlbumDJ","MinRating")*1
  Capacity = ini.IntValue("AutoAlbumDJ","Capacity")
  Attempts = ini.IntValue("AutoAlbumDJ","Attempts")
  TheGenre = ini.StringValue("AutoAlbumDJ","TheGenre")
  Mode3f1 = ini.BoolValue("AutoAlbumDJ","Mode3f1")
  MaxTracks = ini.IntValue("AutoAlbumDJ","MaxTracks")
  Unplayed = ini.BoolValue("AutoAlbumDJ","Unplayed")
  Earliest = ini.StringValue("AutoAlbumDJ","Earliest")
  Debug = ini.BoolValue("AutoAlbumDJ","Debug")
  MaxDays = ini.IntValue("AutoAlbumDJ","MaxDays")
  AvgPlays = ini.IntValue("AutoAlbumDJ","AvgPlays")
  IgnoreNon = ini.BoolValue("AutoAlbumDJ","IgnoreNon")
  ModeNum = ini.IntValue("AutoAlbumDJ","ModeNum")
  FilterName = ini.StringValue("AutoAlbumDJ","FilterName")
  FilterSQL = GetFilterSQL(FilterName)
  MinDays = ini.IntValue("AutoAlbumDJ","MinDays")
  ApplyFilter = ini.BoolValue("AutoAlbumDJ","ApplyFilter")
 
  'select random album
  Dim mem : mem = ini.StringValue("AutoAlbumDJ","Memory")
  Dim str : str = "SELECT MIN(ID) AS Minval, MAX(ID) AS Maxval, COUNT(ID) AS Totval FROM Albums WHERE ID>0"
  If IgnoreNon Then
    str = str&" AND Album != ''"
  End If
  Dim iter : Set iter = SDB.Database.OpenSQL(str)
  Dim min : min = iter.ValueByName("Minval")
  Dim max : max = iter.ValueByName("Maxval")
  Dim boo : boo = True
  Dim ind : ind = 0
  Dim tot : tot = 0
  Dim loops : loops = 0
  Randomize
 
  'calculate rating values
  Dim minrat : minrat = 0
  Select Case MinRating
    Case -1
      minrat = -2
    Case 0
      minrat = -1
    Case Else
      minrat = (MinRating*20)-5
  End Select
  Dim avgrat : avgrat = 0
  Select Case AvgRating
    Case -1
      avgrat = -2
    Case 0
      avgrat = -1
    Case Else
      avgrat = (AvgRating*20)-5
  End Select       
 
  If Debug Then
    Call out("MinTracks   = "&MinTracks)
    Call out("AvgRating   = "&AvgRating&" ("&(avgrat+1)&")") 
    Call out("MinRating   = "&MinRating&" ("&(minrat+1)&")") 
    Call out("Capacity    = "&Capacity) 
    Call out("Attempts    = "&Attempts) 
    Call out("TheGenre    = "&TheGenre) 
    Call out("Mode3f1     = "&Mode3f1) 
    Call out("ModeNum     = "&ModeNum)
    Call out("MaxTracks   = "&MaxTracks)
    Call out("Unplayed    = "&Unplayed)
    Call out("Earliest    = "&Earliest)
    Call out("MaxDays     = "&MaxDays)
    Call out("AvgPlays    = "&AvgPlays)
    Call out("IgnoreNon   = "&IgnoreNon)
    Call out("MinDays     = "&MinDays)
    Call out("ApplyFilter = "&ApplyFilter)
    Call out("min(id)     = "&min)
    Call out("max(id)     = "&max)
    Call out("tot(id)     = "&iter.StringByName("Totval"))
  End If 
 
  'loop until valid album found
  Do
    boo = True
    ind = Int((max-min+1)*Rnd)+min
    'ensure album name isn't blank
    If IgnoreNon Then
      Set iter = SDB.Database.OpenSQL("SELECT Album FROM Albums WHERE ID="&ind)
      If iter.EOF Then
        boo = False
        If Debug Then
          Call out(ind&" not in database")
        End if       
      Else
        If iter.StringByName("Album") = "" Then
          boo = False
          If Debug Then
            Call out(ind&" has no name")
          End if
        End If
      End If
    End If   
    'ensure album hasn't been selected recently
    If (InStr(mem,"|"&ind&"|") > 0) Or (boo = False) Then
      If boo Then
        boo = False
        If Debug Then
          Call out(ind&" is in memory")
        End If
      End If
    Else
      'ensure there are enough tracks with minimum rating and matching genre and within filter
      If TheGenre = "" Then
        str = "SELECT Count(*) As Nombre FROM Songs WHERE IDAlbum="&ind&" AND Rating>"&minrat&" "&FilterSQL
      Else
        str = "SELECT Count(*) As Nombre FROM Songs,GenresSongs,Genres WHERE Songs.IDAlbum="&ind&" AND Songs.Rating>"&minrat&" AND GenresSongs.IDSong = Songs.ID AND GenresSongs.IDGenre = Genres.IDGenre AND Genres.GenreName IN ('"&Replace(TheGenre,",","','")&"') "&FilterSQL
      End If
      Set iter = SDB.Database.OpenSQL(str)
      tot = Int(iter.ValueByName("Nombre"))
      If (tot*1 < MinTracks*1) Or (tot*1 > MaxTracks*1) Then
        If tot*1 < MinTracks*1 Then
          str = "(too few)"
        Else
          str = "(too many)"
        End If
        boo = False
        If Debug Then
          If TheGenre = "" Then
            Call out(ind&" has "&tot&" tracks above minimum rating "&str)
          Else
            Call out(ind&" has "&tot&" tracks above minimum rating and matching genres "&str)
          End If
        End If
      Else
        'ensure the average is high enough
        str = "SELECT AVG(Rating) As AvgRating, MAX(PlayCounter) As MaxPlayed, MIN(DateAdded) As MinDate, AVG(PlayCounter) As AvgPlays, MAX(LastTimePlayed) As MaxTime FROM Songs WHERE IDAlbum="&ind
        Set iter = SDB.Database.OpenSQL(str)
        tot = FixLocale(iter.StringByName("AvgRating"))/20
        If (tot*1 < AvgRating*1) Then
          boo = False
          If Debug Then Call out(ind&" has average rating of "&tot)
        Else
          'ensure tracks are unplayed
          tot = iter.ValueByName("MaxPlayed")
          If (Unplayed) And (tot*1 > 0) Then
            boo = False
            If Debug Then Call out(ind&" has a track played "&tot&" times")
          Else
            'ensure the playcount average is not too high
            tot = FixLocale(iter.StringByName("AvgPlays"))
            If tot*1 > AvgPlays*1 Then
              boo = False
              If Debug Then Call out(ind&" has tracks on average played "&tot&" times")
            Else 
              'ensure not before earliest days
              str = iter.StringByName("MinDate")
              tot = DateDiff("d",DateAdd("d",(Left(str,InStr(str,".")-1)-1),#01/01/1900#),Date())
              If tot*1 > MaxDays*1 Then
                boo = False
                If Debug Then Call out(ind&" has a track added "&tot&" days ago")
              Else       
                'ensure the last played maximum is not too recent
                str = iter.StringByName("MaxTime")
                tot = DateDiff("d",DateAdd("d",(Left(str,InStr(str,".")-1)-1),#01/01/1900#),Date())               
                If tot*1 < MinDays*1 Then
                  boo = False
                  If Debug Then Call out(ind&" has a track played "&tot&" days ago")               
                Else
                  'ensure not before earliest date
                  If Not ( Earliest = "" ) Then
                    str = iter.StringByName("MinDate")       
                    Dim days : days = Left(str,InStr(str,".")-1)
                    Dim tmp : tmp = FixDate(DateAdd("d",(days-2),#01/01/1900#))
                    If tmp < Earliest Then
                      boo = False
                      If Debug Then Call out(ind&" has a track added "&tmp)
                    End If
                  End If
                End If
              End If
            End If
          End If
        End If
      End If
    End If
    'ensure infinite loop doesn't occur
    SDB.ProcessMessages
    loops = loops + 1
    If loops >= Attempts Then
      Exit Do
    End If
  Loop Until boo
 
  'check album was found
  If boo Then
    'add album to now playing
    Set list = SDB.NewSongList
    If Mode3f1 Then
      str = "AND (Songs.IDAlbum="&ind&") AND (Songs.Rating>"&minrat&") ORDER BY Random(*)"
      Set iter = SDB.Database.QuerySongs(str)
      For loops = 1 To ModeNum
        If iter.EOF Then
          Exit For
        End If
        If Debug Then Call out("Adding track: "&iter.Item.Title&" ("&iter.Item.ID&")")
        Call list.Add(iter.Item)
        Iter.Next
      Next
    Else
      str = "AND (Songs.IDAlbum="&ind&") AND (Songs.Rating>"&minrat&") "
      If ApplyFilter Then
        str = str&FilterSQL
      End If
      str = str&" ORDER BY CAST(Songs.DiscNumber AS INTEGER), CAST(Songs.TrackNumber AS INTEGER)"
      Set iter = SDB.Database.QuerySongs(str)
      Do While Not iter.EOF
        If Debug Then Call out("Adding track: "&iter.Item.Title&" ("&iter.Item.ID&")")
        Call list.Add(iter.Item)
        Iter.Next
      Loop 
    End If
 
    'add album to memory
    If mem = "" Then
      ini.StringValue("AutoAlbumDJ","Memory") = "|"&ind&"|"
    Else
      mem = mem&ind
      Dim arr : arr = Split(Mid(mem,2),"|")
      If UBound(arr)+1 > Capacity Then
        Dim pos : pos = InStr(2,mem,"|")
        If (pos > 0) And (pos < Len(mem)) Then
          mem = Mid(mem,pos)
        Else
          mem = "|"&ind
        End If
      End If
      ini.StringValue("AutoAlbumDJ","Memory") = mem&"|"
    End If
   
    If Debug Then Call out(ind&" has been selected :)")
  Else
    If Debug Then Call out("No album has been selected :(")
    Set list = Nothing
  End If 
End Sub

Sub DisplayMemory(List)
  Dim btn : Set btn = SDB.Objects("AADJClearBtn")
  Dim mem : mem = SDB.IniFile.StringValue("AutoAlbumDJ","Memory")
  If Not (mem = "") Then
    mem = Mid(mem,2,Len(mem)-2)
    Dim arr : arr = Split(mem,"|")
    Dim max : max = UBound(arr)+1
    Dim i,sql,iter
    List.AddItem(max&" albums...")
    For i = max To 1 Step -1
      sql = "SELECT Album, Artist FROM Albums WHERE Albums.ID="&arr(i-1)
      Set iter = SDB.Database.OpenSQL(sql)
      If iter.EOF Then
        sql = "(Unknown album)"
      Else
        sql = iter.StringByName("Artist")&" - "&iter.StringByName("Album")       
      End If
      If i > 9 Then
        List.AddItem(i&". "&sql)
      Else
        List.AddItem("0"&i&". "&sql)
      End If
    Next
    btn.Common.Enabled = True
  Else
    List.AddItem("0 albums...")
    btn.Common.Enabled = False
  End If 
  List.ItemIndex = 0
End Sub

Sub DisplayCount(List)
  List.ItemIndex = 0
End Sub

Sub ClearMemory
  SDB.IniFile.StringValue("AutoAlbumDJ","Memory") = ""
  Dim btn : Set btn = SDB.Objects("AADJClearBtn")
  If Not (btn Is Nothing) Then
    btn.Common.Enabled = False
  End If
 
  Dim ddl : Set ddl = btn.Common.Parent.Common.ChildControl("ddl")
  If Not (ddl Is Nothing) Then
    Do While (ddl.ItemCount > 0)
      ddl.DeleteItem(0)
    Loop
    ddl.AddItem("0 albums...")
    ddl.ItemIndex = 0
  End If
End Sub

Sub ListGenres
  Dim Opts : Set Opts = SDB.Objects("AADJOptsForm")
  If (Opts Is Nothing) Then
    Exit Sub
  End If
  Dim Dict : Set Dict = CreateObject("Scripting.Dictionary")
  Dim i : i = 0
  Dim str : str = Opts.Common.ChildControl("AADJTheGenre").Text
  If Not (str = "") Then
    Dim arr : arr = Split(str,",")
    For i = 0 To UBound(arr)
      Dict.Item(arr(i)) = "#"&i
    Next
  End If
 
  Dim UI : Set UI = SDB.UI
  Dim Form : Set Form = UI.NewForm
  Form.Common.SetRect 50, 50, 500, 400
  Form.Common.MinWidth = 200
  Form.Common.MinHeight = 150
  Form.FormPosition = 4
  Form.Caption = "AutoAlbumDJ Settings - Genre Filter"
  Form.StayOnTop = True

  Dim WB : Set WB = UI.NewActiveX(Form,"Shell.Explorer")
  WB.Common.Align = 5
  WB.Common.ControlName = "WB"
  Dim doc : Set doc = WB.Interf.Document

  Dim Foot : Set Foot = UI.NewPanel(Form)
  Foot.Common.Align = 2
  Foot.Common.Height = 35

  Dim Btn : Set Btn = UI.NewButton(Foot)
  Btn.Caption = SDB.Localize("&Cancel")
  Btn.Common.SetRect (Foot.Common.Width - 180)/2+95, 9, 85, 24
  Btn.Common.Anchors = 12
  Btn.UseScript = Script.ScriptPath
  Btn.OnClickFunc = "OnCancel"

  Dim Btn2 : Set Btn2 = UI.NewButton(Foot)
  Btn2.Caption = SDB.Localize("&Ok") 
  Btn2.Common.SetRect (Foot.Common.Width - 180)/2, 9, 85, 24
  Btn2.Common.Anchors = 12
  Btn2.UseScript = Script.ScriptPath
  Btn2.OnClickFunc = "OnOk" 

  Form.Common.Visible = True
  Set SDB.Objects("AADJListForm") = Form

  doc.write "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">"&vbcrlf
  doc.write "<html>"&vbcrlf
  doc.write "  <head>"&vbcrlf
  doc.write "    <title>AutoAlbumDJ Settings - Genre Filter</title>"&vbcrlf
  doc.write "    <style type=""text/css"">"&vbcrlf
  doc.write "      body{font-family:'Verdana',sans-serif; background-color:#FFFFFF; font-size:9pt; color:#000000;}"&vbcrlf
  doc.write "      H1{font-family:'Verdana',sans-serif; font-size:13pt; font-weight:bold; color:#AAAAAA; text-align:left}"&vbcrlf
  doc.write "      P{font-family:'Verdana',sans-serif; font-size:8pt; color:#000000;}"&vbcrlf
  doc.write "      TH{font-family:'Verdana',sans-serif; font-size:9pt; font-weight:bold; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:3px;}"&vbcrlf
  doc.write "      TD{font-family:'Verdana',sans-serif; font-size:8pt; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:1px;}"&vbcrlf
  doc.write "      TD.highlight{font-family:'Verdana',sans-serif; font-size:8pt; background-color:#FFFF77; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:1px;}"&vbcrlf
  doc.write "      TR.dark{background-color:#EEEEEE}"&vbcrlf
  doc.write "      TR.aleft TH{text-align:left}"&vbcrlf
  doc.write "    </style>"&vbcrlf
  doc.write "  </head>"&vbcrlf
  doc.write "  <body>"&vbcrlf
  doc.write "    <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">"&vbcrlf 
  doc.write "      <tr class=""aleft"">"&vbcrlf
  doc.write "        <th>Genre</th>"&vbcrlf
  doc.write "        <th>Useage</th>"&vbcrlf
  doc.write "        <th>&nbsp;</th>"&vbcrlf
  doc.write "      </tr>"&vbcrlf   
  Dim Iter : Set Iter = SDB.Database.OpenSQL("SELECT GenreName,UsageCount,IDGenre FROM Genres ORDER BY GenreName")
  While Not Iter.EOF
    Dim nam : nam = Iter.StringByIndex(0)
    doc.write "      <tr"&Style()&">"&vbcrlf
    doc.write "        <td>"&MapXML(nam)&"</td>"&vbcrlf
    doc.write "        <td>"&MapXML(Iter.StringByIndex(1))&"</td>"&vbcrlf
    If Dict.Exists(nam) Then
      doc.write "        <td><input type=""checkbox"" id="""&Iter.StringByIndex(2)&""" value=""checked"" checked=""checked"" /></td>"&vbcrlf   
    Else
      doc.write "        <td><input type=""checkbox"" id="""&Iter.StringByIndex(2)&""" value=""checked"" /></td>"&vbcrlf
    End If
    doc.write "      </tr>"&vbcrlf
    Iter.Next
  WEnd   
  doc.write "    </table>"&vbcrlf
  doc.write "  </body>"&vbcrlf
  doc.write "</html>"&vbcrlf
  doc.close
End Sub

Sub OnCancel(Btn)
  Set SDB.Objects("AADJListForm") = Nothing
End Sub

Sub OnOk(Btn)
  Dim Form : Set Form = SDB.Objects("AADJListForm")
  Dim Opts : Set Opts = SDB.Objects("AADJOptsForm")
  If (Opts Is Nothing) Or (Form Is Nothing) Then
    Set SDB.Objects("AADJListForm") = Nothing
    Exit Sub
  End If

  Dim str : str = "" 
  Dim doc : Set doc = Form.Common.ChildControl("WB").Interf.Document
  Dim Iter : Set Iter = SDB.Database.OpenSQL("SELECT IDGenre,GenreName FROM Genres ORDER BY GenreName")
  While Not Iter.EOF
    Dim chk : Set chk = doc.getElementById(Iter.StringByIndex(0))
    If Not (chk Is Nothing) Then
      If chk.checked Then
        If str = "" Then
          str = Iter.StringByIndex(1)
        Else
          str = str&","&Iter.StringByIndex(1)
        End If
      End If
    End If
    Iter.Next
  WEnd   
 
  Opts.Common.ChildControl("AADJTheGenre").Text = str
  Set SDB.Objects("AADJListForm") = Nothing
End Sub

Function Style()
  styleOn = Not styleOn
  If styleOn Then
    Style = ""
  Else
    Style = " class=""Dark"""
  End If
End Function

Function MapXML(orig)
  If (orig = "") Then
    MapXML = "&nbsp;"
    Exit Function
  End If
 
  Dim hold : hold = Replace(orig,"&","&amp;")
  hold = Replace(hold," ","&nbsp;")
  hold = Replace(hold,"<","&lt;")
  hold = Replace(hold,">","&gt;")
  Dim i : i = 1
  While i<=Len(hold)
    If (AscW(Mid(hold,i,1))>127) Then
      hold = Mid(hold,1,i-1)+"&#"+CStr(AscW(Mid(hold,i,1)))+";"+Mid(hold,i+1)
    End If
    i = i+1
  WEnd
  MapXML = hold
End Function

Sub ClearCurrent
  Dim btn : Set btn = SDB.Objects("AADJClearBtn2")
  If Not (btn Is Nothing) Then
    btn.Common.Enabled = False
  End If
  Set SDB.Objects("AADJSongList") = Nothing
  SDB.IniFile.StringValue("AutoAlbumDJ","SongList") = ""
End Sub

Function ValidDate(d)
  ValidDate = False
  If Not (Len(d) = 8) Then Exit Function
 
  Dim i : i = 0
  Dim v : v = "1234567890"
  For i = 1 To Len(d)
    If InStr(v,Mid(d,i,1)) = 0 Then Exit Function
  Next
 
  i = Int(Left(d,4))
  If (i<1900) Or (i>2100) Then Exit Function
 
  i = Int(Mid(d,5,2))
  If (i<1) Or (i>12) Then Exit Function
 
  i = Int(Right(d,2))
  If (i<1) Or (i>31) Then Exit Function
 
  ValidDate = True
End Function

Function FixDate(d)
  If Len(d) = 10 Then
    FixDate = Right(d,4)&Mid(d,4,2)&Left(d,2)
  Else
    FixDate = "19000101"
  End If
End Function

Function FixLocale(rat)
  Dim a : a = "0123456789"
  Dim i : i = 0
  Dim r : r = ""
  If InStr(rat,"-") = 0 Then
    For i = 1 To Len(rat)
      If InStr(a,Mid(rat,i,1)) = 0 Then
        r = Left(rat,i-1)
        Exit For
      End If     
    Next
  End If
  If r = "" Then
    FixLocale = -20
  Else
    FixLocale = Int(r)
  End If 
End Function

Function GetFilterID(Name)
  If SDB.Database.OpenSQL("SELECT COUNT(*) FROM Filters WHERE Name='"& Replace(Name,"'","''") &"'").ValueByIndex(0) = 0 Then
     If SDB.MessageBox("The used Filter named ''"& Name &"'' does not any longer exist." & VbNewLine &_
                       "Do you wish to create the Report anyway without any Filter applied?" & VbNewLine &_
                       "(Click No to apply an existing Filter and run the Report again.)", mtWarning, Array(mbYes,mbNo)) = mrYes Then
        FilterName = "- No Filter -"
        SDB.IniFile.StringValue("AdvancedReport","FilterName") = FilterName
        GetFilterID = -1
     Else
        Exit Function
     End If
  Else
     GetFilterID = SDB.Database.OpenSQL("SELECT ID FROM Filters WHERE Name='"& Replace(Name,"'","''") &"'").ValueByIndex(0)
  End If
End Function

Sub FillDropDownFromArray(DropDown, SourceArray)
   Dim i
   For i = 0 To UBound(SourceArray)
     DropDown.AddItem SourceArray(i)
   Next
End Sub

Sub CreateFiltersArray
   Dim i,iter : Redim Filters(SDB.Database.OpenSQL("SELECT COUNT(*) FROM Filters").ValueByIndex(0)+1)
   Filters(0) = "- No Filter -"
   Filters(1) = "- Active Filter -"
   i=2
   Set iter = SDB.Database.OpenSQL("SELECT Name FROM Filters ORDER BY Pos")
   Do While Not iter.EOF
      Filters(i) = iter.StringByIndex(0)
      i=i+1
      iter.Next
   Loop
   Set iter = Nothing
End sub

Function GetFiltersArrayID(Name)
   Dim i,exists
   exists = False
   For i=0 To Ubound(Filters)
      If Filters(i)=Name Then
         GetFiltersArrayID=i
         exists = True
         Exit For
      End If
   Next
   If not exists Then GetFiltersArrayID=0
End Function

Function GetFilterSQL(Name)
   Dim pAnd
   Select Case Name
      Case "- No Filter -"
         GetFilterSQL = ""
      Case "- Active Filter -"
         If Not SDB.Database.ActiveFilterQuery = "" Then pAnd = "AND "
         GetFilterSQL = pAnd & SDB.Database.ActiveFilterQuery
      Case Else
         If GetFilterID(Name) = -1 Then
            GetFilterSQL = ""
         Else
            If Not SDB.Database.GetFilterQuery(GetFilterID(Name)) = "" Then pAnd = "AND "
            GetFilterSQL = pAnd & SDB.Database.GetFilterQuery(GetFilterID(Name))
         End If
   End Select
End Function

Sub clear()
  Dim wsh : Set wsh = CreateObject("WScript.Shell")
  Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
  Dim loc : loc = wsh.ExpandEnvironmentStrings("%TEMP%")&"\AutoAlbumDJ.log"
  Dim logf : Set logf = fso.CreateTextFile(loc,True)
  logf.Close
End Sub

Sub out(txt)
  Dim wsh : Set wsh = CreateObject("WScript.Shell")
  Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
  Dim loc : loc = wsh.ExpandEnvironmentStrings("%TEMP%")&"\AutoAlbumDJ.log"
  Dim logf : Set logf = fso.OpenTextFile(loc,8,True)
  logf.WriteLine(SDB.ToAscii(txt))
  logf.Close
End Sub
Last edited by trixmoto on Tue Apr 22, 2008 5:25 pm, edited 13 times in total.
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby psyXonova » Tue Jan 24, 2006 9:40 am

Cool, nice one and very clever.
I like it....
psyXonova
 
Posts: 785
Joined: Fri May 20, 2005 3:57 am
Location: Nicosia, Cyprus

Postby sasapuksic » Tue Jan 24, 2006 3:30 pm

Could you please give me a hand as I am having trouble installing script ... what do you mean with "and set the order appropriately" as I think this one is causing me trouble ... when I try to turn it on in tools menu I get error message.

Thanx!!
:oops:
sasapuksic
 
Posts: 106
Joined: Tue Jan 03, 2006 11:43 am
Location: Maribor, Slovenia

Postby trixmoto » Tue Jan 24, 2006 4:33 pm

Where it says "Order=24" and "Order=25", these can be set to any numeric value you like. This is simply the order which the menu items appear so should not be giving you an error.

What does the error message say?
Did you save the script as "{MediaMonkey}\Scripts\AutoAlbumDJ.vbs"?
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby Sammy20 » Tue Jan 24, 2006 7:45 pm

Nice script, very useful for me.

I wish my ipod had this feature.
Sammy20
 
Posts: 110
Joined: Thu Feb 17, 2005 5:42 am

Re: Auto Album DJ

Postby zerium » Fri Jan 27, 2006 4:35 am

trixmoto wrote:This is designed to work a bit like AutoDJ, but it queues entire albums at once. There is a menu option ("Tools, Scripts, Auto Album DJ (On/Off)") which allows you to switch this feature on/off. When switched on, whenever you play the last track in your now playing list (n.b. turn shuffle off!) a random album will appear (in track order) at the end of your list. This means you will never run out of albums to listen to.


This does not work because it assumes that IDAlbum <= IDAlbum for all albums. This is not true if you remove albums...

Zerium :)
zerium
 

Postby trixmoto » Fri Jan 27, 2006 9:33 am

What do you mean "IDAlbum <= IDAlbum"?
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby trixmoto » Mon Jan 30, 2006 6:07 am

I have fully tested this script for over 24 hours without a problem. If you can describe your problem more fully, maybe I can fix it.
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby trixmoto » Mon Jan 30, 2006 7:31 am

New version (1.1) should ensure that the album selected always contains tracks (which I think is the problem zerium might have been experiencing).

:o NEW CODE BELOW :o
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby trixmoto » Thu Feb 09, 2006 7:21 am

New version (1.2) allows the user to set a minimum number of tracks per album (so it won't add any albums with less tracks than that number), default = 5.

:o NEW CODE BELOW :o
Last edited by trixmoto on Fri Feb 10, 2006 10:32 am, edited 1 time in total.
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby Sammy20 » Thu Feb 09, 2006 10:02 pm

Would it be possible to add a feature were it only played albums with a average rating of 3.0 or more (make it adjustable).

I figured this would work since magic nodes can calculate the average rating of an album (if you rate all your tracks).
Sammy20
 
Posts: 110
Joined: Thu Feb 17, 2005 5:42 am

Postby trixmoto » Fri Feb 10, 2006 5:04 am

Yes this is possible, and will be included in the next version.

Cheers! :)
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby trixmoto » Fri Feb 10, 2006 10:36 am

New version (1.3) allows you to set a minimum average rating for the songs in the album. This means only the good ones get chosen! Default is 3 (value is number of stars!)

:o NEW CODE BELOW :o
Last edited by trixmoto on Tue Feb 14, 2006 9:01 am, edited 1 time in total.
Download my scripts at trixmoto.net. If you're interested, check out my Uniface blog.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.

Image Image
trixmoto
 
Posts: 9951
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK

Postby Sammy20 » Sat Feb 11, 2006 6:16 am

Testing........


Works. Thanks.
Sammy20
 
Posts: 110
Joined: Thu Feb 17, 2005 5:42 am

Postby baker » Sun Feb 12, 2006 9:35 pm

How about the possibility of playing only 3 star or better tracks on the album?
baker
 

Next

Return to Need Help with Addons?

Who is online

Users browsing this forum: Bing [Bot] and 12 guests