学习golang来自己写的代码,先贴出来。
package main
import (
"fmt"
"os"
"errors"
"strings"
)
//no tag
var ErrFormat = errors.New("No TAG!")
type Mp3 struct{
//the file attr
Name string
Size int64
//the mp3 attr
Title string
Artist string
Album string
Year string
Comment string
Genre uint8
}
func (m *Mp3) PrintInfo(){
fmt.Printf("%v:\n",m.Name)
fmt.Printf("size:%v\ntitle:%v\nartist:%v\nalbum:%v\nyear:%v\ncomment:%v\n",m.Size,m.Title,m.Artist,m.Album,m.Year,m.Comment)
fmt.Printf("genre:%v",m.Genre)
}
func (m *Mp3) GetInfo(filename string) (err error){
id3 := make([]byte,128)
//for read access.
f,err := os.Open(filename)
if err != nil{
return
}
defer f.Close()
//return FileInfo
fileInfo,err := f.Stat()
if err != nil{
return
}
//the file size,int64
m.Size = fileInfo.Size()
//the file name,string. eq filename
m.Name = fileInfo.Name()
//if
_,err = f.ReadAt(id3,m.Size-128)
if err != nil{
return
}
tag := string(id3[:3])
if tag != "TAG"{
//err "No ID3~"
return ErrFormat
}
m.Title = strings.Trim(string(id3[3:33]),"\x00")
m.Album = strings.Trim(string(id3[33:63]),"\x00")
m.Artist = strings.Trim(string(id3[63:93]),"\x00")
m.Year = string(id3[93:97])
m.Comment = strings.Trim(string(id3[97:127]),"\x00")
m.Genre = uint8(id3[127])
return nil
}
func main(){
m := new(Mp3)
f,err := os.Open(".")
if err != nil{
fmt.Print(err)
}
defer f.Close()
names,err := f.Readdirnames(-1)
if err != nil{
fmt.Print(err)
}
for _,name := range names{
a := strings.Split(name,".")
fileExt := strings.ToLower(a[len(a)-1])
//fmt.Print(i,fileExt)
if fileExt == "mp3"{
err = m.GetInfo(name)
if err != nil{
fmt.Print(name,err)
}
m.PrintInfo()
}
}
//fmt.Printf("%v",names)
}
有关id3的介绍,程序只读取id3 vi版本的信息,位于mp3文件末尾的128个字节。
数据结构定义如下:
char Header[3]; /*标签头必须是"TAG"否则认为没有标签*/
char Title[30]; /*标题*/
char Artist[30]; /*作者*/
char Album[30]; /*专集*/
char Year[4]; /*出品年代*/
char Comment[30]; /*备注*/
char Genre; /*类型*/
ID3V1的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30个字节,则使用'\0'补足,否则将造成信息错误。
上一篇: Django的CSRF-Ajax
下一篇: python用py2exe打包成exe
0 Responses so far.