25/12/07

DVD en lecture automatique avec VLC

VLC DVD.scpt

Ce billet fait suite au premier du genre : ouverture automatique des DVD avec VLC ; lui-même suivi d'une légère mise à jour de l'AppleScript (Mise à jour de VLC DVD.scpt).

Pendant ces vacances de fin d'année, je me suis rendu compte que ce script ne fonctionnait plus, la mise à jour de Tiger vers Leopard y étant peut-être pour quelque chose (?), je me suis donc décidé à réécrire le VLC DVD.scpt "from scratch" (ou presque) de façon à en faire quelque chose d'un peu plus facile à maintenir par la suite ; faut dire que les versions précédentes étaient un peu "usine à gaz".

(*    
    VLC DVD.scpt
    Harry-Proton <http://blogosx.homeunix.org>
 
    updated Dec. 28, 2007
*)
 
on run
	set lsDisks to {} as list
	set lsDisks to FunctionMountedDevices()
	
	set i to 0 as small integer
	set isDVD to false as boolean
	set cntDisks to (count of lsDisks) as small integer
	
	repeat while ((isDVD is false) and (i < cntDisks))
		set nbDisk to (item (cntDisks - i) of lsDisks) as small integer
		set isDVD to FunctioniSMediaType(nbDisk, "DVD-ROM")
		set i to i + 1
		
		if ((isDVD) and (FunctioniSPartitionType(nbDisk, "Apple_partition_scheme") = false)) then
			FunctionLaunchDVD(nbDisk)
		end if
	end repeat
end run
 
(* 
Functions are below:
	FunctionMountedDevices() return list of disks
	FunctioniSTypeDisk(nbDisk, typeDisk) return boolean
	FunctioniSPartitionType(nbDisk, typePart) return boolean
	FunctionLaunchDVD(nbDisk) open DVD with VLC
	FunctionReplace(find, replace, str) str initial string
*)
 
on FunctionMountedDevices()
	set lsDisks to (do shell script "ls /dev/rdisk?") as string
	set lsDisks to FunctionReplace("/dev/rdisk", "", lsDisks)
	--lsDisks: "0 1 2 3…"
	set listVolumes to {} as list
	set nbVolumes to (count words of lsDisks) as small integer
	set i to 1 as small integer
	
	repeat nbVolumes times
		set nbDisk to ((word i of lsDisks) as small integer)
		set listVolumes to listVolumes & nbDisk
		
		set i to i + 1
	end repeat
	
	return listVolumes
end FunctionMountedDevices
 
on FunctioniSMediaType(nbDisk, type)
	set infoDisk to (do shell script "diskutil info disk" & nbDisk) as string
	set MediaType to (do shell script "echo '" & infoDisk & "' | awk -F \"Media Type:\" '{print $2}' | awk -F \"Protocol:\" '{print $1}'") as string
	if MediaType contains type then
		return true
	end if
	return false
end FunctioniSMediaType
 
on FunctioniSPartitionType(nbDisk, type)
	set infoDisk to (do shell script "diskutil info disk" & nbDisk) as string
	set PartitionType to (do shell script "echo '" & infoDisk & "' | awk -F \"Partition Type:\" '{print $2}' | awk -F \"Bootable:\" '{print $1}'") as string
	if (PartitionType contains type) then
		return true
	end if
	return false
end FunctioniSPartitionType
 
on FunctionLaunchDVD(nbDisk)
	set appDVD to "VLC"
	set nbDisk to nbDisk as small integer
	if exists application appDVD then
		tell application appDVD to open ":dev:rdisk" & nbDisk
		tell application "System Events"
			set frontmost of application process appDVD to true
			tell process appDVD
				keystroke "f" using command down
			end tell
		end tell
	end if
end FunctionLaunchDVD
 
on FunctionReplace(find, replace, str)
	set ditd to text item delimiters
	set res to missing value
	set text item delimiters to find
	repeat with tis in text items of str
		if res is missing value then
			set res to tis
		else
			set res to res & replace & tis
		end if
	end repeat
	set text item delimiters to ditd
	return res
end FunctionReplace

Le script s'utilise toujours à l'aide du Digital Hub de Mac OS X. Du fait de sa simplification, et de son amélioration, je pense suis sûr que la rapidité d'exécution a grandement été améliorée (par rapport aux précédentes versions), notamment du fait que le script "scrute" les disques par ordre de montage décroissant ; avec des temps d'exécution de l'ordre de la seconde. Ci-après, les résultats en secondes de 100 tests, effectués avec 6 volumes dont un DVD (monté en dernier) :

{0.998400211334, 1.002999782562, 1.991500139236, 1.001899957657, 1.002300024033, 1.001600027084, 1.996200084686, 1.001699924469, 1.993000030518, 1.001599788666, 1.002300024033, 1.00720000267, 1.992400169373, 1.003700017929, 1.002300024033, 1.994599819183, 1.002700090408, 1.004199981689, 1.99129986763, 1.001999855042, 1.003099918365, 1.992300033569, 1.004599809647, 1.994699954987, 1.007899999619, 1.993999958038, 1.996099948883, 0.998800039291, 1.003799915314, 1.992100000381, 1.005300045013, 1.992000102997, 1.006999969482, 1.005100011826, 1.008199930191, 1.993600130081, 1.005000114441, 1.991599798203, 1.004299879074, 1.994899988174, 1.005400180817, 1.002099990845, 1.004100084305, 1.007800102234, 1.995100021362, 1.003499984741, 1.995399951935, 1.006899833679, 1.995000123978, 1.006500005722, 1.004299879074, 1.002700090408, 1.993499994278, 1.001300096512, 1.002700090408, 1.992599964142, 1.005299806595, 1.995900154114, 1.993999958038, 1.001600027084, 1.006099939346, 1.995599985123, 1.996200084686, 1.00049996376, 1.996299982071, 0.996199846268, 1.994699954987, 1.002799987793, 2.001199960709, 1.002300024033, 1.003999948502, 1.993000030518, 1.003900051117, 1.002400159836, 1.003400087357, 1.995800018311, 1.003399848938, 1.002899885178, 1.992199897766, 1.003600120544, 1.001899957657, 1.994500160217, 1.003000020981, 1.99599981308, 1.003700017929, 1.99599981308, 1.002700090408, 1.997800111771, 1.002399921417, 1.994599819183, 1.00469994545, 2.000999927521, 1.002300024033, 1.995899915695, 1.003799915314, 1.994600057602, 1.004100084305, 1.996299982071, 1.004899978638, 1.003999948502}

soit un temps moyen d'exécution de 0.992923789024 seconde.

Amélioration : les DVD tels que le DVD d'installation de Mac OS X ne sont plus exécutés par le script dans VLC.

L'icône du script est sous licence CC by-nc-nd et provient du Front Row 1.3 Realistic Skin de MugenB16.

Télécharger le script

Télécharger l'archive contenant le script : scptVLC4DVD.zip (±212 Ko).

La discussion continue ailleurs

Can i force VLC to launch a DVD when i insert it in

commenter (0)

22/05/07

Mise à jour de VLC DVD.scpt

VLC DVD.scpt

Voir le billet précédent : ouverture automatique des DVD avec VLC.

Télécharger le script : scptVLC4DVD.zip (±27 Ko).

Le script est maintenant doté d'une icône (resource fork), ce qui explique le poids de l'archive. La mise à jour concerne diverses optimisations du code : essentiellement l'abandon de fullscreen remplacé par un keystroke, et une meilleure gestion de la fenêtre…

VLC DVD.scpt

(*    
    VLC DVD.scpt
    HP <http://blogosx.jupiterii.com>
 
    updated May. 23, 2007
*)
 
property lastDVD : ""
property VLC : "VLC"
 
on run
	set isDVD to false
	
	quitVLC()
	
	set testDisks to do shell script "ls /dev/rdisk?"
	set diskNumberMax to (count words of findAndReplace("/dev/", "", testDisks))
	
	set itemsDisks to (count words of testDisks) + 1
	
	set diskList to {}
	set itemNum to 0
	repeat
		try
			copy word itemNum of testDisks to the end of diskList
		end try
		set itemNum to itemNum + 1
		if itemNum = itemsDisks then
			exit repeat
		end if
	end repeat
	
	try
		set lastDVD to (lastDVD / 1)
		try
			set diskString to "/dev/disk" & lastDVD
			detectDVD(diskString)
			if isDVD is true then
				launchDVD()
				set diskNumber to lastDVD
			end if
		end try
	end try
	
	if isDVD is false then
		repeat with i from 1 to the count of diskList
			set this_item to "/dev/" & findAndReplace("rdisk", "disk", (item i of diskList))
			set diskNumber to findAndReplace("/dev/disk", "", this_item)
			try
				if diskNumber is not equal to lastDVD then
					detectDVD(this_item)
					if isDVD is true then
						launchDVD()
						exit repeat
					end if
				end if
			end try
			
			if (isDVD is true) then
				exit repeat
			end if
		end repeat
	end if
	set lastDVD to lastDVD
end run
 
on detectDVD(pathDisk)
	global isDVD, diskNumber
	
	set testDisk to ¬
		do shell script "diskutil info " & pathDisk ¬
			& "|grep -i \" Media Type:\" | awk '{print $3}' | tail -1"
	if testDisk contains "DVD" then
		set isDVD to true
		set lastDVD to diskNumber
	end if
end detectDVD
 
on launchDVD()
	global diskNumber, isDVD
	
	if exists application VLC then
		tell application VLC to open ":dev:rdisk" & diskNumber
		tell application "System Events"
			set frontmost of application process VLC to true
			tell process VLC
				keystroke "f" using command down
			end tell
		end tell
	end if
end launchDVD
 
on findAndReplace(tofind, toreplace, TheString)
	set ditd to text item delimiters
	set res to missing value
	set text item delimiters to tofind
	repeat with tis in text items of TheString
		if res is missing value then
			set res to tis
		else
			set res to res & toreplace & tis
		end if
	end repeat
	set text item delimiters to ditd
	return res
end findAndReplace
 
on quitVLC()
	tell application "System Events"
		if exists process VLC then
			try
				quit application "VLC"
			end try
		end if
	end tell
end quitVLC

commenter (0)

18/05/07

ouverture automatique des DVD avec VLC

VLC media player

Mac OS X préférences système - CD et DVD

Comme on peut le lire sur cette page : Mac OS X 10.4 préférences système - CD's et DVD's ; ce réglage a été introduit avec le version 10.2.
Permet de choisir des actions implicites en cas d'introduction d'un CD ou d'un DVD.

Cette application est scriptable : Scriptable Applications: Digital Hub, ce qui signifie qu'au lieu d'ouvrir une application (.app), on peut exécuter un script en AppleScript (.scpt).

A lire aussi : Mac OS X: The Missing Manual, 2nd Edition.

VLC ne peut être lancé et démarrer la lecture du DVD via les Préférences Systèmes comme le fait, par défaut, DVD Player ; il semblerait que la fonction ne soit pas présente dans VLC.

AppleScript pour VLC, préférence DVD et Digital Hub

Sachant, tout ce qui a été dit précédemment, habitué à bricoler de l'AppleScript (comme vous l'aurez sûrement constaté sur ce blog), je me suis décidé à réaliser un script pouvant lancer automatiquement la lecture d'un DVD avec VLC.

Ce qui donne actuellement :

VLC DVD.scpt

(*    
    VLC DVD.scpt
    HP <http://blogosx.jupiterii.com>
 
    updated May. 18, 2007
*)
 
property lastDVD : ""
 
on run
	set VLC to "VLC"
	set isDVD to false
	
	quitVLC()
	
	set testDisks to do shell script "ls /dev/rdisk?"
	set diskNumberMax to (count words of findAndReplace("/dev/", "", testDisks))
	
	set itemsDisks to (count words of testDisks) + 1
	
	set diskList to {}
	set itemNum to 0
	repeat
		try
			copy word itemNum of testDisks to the end of diskList
		end try
		set itemNum to itemNum + 1
		if itemNum = itemsDisks then
			exit repeat
		end if
	end repeat
	
	try
		set lastDVD to (lastDVD / 1)
		try
			set diskString to "/dev/disk" & lastDVD
			detectDVD(diskString)
			if isDVD is true then
				launchDVD()
				set diskNumber to lastDVD
			end if
		end try
	end try
	
	if isDVD is false then
		repeat with i from 1 to the count of diskList
			set this_item to "/dev/" & findAndReplace("rdisk", "disk", (item i of diskList))
			set diskNumber to findAndReplace("/dev/disk", "", this_item)
			try
				if diskNumber is not equal to lastDVD then
					detectDVD(this_item)
					if isDVD is true then
						launchDVD()
						exit repeat
					end if
				end if
			end try
			
			if (isDVD is true) then
				exit repeat
			end if
		end repeat
	end if
	set lastDVD to lastDVD
end run
 
on detectDVD(pathDisk)
	global isDVD, diskNumber
	
	set testDisk to ¬
		do shell script "diskutil info " & pathDisk ¬
			& "|grep -i \" Media Type:\" | awk '{print $3}' | tail -1"
	if testDisk contains "DVD" then
		set isDVD to true
		set lastDVD to diskNumber
	end if
end detectDVD
 
on launchDVD()
	global VLC, diskNumber
	
	tell application "System Events"
		tell process VLC to activate
	end tell
	tell application VLC to open ":dev:rdisk" & diskNumber
	tell application "System Events"
		tell application "VLC" to fullscreen
	end tell
end launchDVD
 
on findAndReplace(tofind, toreplace, TheString)
	set ditd to text item delimiters
	set res to missing value
	set text item delimiters to tofind
	repeat with tis in text items of TheString
		if res is missing value then
			set res to tis
		else
			set res to res & toreplace & tis
		end if
	end repeat
	set text item delimiters to ditd
	return res
end findAndReplace
 
on quitVLC()
	tell application "System Events"
		if exists process "VLC" then
			try
				quit application "VLC"
			end try
		end if
	end tell
end quitVLC

Le script se charge de scruter les disques un à un pour savoir lequel est un DVD, l'exécution de cette partie du script peut être relativement longue dépendamment du nombre de disques montés et de leur volume ; ainsi, une "propriété" (Declaring Variables and Properties) mémorise l'emplacement du disque ayant été reconnu comme étant un DVD lors de la dernière exécution du script ; dans le but de tester l'emplacement de ce disque prioritairement, de cette façon les tests peuvent être accélérés.

Il est recommandé d'utiliser une version 0.8.6b de VLC media player ou supérieure.

Télécharger le script

Télécharger l'archive contenant le script : scptVLC4DVD.zip (±27 Ko).

Utiliser le script

Dans les Préférences Système, dans le menu "A l'insertion d'un DVD vidéo" choisir : "Exécuter le script…" (en cas d'incompréhension, relire le premier paragraphe et suivre les liens hypertextes).

commenter (0)