生活自動化的好幫手:Automator -- 刪除音樂檔案的應用
2006/04/23 9:42 pm Changhsin

之前寫了“線上廣播錄製工具 Audio Hijack Pro”一文。只要善用軟體 Audio Hijack Pro ,便可讓電腦定時自動替我們錄製線上廣播節目,並自動傳送到 iTunes 資料庫中,最後還可與 iPod 同步更新,讓我們隨時可將節目帶著走。

該文章的主要目的,便是要達到類似 Podcast 的目的,將目前還未提供 Podcast 的節目,由使用者自行錄製成一個檔案,隨時可以聆聽。然而, Audio Hijack Pro 雖然可以做到“增加聲音檔案”的功能,它卻無法做到“刪除聲音檔案”的功能。任何人只要有使用過 iTunes 內建的 Podcast 功能,都知道 iTunes 內建的功能有提供使用者自動刪除 Podcast 的功能,如此一來, Podcast 的檔案才不會一直累積在硬碟,造成空間的浪費。不過,自行錄製的節目卻無法自動刪除,也就是說使用者還是必須固定時間將這些檔案刪除,否則將愈積愈多。在下之前的拙作並沒有處理這個問題,只寫了如何增加檔案,所以可說是只寫了一半,現在繼續將第二部分補上,如何將聽過的節目自動刪除。

*首先,先列出希望達成的目的:
1)電腦能自動將時間已久,或已聽過的錄製節目刪除。
2) iTunes 中的已刪掉的檔案,其連節也須同時刪除。(歌曲名稱前有驚嘆號)

*需要工具:
1) Automator
2) iCal
3) iTunes 的智慧播放清單(可參考在下過去拙作“超級智慧播放清單”)
4) AppleScript

*操作步驟:

一、先在 iTunes 中設定一個智慧播放清單。目的要找出所有已聽過,而且已超過一週的 BBC 節目。



1) Artist 以及 Genre 兩個欄位是接續之前的設定而來。因本例子是以錄製 BBC 的節目為主,故 Artist 之前設定皆為 BBC World Service ,而 Genre 則是自訂為 Radio Recording。

2)Play Count 設定為“不是零”。如此一來,還沒有聽過的節目,就不會出現在這個清單之中了。假如希望沒有聽過的節目不會被自動刪除,這個設定很重要。

3) Date Added 設定為“不是在過去七天”。只要節目是在這一週內加入,不要出現在這個清單。當然這裡的日期可以由使用者自行決定,假如希望節目保留久一點,也可改設為一個月。

4)最後將這個智慧清單命名為 BBC Radio (for deletion) 。


二、開啟 Automator ,設定一個 Workflow 。目的要將才設定好的智慧清單中的歌曲自動丟到垃圾桶。



1)第一個步驟便是要找出要刪除的歌曲。我們已事先設定好一個智慧清單了,因此我們便可直接指定為該清單。

2)第二個步驟便是將這個歌曲全部送到垃圾桶去。

3)最後將這個 Workflow 存檔,命名為 BBC (for deletion) 。請注意務必是存成一個 Workflow 檔。


三、於 Automator 重新開啟一個新檔。



1)第一個步驟,我們要讓 Automator 先行執行一個 Workflow ,也就是我們剛才設好那個 Workflow 。這個 Workflow 的主要目的是要將歌曲丟到垃圾桶中。然而在這裡有個問題必須處理,因為 iTunes 太聰明了,就算我們將歌曲檔案移動位置到垃圾桶了,它還是可以找得到。所以這些看似已被丟及垃圾桶的檔案,事實上還是存在於硬碟之中,而且運作地非常良好。

2)所以在第二個步驟,我們要讓 Automator 執行一個 AppleScript ,將垃圾桶立即清空,如此一來這些檔案才算是完全被清掉了。底下茲將 AppleScript 列出,直接貼上就可以使用了。

tell application "Finder"
empty the trash
beep
end tell

3)第三個步驟也是要執行一個 AppleScript ,該 AppleScript 的目的則是要將 iTunes 中已不存在檔案的歌曲名稱刪除,即那些歌曲前有驚嘆號的。這個 AppleScript 的內容可以參考 Doug's AppleScripts for iTunes 的 Super Remove Dead Track 。底下茲將內容列出,直接貼上就可使用。在下有修改部分程式碼,主要是將該 AppleScript 一開始執行時會跳出的一個對話框刪除,以使整個流程不受中斷。

property progress_factor : 500

tell application "iTunes"
    
    set mainLibrary to library playlist 1
    set totalTracks to count of file tracks of mainLibrary
    set all_playlists to user playlists whose smart is false -- don't delete Smart Playlists later
    
    set deleted_tracks to 0
    set all_checked_tracks to 0
    set countem to ""
    
    set oldfi to fixed indexing
    set fixed indexing to true
    
    repeat with t from totalTracks to 1 by -1
        
        try
            set this_track to file track t of mainLibrary
            
            if this_track's location is missing value then
                delete this_track
                set deleted_tracks to deleted_tracks + 1
            end if
            
            set all_checked_tracks to all_checked_tracks + 1
            
            if frontmost then
                if (progress_factor is not 0) and (all_checked_tracks mod progress_factor) is 0 then
                    if deleted_tracks is greater than 0 then ?
                        set countem to (deleted_tracks & " dead tracks removed so far...")
                    if frontmost is true then display dialog (all_checked_tracks as string) & ?
                        " tracks checked..." & ?
                        return & countem buttons {《data utxt266B》} giving up after 1
                end if
            end if
        end try
        
    end repeat
    
    set fixed indexing to oldfi
    
    repeat with this_playlist in all_playlists
        if (get count of tracks of this_playlist) is 0 then
            try
                delete playlist this_playlist
            end try
        end if
    end repeat
    
    if deleted_tracks is greater than 0 then
        set ps to " was"
        if deleted_tracks is not 1 then set ps to "s were"
        display dialog "Finished removing \"dead\" tracks." & return & ?
            deleted_tracks & " track" & ps & ?
            " removed." buttons {"Thanks"} default button 1 with icon 1
    else
        if gave up of (display dialog "It was not necessary to remove any tracks." buttons {"Thanks"} ?
            default button 1 with icon 1 giving up after 15) is true then error number -128
    end if
    
end tell


4)最後將這整個過程存檔為一個 Application ,同樣命名為 BBC (for deletion)。這時直接雙擊這個小機器人便可以達到我們刪除舊節目檔案的目的了。不過為求完美,我們將使用 iCal 再做進一步的設定。



四、開啟 iCal,新增一個事件,命名為 BBC (for deletion) 。



1)我希望每一週都能自動作一次清理舊節目檔案的動作,所以在 repeat 這裡設定為 every week , end 則設定為 Never ,要電腦一直作下去永遠不停。

2)第二個步驟則是重點,設定 alarm 為開啟一個檔案,而這個檔案就是我們剛才在 Automator 中做好的程式: BBC (for deletion) 。



到這裡已大功告成,電腦已會自動錄製節目,而且還會自動將舊節目檔案刪除了!




編按】本文原刊登於老地方冰果室交流區,後經作者同意,轉以制式的老地方冰果室特別報導格式刊出。歡迎大家就此主題進行延伸討論