65.9K
CodeProject 正在变化。 阅读更多。
Home

轻点几下即可管理您的 iTunes 资料库!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (4投票s)

2007年2月4日

CPOL

4分钟阅读

viewsIcon

58275

downloadIcon

933

该项目连同建议的使用方式,将使您能够整理 iTunes 资料库并使其为 iPod 同步做好准备,同时利用一个带有取消按钮的可重用进度窗口。

引言

我想发表这篇文章有两个原因。其中之一是为将大型 iTunes 资料库同步到容量不太大的 iPod 的问题提供解决方案。另一个是介绍一个可重用的进度窗口窗体,该窗体可以取消其被调用的进程,并在进程完成后强制关闭。

如果您正在阅读本文,那么您很可能也是一个庞大的 MP3 歌曲库的受害者,其中一部分您甚至从未播放过!更糟糕的是,您购买的 iPod 只能存储其中一部分歌曲,所以您不能简单地将所有歌曲都放入 iPod。

现在您要么必须手动同步 iPod,要么坐下来清理 iTunes 资料库中不需要的歌曲。我做不到,因为我通常是有目的地上电脑的,而且这个目的通常比整理我的 MP3 文件更重要。

以下是我清理 iTunes 资料库的方法。

一次性执行

  • 首先删除重复项(即,指向同一物理 MP3 文件的多个资料库条目)。
  • 删除文件丢失的资料库条目。

在 iPod 或电脑上收听时执行

  • 找到要删除的歌曲了吗?将其评为 1 星。
  • 找到要仅保留在电脑上,而不在 iPod 上的歌曲了吗?将其评为 2 星。
  • 找到要保留在 iPod 上的歌曲了吗?根据您的喜爱程度,将其评为 3 到 5 星。

在 iPod 同步之前执行

  • 准备一个单独的播放列表用于同步到 iPod。将所有评为 3 星及以上的歌曲放入其中。根据 iPod 的容量,随机选择歌曲放入播放列表以填满 iPod(这可能非常耗时)。

幸运的是,iTunes 已将 iTunes SDK 作为 COM 组件提供,因此我们可以从 .NET 代码中操作资料库。而这正是本项目的宗旨。除歌曲评分外,上述所有步骤均由本项目处理。

主屏幕

运行应用程序时,它将显示您 iTunes 资料库中的歌曲数量。

Sample image

让我们来看看这些按钮的功能,从我们可能一次性使用的按钮开始。

删除文件丢失的条目

此按钮启动一个进程,该进程将删除所有文件丢失的资料库条目。这些曲目通常是由于在 Windows 资源管理器中移动文件而产生的。

删除重复项

此按钮删除资料库中指向同一物理 MP3 文件的多个曲目条目。

Sample image

明星!创建收藏夹播放列表

我编写此应用程序就是为了这个按钮。以下是它创建的播放列表:

  • 您的 iPod!:此播放列表包含您评分 3 星及以上的歌曲,以及一些未评分的随机歌曲,以填满您的 iPod。
  • 您的收藏夹!:所有评分 3 星及以上的曲目都将在此播放列表中。
  • 其余!:所有未评分的文件都将在此播放列表中。

单击此按钮后,系统将询问您的 iPod 容量。

Sample image

然后它将开始删除它将创建的播放列表中的条目,以便刷新它们。

Sample image

然后它将开始向播放列表中填充歌曲。

Sample image

之后,它将填满您的 iPod!播放列表中的剩余空间。

Sample image

现在您可以同步您的 iPod 和上述播放列表(并且可以选择性地与 iTunes 的自动播放列表“我的评分最高”同步,因为其中的所有文件都已包含在您的 iPod!您的收藏夹!播放列表中),这样您的 iPod 就可以使用了!

我的建议是,在使用创建收藏夹播放列表按钮之前先同步您的 iPod,这样在创建播放列表时就会考虑到最新评分的歌曲。

进度窗口及其用法

窗体的核心是以下代码。一旦启动,它会绑定到两个事件:UpdateProgressBarStatusDone。这些事件在名为 MLibrary 的模块中声明。

Public Event UpdateStatus(ByRef Cancel As Boolean, ByVal CurrentNumber As Integer)
Public Event StatusDone(ByVal ForceClose As Boolean)
Private mbCancel As Boolean = False

Public Shared Sub Start(ByVal Headline As String, ByVal Total As Integer)
    Dim oStatus As New frmStatus
    oStatus.lblHeadline.Text = Headline
    oStatus.Text = Headline
    oStatus.pb.Maximum = Total
    oStatus.Show()
    AddHandler MLibrary.UpdateStatus, AddressOf oStatus.UpdateProgress
    AddHandler MLibrary.StatusDone, AddressOf oStatus.StatusDone
End Sub

Private Sub UpdateProgress(ByRef Cancel As Boolean, _
            ByVal CurrentNumber As Integer)
    pb.Value = CurrentNumber
    lblStatusText.Text = CurrentNumber & " of " & pb.Maximum
    Application.DoEvents()
    btnOk.Enabled = CurrentNumber = pb.Maximum
    btnCancel.Enabled = Not btnOk.Enabled
    Cancel = mbCancel
    If Cancel Then Me.Close()
End Sub

Private Sub StatusDone(ByVal ForceQuit As Boolean)
    If ForceQuit Then
        btnOk_Click(Nothing, Nothing)
    Else
        btnOk.Enabled = True
        btnCancel.Enabled = False
    End If
End Sub

Private Sub btnCancel_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnCancel.Click
    mbCancel = True
End Sub

Private Sub btnOk_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnOk.Click
    RemoveHandler MLibrary.UpdateStatus, AddressOf Me.UpdateProgress
    RemoveHandler MLibrary.StatusDone, AddressOf Me.StatusDone
    Me.Close()
    Me.Dispose()
End Sub

以下是代码的使用方式。让我们以查找文件丢失的曲目为例:

Dim iCounter As Integer = 0
For Each oTrack As IITTrack In moTunes.LibraryPlaylist.Tracks
    If oTrack.Kind = ITTrackKind.ITTrackKindFile Then
        Dim oFileTrack As IITFileOrCDTrack = oTrack
        If oFileTrack.Location = "" Then
            ' Add to the list of tracks to be deleted
            alTracksToBeDeleted.Add(oFileTrack)
        End If
    End If
    iCounter += 1
    Dim bCancel As Boolean = False
    RaiseEvent UpdateStatus(bCancel, iCounter)
    Application.DoEvents()
    If bCancel Then Exit For
Next
RaiseEvent StatusDone(alTracksToBeDeleted.Count > 0)

上面的代码非常容易理解。在每次迭代中,我们都会引发 UpdateStatus 事件。完成时,我们引发 StatusDone 事件,并带有一个可选参数,用于在用户干预的情况下关闭窗体。

如果您对如何使用此窗体或如何使用 iTunes 资料库管理器有任何疑问,请告诉我。

© . All rights reserved.