Titel automatisch aus int.Playlist in normale Playlist kopieren in iTunes

G

goeste

Mitglied
Thread Starter
Dabei seit
27.04.2008
Beiträge
26
Reaktionspunkte
0
Ich wollte wissen, ob es ein skript gibt, welches nach dem anschliessen eines iPods (wird mit Automator realisiert siehe unten), Titel einer intelligenten Wiedergabeliste in eine gleichnamige normal Playliste kopiert und diese vorher löscht oder leert.

Hintergrund ist folgender:
Die int. WL holt sich die Lieder aus 3 anderen int. WL. da ich für int. WL eine Source (meine Bibliothek) brauche, und die wesentlich größer ist als mein iPod (Nano 8GB), holt sich die zu kopierende int. WL (begrenzt auf 7GB) eine Auswahl aus den zuvor erwähnten 3 int. WL.

Hier nocheinmal schematisch veranschaulicht:

  • Bibliothek -> int.WL1 (alle Titel eines bestimmten Genres)
  • int.WL1 -> int.WL2 (alle Titel nicht gespielt innerhalb der letzten 2 Monate aus int.WL1)
  • int.WL1 -> int.WL3 (alle Titel mit Wertung zwischen 3 und 5 Sternen aus int.WL1)
  • int.WL1 -> int.WL4 (alle Titel die weniger als 2x gespielt wurden aus int.WL1)
  • int.WL2 + int.WL3 + int.WL4 -> int.WL5 (begrenzt auf 7 GB, Auswahl aus int.WL2, int.WL3 und int.WL4)

Realisieren würde ich das ganze mit Automator und der 'Check for Disk-Aktion', dass das Skript nur dann ausgeführt wird, wenn der iPod an den rechner angeschlossen ist. Der iPod aktualisiert sich deswegen NICHT automatisch und nur bestimmte Wiedergabelisten.

Ich würde mich über jeden hilfreichen Hinweis sehr freuen. Danke auch schonmal im voraus.

goeste
 
Hat keiner mehr eine Idee?
Ich habe ja schon etwas ähliches gefunden:


Aber nun möchte ich gerne, dass das Skript eine int.WL aus dem Automator übernimmt und die neu erstellte WL eben NICHT direkt auf den iPod schriebt, sondern in die iTunes Bibliothek. Desweiteren soll evt. überprüft werden, ob die zu erstellende WL schon existiert und wenn ja, dann soll die gelöscht oder geleert werden.

Ich wäre wirklich sehr dankbar für jeden kleinen Denkanstoß, da ich nicht wirklich fit bin in AS...

Danke an alle die mir weiterhelfen ;)

goeste
 
Hallo,

wie sieht Dein bisheriges Skript aus? Wenn Du uns Deine Problemstellen aufzeigst, dann ist es einfacher Dir zu helfen.

Viele Grüße
 
Skript habe ich keins, nur eben einen Automatorablauf. Ich hänge gleich mal ein Screenshot mit dran, damit man genau sehen kann was ich vorhabe ;)

Hier sind die Screenshots:
bild1bj6.png

bild2xi5.png


Nochmal ein bischen, ich hoffe, genauer erklärt:
Das skript soll Folgendes machen können:

Prüfe ob Wiedergabeliste mit Namen von Quell-int.Wiedergabeliste existiert
_____Wenn ja,
__________dann leere Wiedergabeliste oder lösche Wiedergabeliste und erstelle Wiedergabeliste mit Namen von Quell-int.Wiedergabeliste
__________sonst Wiedergabeliste mit Namen von Quell-int.Wiedergabeliste erstellen
_____ende wenn.
Befüllen der soeben erstellten Wiedergabeliste mit den Titeln der Quell-int.Wiedergabeliste

Wenn möglcih soll das Skript dies für alle int.Wiedergabeliste wiederholen, die mit 'Station - ' beginnen.
 
Zuletzt bearbeitet:
UPDATE

Mit Hilfe des oben genannten Scripts kann ich nun schon manuell (d.h. mit manueller Auswahl der int.WL) eine WL mit dem Inhalt einer ausgewählten int.WL erstellen.

Soweit so gut. Nun fehlt mir nur noch 2 Kleinigkeiten ;)
  1. die Abfrage, ob bereits eine WL mit dem Namen der ausgewählten int.Wl existiert, und diese gegebenenfalls leert bzw löscht.
  2. eine Routine, die die manuelle Auswahl überflüssig macht, in dem das Skript nur int.WL kopiert, die mit 'Station - ' beginnt.

Anbei der Code für meine bisherige Lösung, bei der jedoch noch die manuelle Auswahl der zu kopierenden int.WL und keine Abfrage drin ist.


Code:
just updated... see below


UPDATE 2

nun habe ich die Abfrage des genannten Skripst abgeändert aber bekomme immer eine Fehlermeldung...

Hier der neue code:

Code:
updated...see below

und hier die Fehlermeldung:
bild1pq4.png
 
Zuletzt bearbeitet:
Hallo,

gut gut...
Ich antworte nur noch, wenn etwas Eigenes da ist ;-)

Existenz einer Wiedergabeliste prüfen und gegebenenfalls leeren:

Code:
on _start(txtListName, cListeLeeren)
	tell application "iTunes"
		-- Wiedergabelist erstellen bzw. leeren
		if not (exists playlist txtListName) then
			make new playlist with properties {name:txtListName}
		else if (cListeLeeren is true) then
			delete (every track of playlist txtListName)
		end if
	end tell
end _start

Alle Wiedergabelisten, die vom Typ "intelligent" sind und einen bestimmten String enthalten:

Code:
on holeListen(txt, pTyp)
	tell application "iTunes" to return (every user playlist whose smart is pTyp and name contains txt)
end holeListen

Aber Achtung, es könnten auch mehrere Listen im Ergebnis sein!

Viele Grüße
 
Aber Achtung, es könnten auch mehrere Listen im Ergebnis sein!

Genau das ist mein Ziel. Das Sript soll solange laufen und alle int.WL kopieren, die mit 'Station - ' beginnen.

Code update
Code:
updated...se below

Mein Problem ist nun, dass ich nicht weiss, wie ich deine WL-Abfrage so einbaue, dass das Skript für jede WL die dem Schema entspricht durchläuft.
 
Zuletzt bearbeitet:
inwiefern muss ich cListeleeren anwenden bei der Abfrage? Bzw. als was soll ich das definieren? ich komme da leider mit meinem try&error Wissen nicht wirklich weiter....
 
ICH HABS!!!

Code:
tell application "iTunes"
	-- playlist auswählen die kopiert werden soll
	set copy_smartlist to name of every user playlist whose smart is true and name contains "Station - " -- nur bestimmte playlisten
	set name_of_smartlist to (choose from list copy_smartlist with prompt "Wähle eine Wiedergabeliste..." without multiple selections allowed) as string
	if name_of_smartlist is "false" then error number -128
	set source_smartlist to some user playlist whose smart is true and name is name_of_smartlist
	
	
	-- abfrage ob playlist schon existiert, dann erstellen bzw. leeren
	if (exists (some user playlist whose name is name_of_smartlist and smart is false)) then
		set new_playlist to (some user playlist whose name is name_of_smartlist and smart is false)
		delete new_playlist
	end if
	
	
	-- kopiere tracks von smartlist zu normaler playlist
	set new_playlist to (make new playlist at library with properties {name:name_of_smartlist})
	set source_tracks to (get a reference to file tracks of source_smartlist)
	repeat with i from 1 to count file tracks of source_smartlist
		try
			duplicate file track i of source_smartlist to new_playlist
		end try
	end repeat
end tell

Es funktioniert (zwar noch immer mit manueller Auswahl, aber immerhin;)

Nun fehlt nur noch, dass das Ganze automatisch für alle int.WL gemacht wird, die einen bestimmten String im Namen haben.

Vielen dan nochmals an little_pixel :) leider konnte ich nicht wirklich was mit deinen Beispielen anfangen (theoretisch schon, aber in der Praxis hat der mir immer neue WL erstellt, selbst wenn schon eine mit dem selben Namen existierte...).
Vielleicht kannst du mir noch mit deinem zweiten Beispiel bei der Schleife helfen, dam die manuelle Auswahl - endlich - wegfallen kann ;)
 
Hallo,

ich würde Dir davon abraten die Wiedergabeliste gleich zu benennen.

Code:
property derName : "Station - "
property pref : "_"

my ToDo()

on ToDo()
	
	tell application "iTunes"
		
		-- Wiedergabelisten holen, die mit gewüschten Namen beginnen
		set alleListen to my holeListen(derName, true)
		
		-- prüfen, ob ein Suchergebnis voliegt
		if (alleListen is {}) then
			display alert "Achtung" as warning message "Es gibt keine Wiedergabelisten, die mit \"" & derName & "\" beginnen."
		else
			
			-- alle gefundene Wiedergabelisten durchlaufen
			repeat with nListe in alleListen
				
				-- Wiedergabeliste anlegen, falls vorhanden leeren
				my _start(pref & nListe, true)
				
				-- alle Daten holen
				set sel to every track of playlist nListe
				
				-- alle Titel zur normalen Wiedergabeliste verschieben
				repeat with nTrack in sel
					duplicate nTrack to playlist (pref & nListe)
				end repeat
				
			end repeat
			
		end if
		
	end tell
end ToDo


-- Wiedergabeliste leeren bzw. neu anlegen
on _start(txtListName, cListeLeeren)
	tell application "iTunes"
		-- Wiedergabelist erstellen bzw. leeren
		if not (exists playlist txtListName) then
			make new playlist with properties {name:txtListName}
		else if (cListeLeeren is true) then
			delete (every track of playlist txtListName)
		end if
	end tell
end _start


-- alle Wiedergabelisten zurückgeben
on holeListen(txt, pTyp)
	tell application "iTunes" to return ((name of every user playlist whose smart is pTyp and name begins with txt) as list)
end holeListen

Du mußt in der Schleife, die die Titel verschiebt noch ein TRY-ERROR Block hinterlegen ;-)

Viele Grüße
 
Hallo little_pixel,

das mit den Namen hat schon so seinen Grund :) Aber trotzdem.

so sieht meine Variante nun aus :
Code:
tell application "iTunes"
	-- alle smartlisten abfragen
	set smartlists to name of every user playlist whose smart is true and name contains "Station -"
	repeat with i from 1 to (count every item of smartlists)
		set name_of_smartlist to item i of smartlists
		set source_smartlist to (some user playlist whose smart is true and name is name_of_smartlist)
		-- abfrage ob playlist schon existiert, dann erstellen bzw. leeren
		if (exists (some user playlist whose name is name_of_smartlist and smart is false)) then
			set new_playlist to (some user playlist whose name is name_of_smartlist and smart is false)
			delete (every track of new_playlist)
		end if
		-- kopiere tracks von smartlist zu normaler playlist
		set source_tracks to (get a reference to file tracks of source_smartlist)
		repeat with i from 1 to count file tracks of source_smartlist
			try
				duplicate file track i of source_smartlist to new_playlist
			end try
		end repeat
	end repeat
end tell

gibt es bei deiner Version irgendwelche Vor-/Nachteile in Sachen Geschwindigkeit? Die hat wesentlich weniger Text, aber mehr Zeilen oder sehe ich das Falsch? BTW ist es sinnvoller mit Teilprogramme (on...end) zu Arbeiten? Wenn ja, wieso? Ok. das wars erstmal mit Fragen. Ich wrde mich freuen, wen du mir ein kleines bischen weiterhelfenkönntest. In diesem Sinne, VIELEN DANK!!!

Thema erledigt ;)

euer goeste
 
Zurück
Oben Unten