101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
// First-party packages
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
// Third-party packages
|
|
"github.com/faiface/beep/flac"
|
|
"github.com/faiface/beep/mp3"
|
|
"github.com/faiface/beep/speaker"
|
|
"github.com/faiface/beep/vorbis"
|
|
"github.com/faiface/beep/wav"
|
|
)
|
|
|
|
func main() {
|
|
var file string
|
|
flag.StringVar(&file, "file", "file.ogg", "File to play")
|
|
flag.Parse()
|
|
|
|
f, err := os.Open(*&file)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
contentType, err := GetFileContentType(f)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if contentType == "application/ogg" {
|
|
fmt.Println("Playing " + *&file)
|
|
streamer, format, err := vorbis.Decode(f)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer streamer.Close()
|
|
|
|
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
|
|
speaker.Play(streamer)
|
|
select {}
|
|
} else if contentType == "audio/mpeg" {
|
|
fmt.Println("Playing " + *&file)
|
|
streamer, format, err := mp3.Decode(f)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer streamer.Close()
|
|
|
|
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
|
|
speaker.Play(streamer)
|
|
select {}
|
|
} else if contentType == "audio/flac" {
|
|
fmt.Println("Playing " + *&file)
|
|
streamer, format, err := flac.Decode(f)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer streamer.Close()
|
|
|
|
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
|
|
speaker.Play(streamer)
|
|
select {}
|
|
} else if contentType == "audio/wav" {
|
|
fmt.Println("Playing " + *&file)
|
|
streamer, format, err := wav.Decode(f)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer streamer.Close()
|
|
|
|
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
|
|
speaker.Play(streamer)
|
|
select {}
|
|
} else { // If the file is not a valid audio file, throw this error.
|
|
fmt.Println("This file is " + contentType + ".\nIt needs to be a MIME type application/ogg")
|
|
}
|
|
}
|
|
|
|
// Code for function below taken from here:
|
|
// https://golangcode.com/get-the-content-type-of-file/
|
|
func GetFileContentType(out *os.File) (string, error) {
|
|
// Only the first 512 bytes are used to sniff the content type.
|
|
buffer := make([]byte, 512)
|
|
|
|
_, err := out.Read(buffer)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Use the net/http package's handy DectectContentType function. Always returns a valid
|
|
// content-type by returning "application/octet-stream" if no others seemed to match.
|
|
contentType := http.DetectContentType(buffer)
|
|
|
|
return contentType, nil
|
|
}
|