2014-12-11 3 views
0

iTunes 용 복잡한 AppleScript로 작업하십시오. 한 가지 작업은 주어진 트랙이 포함 된 모든 재생 목록의 목록을 누적하는 것입니다. 나는이 트랙 객체를 다른 곳에서 가지고있다. 이것은 작동하지만 비용 (반환 한)는 루프에서 재생 목록 당 하나의 애플 이벤트가 필요하며 중간 결과를 멀리 던져iTunes AppleScript : 특정 트랙이 포함 된 모든 재생 목록을 쿼리하십시오.

on containingPlaylists(theTrack) 
    tell application "iTunes" 
     set librarySource to the source named "Library" 
     set candidateLists to every user playlist in librarySource 
     set candidateId to (get id of theTrack) 
     set matchLists to {} 
     repeat with candidateList in candidateLists 
       set matchTracks to (file tracks in candidateList whose id = candidateId) 
       if (count of matchTracks) > 0 then 
         copy candidateList to end of matchLists 
       end if 
     end repeat 
     return matchLists 
    end tell 
end containingPlaylists 

:

현재,이 같은 조각 뭔가있어. 내가 오히려 할 줄 것은 모두 하나 개의 쿼리에 뭔가 :

set matchLists to every playlist in librarySource whose file tracks contain theTrack 

그러나 물론이 작동하지 않습니다 (". 핸들러는 하나의 개체를 처리하는"특정 오류는하지만 그 통찰력입니다 있는지 확실하지 않습니다). 언어/응용 프로그램이 이와 같은 쿼리를 지원하는지 잘 모르겠습니다.

아무도 통찰력을 확인/거부 할 수 있습니까? 감사!

+0

한 줄 쿼리의 논리가 잘못되었습니다 : 두 개의 트랙 참조 데이터가 동일한 지 확인하려면'데이터베이스 ID는 '이어야합니다. 구조적으로는 괜찮습니다. 아이튠즈 스크립팅 모델은 오래되고 끈적 끈적하고 좀 더 복잡한 쿼리를 다루는 데 쓰레기 같은 점이있다. 그래도 나는 수십 개의 AE를 보내는 것에 대해별로 걱정하지 않을 것이다. AE 간접비가 무는 수천을 보낼 때입니다.트랙 레퍼런스 목록이 필요 없다면'get' 대신'exists'를 사용하여 작업량을 줄이거 나 대용량 라이브러리 (50K + 트랙)에서 쿼리를 해결할 때 iTunes의 성능이 항상 커집니다. – foo

+0

@foo : 감사합니다. 그러한 쿼리를 작성하도록 도와 줄 수 있습니까? (단순히 "데이터베이스 ID of theTrack"을 대체하면이 경우 동일한 문제가 있습니다.) 트랙을 포함하는 재생 목록의 목록으로 결과를 찾고 있습니다 (트랙 참조가 필요 없으며 목록 참조 만 필요) . AE 오버 헤드가 큰 일이 될 거대한 배치 작업을 구축하고 있습니다. 가능하면이 작업을 피하는 것이 기쁠 것입니다. 다시 한 번 감사드립니다! –

+1

나는 시도했다, 그러나 iTunes는 매번 밖으로 배변한다; 내가 말했듯이 다중 항목 지정자를 해결할 수있는 능력이 떨어집니다. AE로드를 최소화하기 위해 모든 트랙의 데이터 ID와이를 포함하는 재생 목록의 ID를 제공하는'tell app "iTunes를 사용하여"모든 트랙의 컨테이너 ID "를 얻을 수 있습니다. NS [Counted] Set 마법을 사용하여 중복 된 데이터베이스 ID를 효율적으로 압축하고 NSDictionary를 사용하여 재생 목록 ID에 매핑 한 다음 중복 NSID를 제거하고 마지막으로 새로운 '재생 목록 ID '참조를 작성합니다. 남은 것. – foo

답변

2

당신은 (아이튠즈 11, 12 일)이 사용할 수 있습니다. 항목] : 트랙 내의 예술 작품 | 요소 : 트랙에 의해 포함됩니다. 그래서 artworks of thisTrack 작품

트랙 n [inh. 항목] : 재생 가능한 오디오 소스 | 요소 : 아트웍을 포함합니다. 재생 목록에 있습니다.

@interface iTunesTrack : 그래서 playlists of thisTrack 작품, 당신은 iTunes.h (ObjC 스크립트 다리)에서 user playlists of thisTrack

을 사용할 수 있습니다 iTunesItem - (SBElementArray *) 작품; 재생 목록이 SBElementArray의 목록에 없으므로 불가능합니다.

그러나 AppleScript 사전과 iTunes.h 파일의 차이점은 무엇인지 알 수 없습니다.

+0

환상적입니다. 고마워요! 이것은 사전에있는 것처럼 보이지 않습니다 - 인터페이스에서 체계적으로 자극하는 유용하고 공유 가능한 방식을 통해 이것을 발견 했습니까? (사전에 없기 때문에 ObjC 스크립팅 브리지를 통해 접근 할 수 없거나 할 수 있다고 생각하지 않습니다. 어딘가에 사전 파일이 있습니까?) –

+0

내 대답이 업데이트되었습니다. – jackjr300

1

나도 그와 같은 절을 쓰고 싶습니다. 그러나 슬프게도. (이 가장 효율적일 수 있습니다) 다른 사람이 더 나은 계획을 가지고 올 수도 있지만, 나는 이것이 내가 선택한 트랙을 포함하는 재생 목록을 찾을 것이라고 어떻게 확신 :

set persisID to persistent ID of selection 
set pp to playlists 
set playListsWithIt to {} 
repeat with p in pp 
    set tt to (tracks of p whose persistent ID is persisID) 
    if tt ≠ {} then set playListsWithIt to (playListsWithIt & (id of p)) 
end repeat 

는 그럼 그 ID를 사용할 수 있습니다 다음 단계를 위해. 여기에는 물론 "최근 추가됨"과 같은 재생 목록이 포함되며, 이는 사용자가 원하는 것 일 수도 있고 아닐 수도 있습니다. 그러한 결과를 '걸러 내려면'다른 단계를 거쳐야합니다.

작품 N [INH : - AppleScript를 사전에

업데이트

tell application "iTunes" 
    set theTrack to item 1 of (get selection) 
    return user playlists of theTrack 
end tell 

:

+1

감사합니다. 이것은 동일한 실행 개요 인 것처럼 보입니다. 재생 목록 수가 O (n) 왕복입니다. 내가 알지 못하는 구문에서 몇 가지 트릭을 훔칩니다. –

+2

참고 : iTunes 라이브러리의 모든 단일 트랙 객체에 고유 한 식별자를 사용하여 라이브러리의 수명 동안 절대 변경하지 않으려면 '영구 ID'를 사용하십시오. 동일한 트랙을 가리키는 트랙 오브젝트를 찾으려면 '데이터베이스 ID'를 사용하십시오. 새로운 by-ID 참조를 구성하는 데 사용할 수있는 항목이 필요한 경우 'id'를 사용하십시오. '재생 목록 ID '. – foo

+0

또한 repeat 루프가'if exists (데이터베이스 ID가 dbID 인 p의 트랙)를 사용하도록 설정 한 다음 playListsWithIt의 끝을 (id of p)'로 설정하십시오. 그것은 훨씬 더 효율적이어야합니다. 결과 목록에 중복 재생 목록 ID를 포함시키지 않으려면 조건부 테스트에'p와 id가 playListsWithIt에 없습니다 '를 추가하십시오. – foo