1

以前に次の形式のテキスト ファイルにバックアップした iTunes プレイリストがあります。

「タイトル」「アーティスト」「曲番」「アルバム」

次の 4 つのトラックを使用してサンプル ファイルを作成しました。

「Ritual」、「Chick Corea Elektric Band II」、「9」、「Paint The World」
、「Risk」、「Deftones」、「9」、「Diamond Eyes」
、「Risveglio」、「Goblin」、「10」、」ゾンビ」
「リチュアル」「アッシュズ・ディバイド」「8」「自分に言い聞かせ続けて大丈夫」

このプレイリストのすべてのトラックは、現在 iTunes にあります。AppleScript を使用して、これらの各トラックをプレイリストに追加したいと考えています。次のAppleScriptを使用して、単一のアイテム(例:タイトル)でそれを行うことができました:

-- set variables
set srcFile to "/Users/kjesso/Documents/=Scripting=/AppleScript/ipod_gym_playlist_track_names_sample.txt"
set allRecords to paragraphs of (read srcFile as «class utf8»)
set myPlaylist to "Test"
property okflag : false

-- check if iTunes is running
tell application "Finder"
    if (get name of every process) contains "iTunes" then ¬
        set okflag to true
end tell
if okflag then
    -- if iTunes is running then do this
    tell application "iTunes"
        repeat with aRecord in allRecords
            set results to (every file track of playlist "Library" whose name is aRecord)
            repeat with aTrack in results
                duplicate aTrack to playlist myPlaylist
            end repeat
        end repeat
    end tell
else
    -- if iTunes is not running do this
    return "Unable to execute because iTunes is not running"
end if

ただし、別のアーティストの重複したトラック タイトルが見つかった場合、スクリプトはコンテンツとして「タイトル」だけでは異なるアーティストを区別できないため、最初のトラックのみが取得されます。配列は AppleScript にネイティブに存在しますか?

これはプロパティ リスト ファイルで行う必要があると思いますか? オンラインでさらに読んで、私が望んでいたことを行うための配列を作成しようとすると(トラックのタイトル、アーティスト、アルバムなどをキャプチャする)、プロパティリストを使用する方が良いというこのようなさまざまなスレッドに出くわしました? ここで行われたことと同様のことを達成しようとしていますが、出力を CSV ファイルに送信する代わりに、iTunes のプレイリストに送信したいと考えています。

目標を達成するためにプロパティ リストを使用する必要がある場合は、次のサンプル プロパティ リスト ファイルを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>title</key>
    <string>"Ritual"</string>
    <key>artist</key>
    <string>"Chick Corea Elektric Band II"</string>
    <key>album</key>
    <string>"Paint The World"</string>
</dict>
<dict>
    <key>title</key>
    <string>"Risk"</string>
    <key>artist</key>
    <string>"Deftones"</string>
    <key>album</key>
    <string>"Diamond Eyes"</string>
</dict>
<dict>
    <key>title</key>
    <string>"Risveglio"</string>
    <key>artist</key>
    <string>"Goblin"</string>
    <key>album</key>
    <string>"Zombi"</string>
</dict>
<dict>
    <key>title</key>
    <string>"Ritual"</string>
    <key>artist</key>
    <string>"Ashes Divide"</string>
    <key>album</key>
    <string>"Keep Telling Myself It's Alright"</string>
</dict>
</plist>

これを機能させる方法について誰かアイデアがありますか?

4

3 に答える 3

1

名前だけでなく、アーティスト、アルバムにも基づいて選択したい場合は、次の例のようにフィルターを追加するだけです。

また、iTunes が開いているかどうかを確認する必要がない場合もあります。スクリプトが実行されるとき、iTunes が起動されていない場合、スクリプトは iTunes を直接起動します。したがって、iTunes を自動的に開きたくない場合を除いて、何もしないでください。

通常、特定のプレイリスト「ライブラリ」を参照する必要はありません。これがデフォルト値です。

set myPlaylist to "Test"
set {theTitle, theAlbum, theArtist} to {"Ritual", "Paint The World", "Chick Corea Elektric Band II"}

tell application "iTunes"
set myTracks to (tracks whose (name is theTitle) and (album is theAlbum) and (artist is theArtist))
duplicate (item 1 of myTracks) to playlist myPlaylist
end tell

タイトル、アルバム、アーティストに一致するトラックは 1 つだけであると仮定しました (次に、これを最初に見つけた唯一のアイテムとしました)。十分かどうかわからない場合は、フィルターに別のもの (年、期間など) を追加できます。

plist、テキスト ファイル、またはレコードのリストについては、ファイルの書き込みと読み取りに同じ方法を使用することが重要であることに注意してください。したがって、正しい質問は次のとおりです。そのファイルをどのように作成していますか? (手動ではないと思います!)

別のスクリプトからファイルを作成している場合は、レコードを保存して読み取る方がはるかに簡単です (1 つのレコード ={title,album,artist} )。スクリプトを読み書きする以外に何もする必要はありません。唯一のマイナス点は、テキスト エディターでファイルを読み取ることができないということです...しかし、それは必要ですか?

以下の例では、スクリプトは txt ファイルから読み取られ (例と同じ)、1 行に 1 トラック、各値は ',' で区切られています。

set textFile to choose file "Select your text file"
set myText to (paragraphs of (read textFile))
set AppleScript's text item delimiters to {","}
set myRecords to {}
repeat with aParagraph in myText
set MS to aParagraph as string
if (count of (text items of MS)) is 4 then
    set the end of myRecords to {text item 1 of MS, text item 2 of MS, text item 3 of MS, text item 4 of MS}
else
    -- skipt the record : invalid number of text item !
end if
end repeat

結果は myRecords のリストで、各レコードは 4 つの値 {title、artist、trackNo、album} のリストです。

于 2016-09-11T07:12:03.597 に答える
0

この投稿の助けを借りて、1次元配列(リスト)を使用して自分で解決策を見つけることになりました。最終結果は次のとおりです。

set srcFile to "/Users/kjesso/Documents/=Scripting=/AppleScript/ipod_mp3s_sample.csv"
set allRecords to paragraphs of (read srcFile as «class utf8»)
set myPlaylist to "Test"

tell application "iTunes"
    repeat with aRecord in allRecords
        set AppleScript's text item delimiters to ","
        set arrayVar to text items of aRecord
        set results to (every file track of playlist "Library" whose name is (item 1 of arrayVar) and artist is (item 2 of arrayVar) and track number is (item 3 of arrayVar) and album is (item 4 of arrayVar))
        repeat with aTrack in results
            duplicate aTrack to playlist myPlaylist
        end repeat
    end repeat
end tell

ソースファイル「ipod_mp3s_sample.csv」の内容は次のとおりです。

Ritual,Ashes Divide,8,Keep Telling Myself It's Alright
Ritual,Chick Corea Elektric Band II,9,Paint The World
Risk,Deftones,9,Diamond Eyes
Risveglio,Goblin,10,Zombi
于 2016-09-11T09:32:49.750 に答える
0

これは、Track / Artist TAB で区切られた CSV ファイルを取得する、私が作成したスクリプトです。Spotify で見つけたプレイリストから自分の iTunes ライブラリを検索するために使用しました。
Spotify プレイリストを CSV にエクスポートするオンライン エクスポーターを使用しました。まず、Excel でプレイリストをクリーンアップする必要がありました。

これにより、別のログ ファイルも作成されます。

1) 見つかったトラックのうち
2) 見つからなかったトラック
(私が持っている別のスクリプトにこのリストを使用し
、soulSeek でそれらの曲を検索します)

コードは次のとおりです。

-- Choose a file
set CSVstr to "Please locate your CSV file..."
set CSV_File to (choose file with prompt CSVstr) as text
set posixfilepath to (the POSIX path of CSV_File)
set posixfilepathLIST to emptylist(stringtolist(posixfilepath, "/"))
--set thename to item 1 of stringtolist(last item of posixfilepathLIST, ".")
set thename to (ListToString((reverse of (rest of (reverse of (stringtolist(last item of posixfilepathLIST, "."))))), "."))
set posixfilepathLISTCLEANED to reverse of (rest of (reverse of posixfilepathLIST))
set posixfilepathSTRINGCLEANED to ListToString(posixfilepathLISTCLEANED, ":")

--creates log file
set log_file_found to posixfilepathSTRINGCLEANED & ":" & (thename) & "_Matched_in_iTunes.txt"
global log_file_found
ClearLog(log_file_found)
WriteLog("Program Started....")
set log_file_notfound to posixfilepathSTRINGCLEANED & ":" & (thename) & "_NotFound_in_iTunes.txt"
global log_file_notfound
ClearLog(log_file_notfound)
WriteLog2("Program Started....")
property dialog_timeout : 3 -- set the amount of time before dialogs auto-answer.

-- Reading your file to memory
set CSV_Lines to every paragraph of (read file CSV_File from 1)
set AppleScript's text item delimiters to {""}
set Line_Values to {}
set {tids, text item delimiters} to {text item delimiters, "    "}
set trackCount to (count CSV_Lines)
set foundCount to 0
set NotfoundCount to 0
set gov to 1


tell application "iTunes"
    try
        set opt to (display dialog "Enter Name for Playlist" default answer {thename} default button 2 with title " Spotify Recreate from CSV " with icon 1)
        set newName to (text returned of opt)
        set maxfind to (button returned of opt)
        if newName is "" then error
    on error
        return
    end try

    try
        set newnom to ("_WrangledFrom_" & newName)
        if exists playlist newnom then delete playlist newnom
        set newP to (make new playlist with properties {name:newnom})
        set thePlaylist to view of the front browser window
        set view of front window to newP
        set listOfNames to {}
        set listOfNamesNotFound to {}
    end try
end tell



-- moves through the list one item at a time
repeat with i from 1 to trackCount
    set savedTIDS to AppleScript's text item delimiters
    set searchName to text item 1 of item i of CSV_Lines
    set searchArtist to text item 2 of item i of CSV_Lines
    set searchAll to (searchName & " - " & searchArtist) as text
    set searchAll2 to (searchName & " " & searchArtist) as text
    set tid to AppleScript's text item delimiters

    #insert routine here:
    tell application "iTunes"


        --ignoring diacriticals and punctuation
        --set big_list to (every file track whose name contains {searchName} and artist contains {searchArtist})
        --set big_list to (every file track of playlist "Library" whose name contains searchName and artist contains searchArtist)
        set big_list to (search library playlist 1 for {searchAll2} only songs)
        --set search_results to (search library playlist 1 for searchAll2)
        --set results to (every file track of playlist "Library" whose name contains searchName and artist contains searchArtist)
        --end ignoring

        set foundtracks to (count of items of big_list)
        if (count of items of big_list) is greater than or equal to gov then
            set foundCount to foundCount + 1
            set foundtrackinfo to ("Found " & foundtracks & " For | " & searchAll)
            delay 0.2
            my WriteLog(foundtrackinfo)
            copy foundtrackinfo to the end of listOfNames

            repeat with a in big_list
                duplicate a to newP
            end repeat
        else
            set NotfoundCount to NotfoundCount + 1
            set foundtrackinfo to ("Not Found | " & searchAll) as text
            delay 0.1
            my WriteLog2(foundtrackinfo)
            copy foundtrackinfo to the end of listOfNamesNotFound
        end if
    end tell
end repeat
delay 2
tell application "iTunes"
    set view of front window to newP
end tell
delay 2
try
    tell application "System Events"
        tell process "iTunes"
            set frontmost to true
        end tell

        keystroke "a" using {control down, option down, command down}
        delay 1
        keystroke "a" using {option down, command down}
        delay 1
    end tell
end try

set AppleScript's text item delimiters to savedTIDS
set AppleScript's text item delimiters to {""}

display dialog ("Spotify CSV Wrangle Complete") buttons {"OK"} default button 1
my WriteLog("Program Ended...")
my WriteLog2("Program Ended...")

on WriteLog(text4Log)
    set wri to open for access file log_file_found with write permission
    write (text4Log & return) to wri starting at eof
    close access wri
end WriteLog

on WriteLog2(text4Log)
    set wri to open for access file log_file_notfound with write permission
    write (text4Log & return) to wri starting at eof
    close access wri
end WriteLog2

on ClearLog(clear_log_file)
    set clearLF to open for access file clear_log_file with write permission
    set eof of clearLF to 0
    close access clearLF
end ClearLog (*
    --Progress Bar Subroutine

    --my SetupProgress([[linked-template:text]], 0, "Processing Data...", "Preparing to process.")

    on SetupProgress(SPTotalCount, SPCompletedSteps, SPDescription, SPAdditionalDescription)
        set progress total steps to {SPTotalCount}
        set progress completed steps to {SPCompletedSteps}
        set progress description to {SPDescription}
        set progress additional description to {SPAdditionalDescription}
    end SetupProgress

*)

on emptylist(klist)
    set nlist to {}
    set dataLength to length of klist
    repeat with i from 1 to dataLength
        if item i of klist is not "" then
            set end of nlist to (item i of klist)
        end if
    end repeat
    return nlist
end emptylist

on ListToString(theList, delim)
    set oldelim to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delim
    set alist to theList as string
    set AppleScript's text item delimiters to oldelim
    return alist
end ListToString

on stringtolist(theString, delim)
    set oldelim to AppleScript's text item delimiters
    set AppleScript's text item delimiters to delim
    set dlist to (every text item of theString)
    set AppleScript's text item delimiters to oldelim
    return dlist
end stringtolist
于 2018-05-22T09:58:07.420 に答える