molang/main.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
}