Skip to content
Open
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
25 changes: 13 additions & 12 deletions cmd/Plex Custom Audio Mapper/mapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@ import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"github.com/saoneth/goav/avcodec"
"github.com/saoneth/goav/avformat"
"github.com/saoneth/goav/avutil"
util "github.com/saoneth/plex-custom-audio"
"log"
"net/url"
"os"
"path/filepath"
"strings"
"github.com/saoneth/goav/avformat"
"github.com/saoneth/goav/avcodec"
"github.com/saoneth/goav/avutil"
"unsafe"
"strconv"
"strings"
"time"
"net/url"
util "github.com/saoneth/plex-custom-audio"
"unsafe"
)

func encodeUriParams(m map[string]string) string {
Expand All @@ -28,7 +28,7 @@ func encodeUriParams(m map[string]string) string {

func isAudioFile(file string) bool {
// aac,ac3,alac,dts,flac,matroska,mp2,mp3,ogg,wav
return strings.HasSuffix(file, ".aac") || strings.HasSuffix(file, ".ac3") || strings.HasSuffix(file, ".alac") || strings.HasSuffix(file, ".dts") || strings.HasSuffix(file, ".flac") || strings.HasSuffix(file, ".mka") || strings.HasSuffix(file, ".mp2") || strings.HasSuffix(file, ".mp3") || strings.HasSuffix(file, ".ogg") || strings.HasSuffix(file, ".wav")
return strings.HasSuffix(file, ".aac") || strings.HasSuffix(file, ".ac3") || strings.HasSuffix(file, ".alac") || strings.HasSuffix(file, ".dtshd") || strings.HasSuffix(file, ".dts") || strings.HasSuffix(file, ".thd") || strings.HasSuffix(file, ".flac") || strings.HasSuffix(file, ".mka") || strings.HasSuffix(file, ".mp2") || strings.HasSuffix(file, ".mp3") || strings.HasSuffix(file, ".ogg") || strings.HasSuffix(file, ".wav")
}

func GetAudioChannelLayout(channelLayout uint64) string {
Expand Down Expand Up @@ -222,7 +222,7 @@ func main() {
}

var last_index int
last_index_stmt.QueryRow(media_item_id).Scan(&last_index)
_ = last_index_stmt.QueryRow(media_item_id).Scan(&last_index)

if last_index == 0 {
fmt.Println(" ! file is not yet analysed")
Expand All @@ -249,13 +249,14 @@ func main() {
if name == filename || !strings.HasPrefix(name, base_filename) || !isAudioFile(name) {
return nil
}
ext := filepath.Ext(name)
fmt.Printf(" - found audio file: %s\n", path)

fTitle := ""
fLanguage := ""
// If file is in format: BASENAME.LANG.EXT or BASENAME.LANG.TRACK_TITLE.EXT
if len(base_filename) <= len(name) - 4 {
s := strings.Split(name[len(base_filename):len(name) - 4], ".")
if len(base_filename) <= len(name) - len(ext) {
s := strings.Split(name[len(base_filename):len(name) - len(ext)], ".")
if len(s[0]) == 3 {
fLanguage = s[0]
if len(s) > 1 && !strings.HasPrefix(s[1], "track-") {
Expand All @@ -267,7 +268,7 @@ func main() {
fileUrl := "file://" + path

var res int
check_stmt.QueryRow(fileUrl).Scan(&res)
_ = check_stmt.QueryRow(fileUrl).Scan(&res)
if res > 0 {
fmt.Println(" @ file already in database")
return nil
Expand Down
105 changes: 87 additions & 18 deletions cmd/Plex Transcoder/transcoder.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,48 @@
package main

import (
"bufio"
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
util "github.com/saoneth/plex-custom-audio"
"io/ioutil"
"log"
"os"
"strings"
"os/exec"
"path/filepath"
"runtime"
"strconv"
"strings"
"syscall"
util "github.com/saoneth/plex-custom-audio"
)


func runTranscoder(args []string) {
err := syscall.Exec(args[0] + "_org", args, os.Environ())
if err != nil {
log.Fatal(err)
if runtime.GOOS == "windows" {
ext := filepath.Ext(args[0])

path := args[0]
orgFilename := path[0:len(args[0])-len(ext)] + "_org.exe"
cmd := exec.Command(orgFilename, args[1:]...)

go func() {
// wait until the parent dies and bufio closes the stdin
_, _ = ioutil.ReadAll(os.Stdin)
if cmd.Process != nil {
_ = cmd.Process.Kill()
}
}()

_, err := cmd.Output()
if err != nil {
log.Fatal(err)
}
} else {
err := syscall.Exec(args[0] + "_org", args, os.Environ())
if err != nil {
log.Fatal(err)
}
}
}

Expand All @@ -29,6 +56,30 @@ func main() {
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile)

if runtime.GOOS == "windows" {
child := false
for i := 1; i < len(os.Args); i++ {
arg := os.Args[i]
if arg == "-child" {
child = true
break
}
}
if !child {
//start new child for watching this process
args := append(os.Args[1:], "-child")
cmd := exec.Command(os.Args[0], args...)

//this is important, bufio will close after the parent exits,
// unlike os.Stdin which screws up, at least on linux
cmd.Stdin = bufio.NewReader(os.Stdin)

cmd.Start()
_, _ = cmd.Process.Wait()
return
}
}

log.Println("Args:")
log.Println(os.Args)

Expand All @@ -50,13 +101,13 @@ func main() {
}
defer get_media_by_file_stmt.Close()

get_media_stream_url_stmt, err := db.Prepare("SELECT `url`, `url_index` FROM `media_streams` WHERE `media_part_id` = ? AND `media_item_id` = ? AND `index` = ? LIMIT 1")
get_media_stream_url_stmt, err := db.Prepare("SELECT `url`, `url_index`, `codec` FROM `media_streams` WHERE `media_part_id` = ? AND `media_item_id` = ? AND `index` = ? LIMIT 1")
if err != nil {
log.Fatal(err)
}
defer get_media_stream_url_stmt.Close()

getInfo := func(path string, index int) (audioPath string, audioIndex int) {
getInfo := func(path string, index int) (audioPath string, audioIndex int, audioCodec string) {
log.Println("path:", path)
var media_part_id int
var media_item_id int
Expand All @@ -78,11 +129,13 @@ func main() {

var url string
var url_index int
get_media_stream_url_stmt.QueryRow(media_part_id, media_item_id, index).Scan(&url, &url_index)
var codec string
get_media_stream_url_stmt.QueryRow(media_part_id, media_item_id, index).Scan(&url, &url_index, &codec)
audioPath = url[7:]
audioIndex = url_index
audioCodec = codec

return audioPath, audioIndex
return audioPath, audioIndex, audioCodec
}

inputCounter := 0
Expand Down Expand Up @@ -112,8 +165,8 @@ func main() {
if err != nil || streamIndex < 1000 {
continue
}
audioCodec = os.Args[i]
log.Printf("audioCodec: %s\n", audioCodec)
//audioCodec = os.Args[i]
//log.Printf("audioCodec: %s\n", audioCodec)
continue
}
if arg == "-i" {
Expand Down Expand Up @@ -143,7 +196,7 @@ func main() {
continue
}

audioPath, audioIndex = getInfo(path, streamIndex)
audioPath, audioIndex, audioCodec = getInfo(path, streamIndex)
log.Printf("inputCounter: %d, audioPath: %s, audioIndex: %d\n", inputCounter, audioPath, audioIndex)
continue
}
Expand All @@ -169,26 +222,42 @@ func main() {

if streamIndex >= 1000 {
log.Println("Path:", path)
audioPath, audioIndex = getInfo(path, streamIndex)
audioPath, audioIndex, audioCodec = getInfo(path, streamIndex)
}
log.Printf("audioPath: %s, audioIndex: %d\n", audioPath, audioIndex)
log.Printf("audioPath: %s, audioIndex: %d, audioCodec: %s\n", audioPath, audioIndex, audioCodec)
continue
}
}

if mapCounter < 2 || audioPath == "" {
args := []string{os.Args[0]}

if mapCounter < 2 || len(audioPath) == 0 {
log.Println("Probably audio streaming")
runTranscoder(os.Args)

for i := 1; i < len(os.Args); i++ {
arg := os.Args[i]

if arg == "-child" {
continue
}
// default
args = append(args, arg)
}
runTranscoder(args)
return
}

log.Printf("audioPath: %s, audioIndex: %d\n", audioPath, audioIndex)

args := []string{}
currentInputIdx := 0

for i := 0; i < len(os.Args); i++ {
for i := 1; i < len(os.Args); i++ {
arg := os.Args[i]

if arg == "-child" {
continue
}

// Add -codec only if it's for valid input
if strings.HasPrefix(arg, "-codec:") {
i++
Expand Down