Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented nil pointers for JSON #12

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 51 additions & 18 deletions cmd/dca/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ var (
CmdBuf bytes.Buffer
PngBuf bytes.Buffer

CoverImage string

// Metadata structures
Metadata MetadataStruct
FFprobeData FFprobeMetadata
Expand Down Expand Up @@ -70,6 +68,20 @@ var (

Volume int // change audio volume (256=normal)

// Struct Pointers
SongTitle string
SongArtist string
SongAlbum string
SongGenre string
SongComments string
SongCover string

OriginSource string
OriginBitrate int = -1
OriginChannels int = -1
OriginEncoding string
OriginURL string

OpusEncoder *gopus.Encoder

InFile string
Expand Down Expand Up @@ -235,19 +247,36 @@ func main() {
return
}

Metadata.SongInfo = &SongMetadata{
Title: FFprobeData.Format.Tags.Title,
Artist: FFprobeData.Format.Tags.Artist,
Album: FFprobeData.Format.Tags.Album,
Genre: FFprobeData.Format.Tags.Genre,
Comments: "", // change later?
if FFprobeData.Format.Tags.Title != "" {
SongTitle = FFprobeData.Format.Tags.Title
Metadata.SongInfo.Title = &SongTitle
}

if FFprobeData.Format.Tags.Artist != "" {
SongArtist = FFprobeData.Format.Tags.Artist
Metadata.SongInfo.Artist = &SongArtist
}

if FFprobeData.Format.Tags.Album != "" {
SongAlbum = FFprobeData.Format.Tags.Album
Metadata.SongInfo.Album = &SongAlbum
}

if FFprobeData.Format.Tags.Genre != "" {
SongGenre = FFprobeData.Format.Tags.Genre
Metadata.SongInfo.Genre = &SongGenre
}

OriginSource = "file"
OriginBitrate = bitrateInt
OriginChannels = Channels
OriginEncoding = FFprobeData.Format.FormatLongName

Metadata.Origin = &OriginMetadata{
Source: "file",
Bitrate: bitrateInt,
Channels: Channels,
Encoding: FFprobeData.Format.FormatLongName,
Source: &OriginSource,
Bitrate: &OriginBitrate,
Channels: &OriginChannels,
Encoding: &OriginEncoding,
}

CmdBuf.Reset()
Expand All @@ -271,23 +300,27 @@ func main() {
if err == nil { // silently drop it, no image
err = png.Encode(&PngBuf, img)
if err == nil {
CoverImage = base64.StdEncoding.EncodeToString(PngBuf.Bytes())
SongCover = base64.StdEncoding.EncodeToString(PngBuf.Bytes())
}
}
} else {
CoverImage = base64.StdEncoding.EncodeToString(CmdBuf.Bytes())
SongCover = base64.StdEncoding.EncodeToString(CmdBuf.Bytes())
}

Metadata.SongInfo.Cover = &CoverImage
Metadata.SongInfo.Cover = &SongCover
}

CmdBuf.Reset()
PngBuf.Reset()
} else {
OriginSource = "pipe"
OriginChannels = Channels
OriginEncoding = "pcm16/s16le"

Metadata.Origin = &OriginMetadata{
Source: "pipe",
Channels: Channels,
Encoding: "pcm16/s16le",
Source: &OriginSource,
Channels: &OriginChannels,
Encoding: &OriginEncoding,
}
}
}
Expand Down
108 changes: 54 additions & 54 deletions cmd/dca/structs.go
Original file line number Diff line number Diff line change
@@ -1,102 +1,102 @@
package main

// Base metadata struct
//
//
// https://github.com/bwmarrin/dca/issues/5#issuecomment-189713886
type MetadataStruct struct {
Dca *DCAMetadata `json:"dca"`
SongInfo *SongMetadata `json:"info"`
Origin *OriginMetadata `json:"origin"`
Opus *OpusMetadata `json:"opus"`
Extra *ExtraMetadata `json:"extra"`
Dca *DCAMetadata `json:"dca"`
SongInfo *SongMetadata `json:"info"`
Origin *OriginMetadata `json:"origin"`
Opus *OpusMetadata `json:"opus"`
Extra *ExtraMetadata `json:"extra"`
}

// DCA metadata struct
//
//
// Contains the DCA version.
type DCAMetadata struct {
Version int8 `json:"version"`
Tool *DCAToolMetadata `json:"tool"`
Version int8 `json:"version"`
Tool *DCAToolMetadata `json:"tool"`
}

// DCA tool metadata struct
//
//
// Contains the Git revisions, commit author etc.
type DCAToolMetadata struct {
Name string `json:"name"`
Version string `json:"version"`
Url string `json:"url"`
Author string `json:"author"`
Name string `json:"name"`
Version string `json:"version"`
Url string `json:"url"`
Author string `json:"author"`
}

// Song Information metadata struct
//
//
// Contains information about the song that was encoded.
type SongMetadata struct {
Title string `json:"title"`
Artist string `json:"artist"`
Album string `json:"album"`
Genre string `json:"genre"`
Comments string `json:"comments"`
Cover *string `json:"cover"`
Title *string `json:"title"`
Artist *string `json:"artist"`
Album *string `json:"album"`
Genre *string `json:"genre"`
Comments *string `json:"comments"`
Cover *string `json:"cover"`
}

// Origin information metadata struct
//
//
// Contains information about where the song came from,
// audio bitrate, channels and original encoding.
type OriginMetadata struct {
Source string `json:"source"`
Bitrate int `json:"abr"`
Channels int `json:"channels"`
Encoding string `json:"encoding"`
Url string `json:"url"`
Source *string `json:"source"`
Bitrate *int `json:"abr"`
Channels *int `json:"channels"`
Encoding *string `json:"encoding"`
Url *string `json:"url"`
}

// Opus metadata struct
//
//
// Contains information about how the file was encoded
// with Opus.
type OpusMetadata struct {
Bitrate int `json:"abr"`
SampleRate int `json:"sample_rate"`
Application string `json:"mode"`
FrameSize int `json:"frame_size"`
Channels int `json:"channels"`
Bitrate int `json:"abr"`
SampleRate int `json:"sample_rate"`
Application string `json:"mode"`
FrameSize int `json:"frame_size"`
Channels int `json:"channels"`
}

// Extra metadata struct
type ExtraMetadata struct {}
type ExtraMetadata struct{}

////////////////////////////////////////////////////////
/// FFprobe Structures
////////////////////////////////////////////////////////

type FFprobeMetadata struct {
Format *FFprobeFormat `json:"format"`
Format *FFprobeFormat `json:"format"`
}

type FFprobeFormat struct {
FileName string `json:"filename"`
NumStreams int `json:"nb_streams"`
NumPrograms int `json:"nb_programs"`
FormatName string `json:"format_name"`
FormatLongName string `json:"format_long_name"`
StartTime string `json:"start_time"`
Duration string `json:"duration"`
Size string `json:"size"`
Bitrate string `json:"bit_rate"`
ProbeScore int `json:"probe_score"`
FileName string `json:"filename"`
NumStreams int `json:"nb_streams"`
NumPrograms int `json:"nb_programs"`
FormatName string `json:"format_name"`
FormatLongName string `json:"format_long_name"`
StartTime string `json:"start_time"`
Duration string `json:"duration"`
Size string `json:"size"`
Bitrate string `json:"bit_rate"`
ProbeScore int `json:"probe_score"`

Tags *FFprobeTags `json:"tags"`
Tags *FFprobeTags `json:"tags"`
}

type FFprobeTags struct {
Date string `json:"date"`
Track string `json:"track"`
Artist string `json:"artist"`
Genre string `json:"genre"`
Title string `json:"title"`
Album string `json:"album"`
Compilation string `json:"compilation"`
}
Date string `json:"date"`
Track string `json:"track"`
Artist string `json:"artist"`
Genre string `json:"genre"`
Title string `json:"title"`
Album string `json:"album"`
Compilation string `json:"compilation"`
}