解析iTunes播放列表

  • XML和属性列表(p-list)文件
  • 使用numpy数组
  • 用matplotlib绘制直方图和散点图
    import argparse
    from matplotlib import pyplot
    #用来读取播放列表文件
    import plistlib
    #用来存储数据
    import numpy as np
    
    
    def findCommonTracks(filenames):
        trackNameSets = []
        for f in filenames:
            tracknames = set()
            plist = plistlib.readPlist(f)
            tracks = plist['Tracks']
            for id,track in tracks.items():
                try:
                    tracknames.add(track['Name'])
                except:
                    pass
        trackNameSets.append(tracknames)
        #找到重复的放到文件里
        commonTracks = set.intersection(*trackNameSets)
        if len(commonTracks)>0:
            f = open("common.txt",'wb')
            for val in commonTracks:
                val += '\n'
                f.write(val.encode('utf-8'))
            f.close()
            print("重复的音轨已写入到common.txt中")
        else:
            print("没有重复的音轨")
    
    
    #查找重复的曲目
    def findDuplicates(filename):
        plist = plistlib.readPlist(filename)
        tracks = plist['Tracks']
        tracknames ={}
        for id,track in tracks.items():
            try:
                name = track['name']
                duration = track['Total Time']
                if name in tracknames:
                    if duration//1000 == tracknames[name][0]//1000:
                        count = tracknames[name][1]
                        tracknames[name] = (duration,count+1)
                else:
                    tracknames[name] = (duration, 1)
            except:
                pass
    
            #提取重复的音轨
            dups = []
            for k,v in tracknames.items():
                if v[1] > 1:
                    dups.append((v[1],k))
            if len(dups):
                print("存在重复的音轨,已经记录到dups.txt中")
            else:
                print("没有重复的音轨")
            f = open("dups.txt","wb")
            for val in dups:
                f.write(val[0])
                f.write(val[1])
            f.close()
    
    
    #收集信息并绘制
    def plotStats(filename):
        plist = plistlib.readPlist(filename)
        tracks = plist['Tracks']
        #评级和持续时间
        ratings = []
        durations = []
        for id,track in tracks.items():
            try:
                ratings.append(track['Album Rating'])
                durations.append(track['Total Time'])
            except:
                pass
    
        if ratings == [] or durations == []:
            print("%s的评级和持续时间不合理"%filename)
            return
        #柱状图
        x = np.array(durations,np.int32)
        x = x/60000
        y = np.array(ratings,np.int32)
        pyplot.subplot(2,1,1)
        pyplot.plot(x,y,'o')
        pyplot.axis([0,1.05*np.max(x),-1,110])
        pyplot.xlabel("Track Duration")
        pyplot.ylabel("Track rating")
        #散点图
        pyplot.subplot(2,1,2)
        pyplot.hist(x,bins = 20)
        pyplot.xlabel("Track duration")
        pyplot.ylabel("count")
    
        pyplot.show()
    
        #命令行选项
    def main():
        descStr ="this programm analyzes playlist files(.xml) exported from iTunes."
        parser = argparse.ArgumentParser(description=descStr)
        group = parser.add_mutually_exclusive_group()
    
        group.add_argument('--common',nargs='*',dest='plFiles',required=False)
        group.add_argument('--stats', dest='plFile', required=False)
        group.add_argument('--dup', dest='plFileD', required=False)
    
        args = parser.parse_args()
        if args.plFiles:
            findCommonTracks(args.plFiles)
        elif args.plFile:
            plotStats(args.plFile)
        elif args.plFileD:
            findDuplicates(args.plFileD)
        else:
             print('error!')
    
    
    if __name__ == "__main__":
        main()
    pic
    运行实例

猜你喜欢

转载自blog.csdn.net/qq_41359265/article/details/84777256