Wat kan je met OS-X, iTunes, Ruby on Rails en AppleScript?

Door CJ_Latitude op zaterdag 19 november 2011 20:39 - Reacties (6)
Categorie: media center, Views: 5.036

Zoals in de introductie zal ik het een en ander noteren over de verschillende mogelijkheden die je hebt als je zelf software wil maken voor het afspelen van media.

Van veel van de paden die ik heb belopen ben ik uiteindelijk weer afgestapt, om meerdere redenen. Vandaag het pad "Een Ruby on Rails app op OS-X". Primaire reden dat dit voor mij persoonlijk uiteindelijk niet geschikt was:
  • Op OS-X kan je geen BluRay discs afspelen (als in: insert, play, menu gebruiken, the whole package);
  • Het touchscreen wat ik heb verloor steeds zijn kalibratie, wat hem dus praktisch onbruikbaar maakte.
Totdat ik achter deze twee feiten was, heb ik echter wel veel geleerd over AppleScript en iTunes. Vandaag een introductie in deze combinatie.

Disclaimer: omdat dit al enige tijd geleden is, heb ik helaas niet meer de kennis voorhanden om zeer diep op deze mogelijkheden in te gaan. Ik zal proberen een globaal overzicht te geven en genoeg pointers om lezers op weg te helpen

Ruby on Rails en OS-X
Toen ik met het eerste probeersel begon waren er twee zekerheden:
- Het wordt een Ruby on Rails app;
- En zal draaien op OS-X.

Waarom? Ik vind het OS fijn en de taal en het framework ook. Simple as that. Er zijn echter niet veel zekerheden in het leven en achteraf gezien vielen bovenstaande hier dan ook zeker niet onder. Desalniettemin was ik daar in den beginne nog wel van overtuigd en ging enthausiast aan het werk om op deze basis wat moois in elkaar te draaien.

iTunes
Aangezien ik mijn muziekcollectie beheer en afspeel vanuit iTunes en deze applicatie daarom dus al over de benodigde info over de muziekbestanden bevat, leek het mij aardig om deze applicatie dan ook als bron van mijn gegevens te gebruiken.
Daarnaast leek het zelf in Ruby een audio-player maken mij onbegonnen werk en koos ik ook voor het bedienen van iTunes voor het afspelen van de muziek. Op OS-X heb je daar gewoon AppleScript voor. Door middel van osascript calls uit te voeren vanuit een Ruby exec statement kan de output van de AppleScript worden verzameld.
Let wel, op dit punt was Spotify voor mij nog niet in beeld, dus was er nog geen noodzaak om deze streams ook af te kunnen spelen.

Uitlezen en bedienen met AppleScript
Ik was positief verbaasd over de hoeveelheid functies die je op iTunes uit kan voeren met behulp van AS. Van simpele zaken zoals het starten / pauseren van een track:

code:
1
2
3
tell application "iTunes"
    playpause
end tell


naar het achterhalen van de huidige track naam:

code:
1
2
3
tell application "iTunes"
    name of current track
end tell


tot het maken van een playlist van een bepaald album:

code:
1
2
3
4
tell application "iTunes"
  make new playlist with properties {name:"Bran Van 3000 - Discosis"}
  duplicate (every track of library playlist 1 whose album is "Discosis") to playlist "Bran Van 3000 - Discosis"
end tell


Om te bekijken welke functies allemaal mogelijk zijn, kan je in de Script Editor naar Window --> Library gaan en dan iTunes selecteren.

Ene Doug Adams heeft het zijn levenswerk gemaakt om allerlei handige AS voor iTunes te maken en te verzamelen op zijn site: Doug's AppleScripts for iTunes. Hier heb ik veel handige truukjes gevonden.

Om gegevens van alle tracks in de library in te laden, kan je bijvoorbeeld het volgende doen:

code:
1
2
3
tell application "iTunes"
  get {name, artist, persistent ID} of every track in library playlist 1
end tell


Dit levert een array met drie arrays daarin op, met daarin respectievelijk de titels, artiesten en IDs van de tracks:

code:
1
2
3
4
5
{
  {"Hunting High And Low", "Take On Me", ...},
  {"a-ha", "a-ha", ...},
  {"90A37571882FC926", "B774C3835442DD90", ...}
}


De snelheid waarmee dit kan was (in ieder geval op mijn machine en met mijn library-formaat) prima werkbaar.

XML library
Een andere methode is het uitlezen van de XML-versie van de library. @Default staat deze in ~/User/Music/iTunes/iTunes Music Library.xml. De structuur van dit bestand is (gelukkig) self-explanatory. #Protip: als je XML met Ruby wil gaan parsen, gebruik dan Nokogiri en niet de default REXML. Scheelt ook weer een factor 20 in snelheid.

Muziek starten
Eenmaal uitgelezen heb je alle gegevens die je nodig hebt om een track te selecteren en uit te lezen. Dit draait dan voornamelijk om de PersistentID van het track:

code:
1
2
3
tell application "iTunes"
  play (some track of library playlist 1 whose persistent ID is "90A37571882FC926")
end tell


Met de delen die hierboven zijn uitgelegd (en een eigen beetje uitzoekwerk) zou je dus bijvoorbeeld ook een playlist van alle tracks van één album kunnen maken en het eerste nummer van die playlist af gaan spelen, zodat de playback stopt als het album voorbij is.

Zo, dat was een korte introductie in het bedienen van iTunes dmv AppleScript. In het volgende deel: het opvangen van notificaties vanuit iTunes mbv NSNotifications binnen RubyCocoa.

Comments altijd welkom!

Volgende: Ruby & Cocoa: mooi en smakelijk? 01-'12 Ruby & Cocoa: mooi en smakelijk?
Volgende: Zelfbouw Software Media Center : Intro 11-'11 Zelfbouw Software Media Center : Intro

Reacties


Door Tweakers user Gamebuster, zaterdag 19 november 2011 22:12

Nokogiri is erg nice, inderdaad :)

Ook een tijdje mee gewerkt met het parsen van HTML pagina's.

Geinig project verder :) Leuk om te zien dat er ook Rails devs zijn, ik hoor niet veel over Rails op tweakers/GoT :P

[Reactie gewijzigd op zaterdag 19 november 2011 22:12]


Door Tweakers user Wolfos, zaterdag 19 november 2011 22:35

Applescript is echt vaag, het is bijna Engels.

Door Tweakers user kwaakvaak_v2, zondag 20 november 2011 09:47

Wolfos schreef op zaterdag 19 november 2011 @ 22:35:
Applescript is echt vaag, het is bijna Engels.
Dat is ook precies het hele idee erachter. Een krachtige taal voor mensen die niet goed zijn in het schrijven van code, maar wel in staat zijn om via dit soort vragen een script te maken.

Door Tweakers user ZpAz, zondag 20 november 2011 10:42

Wolfos schreef op zaterdag 19 november 2011 @ 22:35:
Applescript is echt vaag, het is bijna Engels.
Het is dan ook gericht om zo makkelijk mogelijk te zijn. Terwijl het zeker best krachtig is. Ook heb je "Automator" daarmee kan je ook heel veel, zonder maar één regel code te schrijven.

Door Tweakers user jurp5, maandag 21 november 2011 12:07

Ik ben toevallig ook bezig geweest met iTunes en Ruby, maar dan niet via applescript, maar via het iTunes remote protocol(DACP). Zodoende werkt het ook op Windows en zelfs over een netwerkverbinding :)

De basisfunctionaliteit zit er in iedergeval in (play pause status ed)
https://github.com/jurriaan/ruby-dacpclient

Door Tweakers user CJ_Latitude, maandag 21 november 2011 12:24

jurp5 schreef op maandag 21 november 2011 @ 12:07:
Ik ben toevallig ook bezig geweest met iTunes en Ruby, maar dan niet via applescript, maar via het iTunes remote protocol(DACP). Zodoende werkt het ook op Windows en zelfs over een netwerkverbinding :)

De basisfunctionaliteit zit er in iedergeval in (play pause status ed)
https://github.com/jurriaan/ruby-dacpclient
Nice, ziet er goed uit! Ik ben nu ook bezig met DACP :) Maar dan de serverkant en in C#, omdat ik nog geen Ruby Spotify library ken die ook daadwerkelijk audio af kan spelen...

De serverkant maken is helaas een stuk complexer dan de clientkant, maar we zijn al aardig op weg. Later in het blog hier meer over ;) (teaserrrrrrrrr)

Blijft mooi om te zien hoeveel eleganter en korter dit soort dingen in Ruby kunnen :)

Reageren is niet meer mogelijk