osascript / applescript / remote iTunes

Code-Stücke können hier veröffentlicht werden.
Antworten
tao
User
Beiträge: 15
Registriert: Sonntag 12. November 2006, 21:34
Wohnort: basel
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import os
import sys
from socket import *

port = 50007
BUFSIZE = 1024
laut = 0
#
def main():
    nummer =0
    s = socket(AF_INET, SOCK_STREAM)
    s.bind(('', port))
    s.listen(1)
    conn, (remotehost, remoteport) = s.accept()
    print 'connected by', remotehost, remoteport
    while 1:
        laut = conn.recv(BUFSIZE)
        if laut == 'a':
            nummer = nummer +10
            if nummer > 100:
                nummer = 100
            os.system("osascript -e 'tell app \"iTunes\" to set sound volume to %i'" % nummer)
        if laut == 'b':
            nummer = nummer -10
            if nummer < 0:
                nummer = 0
            os.system("osascript -e 'tell app \"iTunes\" to set sound volume to %i'" % nummer)
        if laut == 'c':
            os.system("osascript -e 'tell app \"iTunes\" to previous track'")
        if laut == 'd':
            os.system("osascript -e 'tell app \"iTunes\" to next track '")
        if not laut:
            break

main()
kleiner hack um mein itunes von einem anderen rechner zu steuern.
währe mit pyserial auch ganz cool…
BlackJack

Igitt ein Sternchenimport -> über 200 unbenutze Namen importiert.

`laut` auf Modulebene wird nicht benutzt, das `sys`-Modul wird nicht benutzt, einige Zeilen sind länger als 80 Zeichen, ``while True:`` ist deutlicher als ``wile 1:`` und die Namen sind teilweise irreführend.

Hab's mal überarbeitet:

Code: Alles auswählen

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import os
from socket import socket, AF_INET, SOCK_STREAM

PORT = 50007
CALL_PREFIX = 'osascript -e \'tell app "iTunes" to '

def main():
    volume = 0
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind(('', PORT))
    sock.listen(1)
    conn, (remotehost, remoteport) = sock.accept()
    print 'connected by', remotehost, remoteport
    while True:
        command = conn.recv(1)
        if command == 'a':
            volume = max(volume + 10, 100)
            os.system(CALL_PREFIX + "set sound volume to %i'" % volume)
        if command == 'b':
            volume = min(volume - 10, 0)
            os.system(CALL_PREFIX + "set sound volume to %i'" % volume)
        if command == 'c':
            os.system(CALL_PREFIX + "previous track'")
        if command == 'd':
            os.system(CALL_PREFIX + "next track '")
        if not command:
            break


if __name__ == '__main__':
    main()
tao
User
Beiträge: 15
Registriert: Sonntag 12. November 2006, 21:34
Wohnort: basel
Kontaktdaten:

danke BlackJack!

wenn ich deinen code ansehe ist es ein wunder, dass python so nett war meinen auch richtig zu interpretieren. sehe, dass meine struktur schrott ist, aber eben, es war ein kleiner schneller flick --> cool von dir…javascript:emoticon(':D')
BlackJack

Naja, soviel habe ich ja nun auch nicht geändert. Insbesondere die Struktur ist fast identisch. Wenn man die Verändern wollte, dann würde wahrscheinlich eine Klasse dabei herauskommen und die ``if``/``elif``-Abfrage wäre durch ein Dictionary ersetzt, dass die Buchstaben auf entsprechende Methoden abbildet. Wäre flexibler und leichter zu erweitern, für die vier Funktionen aber auch länger als die jetzige Lösung.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich habe mal den Schleifenkörper etwas überarbeitet:

Code: Alles auswählen

commands = dict(
    a="set sound volume to %i'" % max(volume + 10, 100),
    b="set sound volume to %i'" % min(volume - 10, 0),
    c="previous track'",
    d="next track '")

command = conn.recv(1)
if not command or command not in commands:
    break
os.system(CALL_PREFIX + commands[command])
CALL_PREFIX könnte man dann auch direkt durch den String ersetzen, da es nur einmal vorkommt. Auch den system()-Aufruf in eine Funktion mit dem zweiten Teilstring als Argument auszulagern ergibt Sinn.

Idealerweise lagert man das commands-Dictionary aus, damit es nicht immer neu erzeugt werden muss. Einzig für die Übergabe der Lautstärke gilt es sich noch was elegantes zu überlegen.
BlackJack

Nun konnte ich mir eine Lösung mit einer Klasse doch nicht verkneifen. :-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import os
from socket import socket, AF_INET, SOCK_STREAM


class RemoteControl(object):
    def __init__(self, port=50007):
        self.volume = 0
        
        sock = socket(AF_INET, SOCK_STREAM)
        sock.bind(('', port))
        sock.listen(1)
        conn, (remotehost, remoteport) = sock.accept()
        print 'connected by', remotehost, remoteport
        
        commands = dict(a=lambda: self.change_volume(10),
                        b=lambda: self.change_volume(-10),
                        c=lambda: self.change_track('next'),
                        d=lambda: self.change_track('previous'))
        while True:
            command = conn.recv(1)
            if command not in commands:
                break
            commands[command]()
    
    def change_volume(self, amount):
        self.volume = min(0, max(self.volume + amount, 100))
        tell_itunes('set sound volume to %i' % self.volume)
    
    def change_track(self, direction):
        tell_itunes('%s track' % direction)


def tell_itunes(command):
    os.system('osascript -e \'tell app "iTunes" to %s\'' % command)


if __name__ == '__main__':
    RemoteControl()
Antworten