'	File: iTunesRateCurrentTrack.vbs

'	Version: 1.0 

'	This script will rate the current song.

'	Usage:
'	iTunesRateCurrentTrack rating [-q]
'
'		rating		Number of 1/2 stars.
'					Valid values: Integers from 1 to 10 inclusive.
'		-q			Quiet mode.
'					Don't display any non-usage error messages.
'
'	Examples:
'		iTunesRateCurrentTrack 1
'		iTunesRateCurrentTrack 7 -q

'	Returns:
'		0		Success
'		1		Invalid arguments provided
'		2		Unable to connect to iTunes
'		3		Unable to determine current track

'	Disclaimer: Use at your own risk.

'	Send comments to iTunesRateCurrentTrack@varacalli.com
'	Copyright © 2007 varacalli.com, All Rights Reserved 

' Constants
Const MINIMUM_RATING = 1
Const MAXIMUM_RATING = 10
Const RATING_TO_STAR_MULTIPLIER = 10 ' 100 / MAXIMUM_RATING
Const MINIMUM_ARGUMENT_COUNT = 1
Const MAXIMUM_ARGUMENT_COUNT = 2
Const QUIET_MODE_SWITCH = "-q"

' Variables
Dim iTunes
Dim currentTrack
Dim rating
Dim quietMode
' Default quietMode to off
quietMode = False

' Make sure the correct number of arguments are provided.
If WScript.Arguments.Count < MINIMUM_ARGUMENT_COUNT Or WScript.Arguments.Count > MAXIMUM_ARGUMENT_COUNT Then
	Usage()
End If

' Get the rating from the command line and validate it.
On Error Resume Next
rating = CInt(WScript.Arguments(0))
' Is it a valid integer?
If Err.number <> 0 Then
	Usage()
End If
' Is it in the right range?
If rating < MINIMUM_RATING Or rating > MAXIMUM_RATING Then
	Usage()
End If

' Get the optional quiet-mode switch
If WScript.Arguments.Count = 2 Then
	If WScript.Arguments(1) = QUIET_MODE_SWITCH Then
		quietMode = True
	Else
		Usage()
	End If
End If

' Connect to iTunes app
Set iTunes = CreateObject("iTunes.Application")
If iTunes Is Nothing Then
	Call ErrorMessage ("Unable to connect to iTunes. Please make sure it is running.", 2)
End If

' Get the current track.
Set currentTrack = iTunes.CurrentTrack
If currentTrack Is Nothing Then
	Call ErrorMessage ("Unable to determine current track.", 3)
End If

' Rate the song. Rating is a number from 0-100.
currentTrack.Rating = rating * RATING_TO_STAR_MULTIPLIER

' Done.
Cleanup(0)

' Display usage message. Quit.
Private Sub Usage()
	Call ErrorMessage( _
			"Usage:" & vbCrLf & _
			vbTab & "iTunesRateCurrentTrack rating [-q]" & vbCrLf & _
			vbCrLf & _
			vbTab & "rating" & vbTab & "Number of 1/2 stars." & vbCrLf & _
			vbTab & vbTab & "Valid values: Integers from " & MINIMUM_RATING & " to " & MAXIMUM_RATING & "inclusive." & vbCrLf & _
			vbTab & "-q" & vbTab & "Quiet mode." & vbCrLf & _
			vbTab & vbTab & "Don't display any non-usage error messages." & vbCrLf & _
			vbCrLf & _
			"Examples:" & vbCrLf & _
			vbTab & "iTunesRateCurrentTrack 1" & vbCrLf & _
			vbTab & "iTunesRateCurrentTrack 7 -q" _
		, 1)
End Sub

' Display error message. Quit.
Private Sub ErrorMessage(ByVal message, ByVal errorCode)
	If Not quietMode Then
		WScript.Echo "#####    iTunes Rate Current Track Script    #####" & vbCrLf _
		& vbCrLf & _
		message & vbCrLf & _
		vbCrLf & _
		vbCrLf & _
		"Copyright © 2007 varacalli.com. All rights reserved." & vbCrLf & _
		"Send comments to iTunesRateCurrentTrack@varacalli.com"
	End If
	Call Cleanup(errorCode)
End Sub

' Clean up object references. Quit, setting the error code.
Private Sub Cleanup(ByVal errorCode)
	Set iTunes = Nothing
	Set currentTrack = Nothing
	WScript.Quit errorCode
End Sub

