✨ Select audio stream
This commit is contained in:
		
					parent
					
						
							
								4435ebf98f
							
						
					
				
			
			
				commit
				
					
						07b2c00c14
					
				
			
		
					 3 changed files with 95 additions and 5 deletions
				
			
		|  | @ -22,6 +22,8 @@ var rootCmd = &cobra.Command{ | ||||||
| 		file := files.PickRandomFile() | 		file := files.PickRandomFile() | ||||||
| 		out := ffmpeg.ProbeFile(file) | 		out := ffmpeg.ProbeFile(file) | ||||||
| 		fmt.Printf("%+v\n", out) | 		fmt.Printf("%+v\n", out) | ||||||
|  | 		stream := ffmpeg.SelectAudioStream(out) | ||||||
|  | 		fmt.Printf("Stream %d of %s: %+v\n", stream, out.Format.Path, out.Streams[stream]) | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,11 +10,14 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Config struct { | type Config struct { | ||||||
| 	Source           string   `toml:"source"` | 	Source           string            `toml:"source"` | ||||||
| 	SourceExtensions []string `toml:"source_ext"` | 	SourceExtensions []string          `toml:"source_ext"` | ||||||
| 	Recurse          bool     `toml:"recurse"` | 	Recurse          bool              `toml:"recurse"` | ||||||
| 	SavePath         string   `toml:"save_path"` | 	SavePath         string            `toml:"save_path"` | ||||||
| 	MusicPath        string   `toml:"music_path"` | 	MusicPath        string            `toml:"music_path"` | ||||||
|  | 	Codec            string            `toml:"codec"` | ||||||
|  | 	AllowedCodecs    []string          `toml:"allowed_codec"` | ||||||
|  | 	CodecExt         map[string]string `toml:"codec_ext"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var config Config | var config Config | ||||||
|  | @ -26,6 +29,9 @@ func newConfig() Config { | ||||||
| 		Recurse:          true, | 		Recurse:          true, | ||||||
| 		SavePath:         filepath.Join(xdg.UserDirs.Documents, "StripBeats"), | 		SavePath:         filepath.Join(xdg.UserDirs.Documents, "StripBeats"), | ||||||
| 		MusicPath:        xdg.UserDirs.Music, | 		MusicPath:        xdg.UserDirs.Music, | ||||||
|  | 		Codec:            "opus", | ||||||
|  | 		AllowedCodecs:    []string{"aac", "opus"}, | ||||||
|  | 		CodecExt:         map[string]string{"aac": "m4a", "opus": "opus"}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,9 @@ | ||||||
| package ffmpeg | package ffmpeg | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"codeberg.org/danjones000/strip-beats/config" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"github.com/akrennmair/slice" | ||||||
| 	ffmpeg "github.com/u2takey/ffmpeg-go" | 	ffmpeg "github.com/u2takey/ffmpeg-go" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -10,6 +12,56 @@ type Probe struct { | ||||||
| 	Streams []Stream | 	Streams []Stream | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (p Probe) GetAudioStreams() []*Stream { | ||||||
|  | 	return slice.Map(slice.Filter(p.Streams, func(st Stream) bool { | ||||||
|  | 		return st.CodecType == "audio" | ||||||
|  | 	}), func(s Stream) *Stream { | ||||||
|  | 		return &s | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p Probe) GetFirstAudio() *Stream { | ||||||
|  | 	st := p.GetAudioStreams() | ||||||
|  | 	if len(st) == 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return st[0] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p Probe) GetAudioCount() int { | ||||||
|  | 	st := p.GetAudioStreams() | ||||||
|  | 	return len(st) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p Probe) GetFirstPreferredAudio() *Stream { | ||||||
|  | 	sts := slice.Filter(p.GetAudioStreams(), func(st *Stream) bool { | ||||||
|  | 		return st.isWantedCodec() | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	if len(sts) < 1 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return sts[0] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p Probe) GetFirstAcceptableAudio() *Stream { | ||||||
|  | 	pref := p.GetFirstPreferredAudio() | ||||||
|  | 	if pref != nil { | ||||||
|  | 		return pref | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sts := slice.Filter(p.GetAudioStreams(), func(st *Stream) bool { | ||||||
|  | 		return st.isAcceptableCodec() | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	if len(sts) < 1 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return sts[0] | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type Stream struct { | type Stream struct { | ||||||
| 	Index         int | 	Index         int | ||||||
| 	CodecName     string `json:"codec_name"` | 	CodecName     string `json:"codec_name"` | ||||||
|  | @ -25,6 +77,18 @@ type Stream struct { | ||||||
| 	Tags          Tags | 	Tags          Tags | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (st Stream) isWantedCodec() bool { | ||||||
|  | 	wantedcodec := config.GetConfig().Codec | ||||||
|  | 	return st.CodecName == wantedcodec | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (st Stream) isAcceptableCodec() bool { | ||||||
|  | 	codecs := config.GetConfig().AllowedCodecs | ||||||
|  | 	return slice.ReduceWithInitialValue(codecs, false, func(acc bool, codec string) bool { | ||||||
|  | 		return acc || st.CodecName == codec | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type Format struct { | type Format struct { | ||||||
| 	Path           string  `json:"filename"` | 	Path           string  `json:"filename"` | ||||||
| 	Streams        int     `json:"nb_streams"` | 	Streams        int     `json:"nb_streams"` | ||||||
|  | @ -66,3 +130,21 @@ func ProbeFile(path string) Probe { | ||||||
| 	} | 	} | ||||||
| 	return ret | 	return ret | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func SelectAudioStream(pr Probe) int { | ||||||
|  | 	count := pr.GetAudioCount() | ||||||
|  | 	if count < 1 { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if count == 1 { | ||||||
|  | 		return pr.GetFirstAudio().Index | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	pref := pr.GetFirstAcceptableAudio() | ||||||
|  | 	if pref != nil { | ||||||
|  | 		return pref.Index | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return pr.GetFirstAudio().Index | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue