commit
de10c59bea
64
cache/cache.go
vendored
64
cache/cache.go
vendored
@ -3,70 +3,32 @@ package cache
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
USER_CACHE_DIR, err = os.UserCacheDir()
|
||||
CACHE_LIST map[[2]string]string = make(map[[2]string]string)
|
||||
CACHE_DIR string = USER_CACHE_DIR
|
||||
DEFAULT_IMG string
|
||||
CACHE_DIR string
|
||||
DEFAULT_IMG string
|
||||
)
|
||||
|
||||
func SetCacheDir(path string) {
|
||||
CACHE_DIR = path
|
||||
CACHE_DIR = utils.CheckDirectoryFmt(path)
|
||||
}
|
||||
|
||||
func SetDefaultPath(path string) {
|
||||
DEFAULT_IMG = path
|
||||
}
|
||||
|
||||
func LoadCache(path string) error {
|
||||
cacheFileContent, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return errors.New("Could Not Read From Cache File")
|
||||
}
|
||||
lineSlice := strings.Split(string(cacheFileContent), "\n")
|
||||
for _, line := range lineSlice {
|
||||
if len(line) != 0 {
|
||||
param := strings.Split(line, "\t")
|
||||
if len(param) == 3 {
|
||||
CACHE_LIST[[2]string{param[0], param[1]}] = param[2]
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetFromCache(artist, album string) (string, error) {
|
||||
if val, ok := CACHE_LIST[[2]string{artist, album}]; ok {
|
||||
return val, nil
|
||||
func Exists(artist, album string) bool {
|
||||
if _, err := os.Stat(GenerateName(artist, album)); errors.Is(err, os.ErrNotExist) {
|
||||
return false
|
||||
} else {
|
||||
return "", errors.New("Element Not In Cache")
|
||||
}
|
||||
}
|
||||
|
||||
func PointToDefault(artist, album string) {
|
||||
CACHE_LIST[[2]string{artist, album}] = DEFAULT_IMG
|
||||
}
|
||||
|
||||
func AddToCache(artist, album string) string {
|
||||
fileName := CACHE_DIR + GenerateName(artist, album)
|
||||
CACHE_LIST[[2]string{artist, album}] = fileName
|
||||
return fileName
|
||||
}
|
||||
|
||||
func WriteCache(path string) {
|
||||
b, err := os.Create(path)
|
||||
if err == nil {
|
||||
for k, v := range CACHE_LIST {
|
||||
b.Write([]byte(fmt.Sprintf("%s\t%s\t%s\n", k[0], k[1], v)))
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func GenerateName(artist, album string) string {
|
||||
return strings.Replace(strings.Replace(fmt.Sprintf("%s-%s.jpg", artist, album), " ", "_", -1), "/", "_", -1)
|
||||
if (artist == "" && album == "") || (artist == " " && album == " ") {
|
||||
return CACHE_DIR + "UnknownArtist-UnknownAlbum.jpg"
|
||||
}
|
||||
return CACHE_DIR + strings.Replace(strings.Replace(fmt.Sprintf("%s-%s.jpg", artist, album), " ", "_", -1), "/", "_", -1)
|
||||
}
|
||||
|
41
client.go
41
client.go
@ -5,6 +5,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
"github.com/aditya-K2/tview"
|
||||
)
|
||||
|
||||
@ -12,16 +13,6 @@ var (
|
||||
WHITE_AND_BOLD string = "[#ffffff::b]"
|
||||
)
|
||||
|
||||
func getFormattedString(s string, width int) string {
|
||||
if len(s) < width {
|
||||
s += strings.Repeat(" ", (width - len(s)))
|
||||
} else {
|
||||
s = s[:(width - 2)]
|
||||
s += " "
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func togglePlayBack() error {
|
||||
status, err := CONN.Status()
|
||||
if status["state"] == "play" && err == nil {
|
||||
@ -39,10 +30,10 @@ func UpdatePlaylist(inputTable *tview.Table) {
|
||||
for i, j := range _playlistAttr {
|
||||
_, _, w, _ := inputTable.GetInnerRect()
|
||||
if j["Title"] == "" || j["Artist"] == "" || j["Album"] == "" {
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString(j["file"], w/3)))
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(utils.GetFormattedString(j["file"], w/3)))
|
||||
} else {
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString("[green]"+j["Title"], w/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(getFormattedString("[magenta]"+j["Artist"], w/3)))
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(utils.GetFormattedString("[green]"+j["Title"], w/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(utils.GetFormattedString("[magenta]"+j["Artist"], w/3)))
|
||||
inputTable.SetCell(i, 2, tview.NewTableCell("[yellow]"+j["Album"]))
|
||||
}
|
||||
}
|
||||
@ -106,14 +97,14 @@ func UpdateSearchView(inputTable *tview.Table, c []interface{}) {
|
||||
switch content.(type) {
|
||||
case [3]string:
|
||||
{
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString("[green]"+content.([3]string)[0], width/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(getFormattedString("[magenta]"+content.([3]string)[1], width/3)))
|
||||
inputTable.SetCell(i, 2, tview.NewTableCell(getFormattedString("[yellow]"+content.([3]string)[2], width/3)))
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(utils.GetFormattedString("[green]"+content.([3]string)[0], width/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(utils.GetFormattedString("[magenta]"+content.([3]string)[1], width/3)))
|
||||
inputTable.SetCell(i, 2, tview.NewTableCell(utils.GetFormattedString("[yellow]"+content.([3]string)[2], width/3)))
|
||||
}
|
||||
case [2]string:
|
||||
{
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(getFormattedString("[green]"+content.([2]string)[0], width/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(getFormattedString("[magenta]"+content.([2]string)[1], width/3)))
|
||||
inputTable.SetCell(i, 0, tview.NewTableCell(utils.GetFormattedString("[green]"+content.([2]string)[0], width/3)))
|
||||
inputTable.SetCell(i, 1, tview.NewTableCell(utils.GetFormattedString("[magenta]"+content.([2]string)[1], width/3)))
|
||||
}
|
||||
case string:
|
||||
{
|
||||
@ -128,16 +119,6 @@ func UpdateSearchView(inputTable *tview.Table, c []interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
func join(stringSlice []string) string {
|
||||
var _s string = stringSlice[0]
|
||||
for i := 1; i < len(stringSlice); i++ {
|
||||
if _s != "" {
|
||||
_s += ("/" + stringSlice[i])
|
||||
}
|
||||
}
|
||||
return _s
|
||||
}
|
||||
|
||||
func Update(f []FileNode, inputTable *tview.Table) {
|
||||
inputTable.Clear()
|
||||
for i, j := range f {
|
||||
@ -146,11 +127,11 @@ func Update(f []FileNode, inputTable *tview.Table) {
|
||||
if err == nil && _songAttributes[0]["Title"] != "" {
|
||||
_, _, w, _ := inputTable.GetInnerRect()
|
||||
inputTable.SetCell(i, 0,
|
||||
tview.NewTableCell("[green]"+getFormattedString(_songAttributes[0]["Title"], w/3)).
|
||||
tview.NewTableCell("[green]"+utils.GetFormattedString(_songAttributes[0]["Title"], w/3)).
|
||||
SetAlign(tview.AlignLeft))
|
||||
|
||||
inputTable.SetCell(i, 1,
|
||||
tview.NewTableCell("[magenta]"+getFormattedString(_songAttributes[0]["Artist"], w/3)).
|
||||
tview.NewTableCell("[magenta]"+utils.GetFormattedString(_songAttributes[0]["Artist"], w/3)).
|
||||
SetAlign(tview.AlignLeft))
|
||||
|
||||
inputTable.SetCell(i, 2,
|
||||
|
@ -6,20 +6,22 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var (
|
||||
HOME_DIR, _ = os.UserHomeDir()
|
||||
defaults = map[string]interface{}{
|
||||
HOME_DIR, _ = os.UserHomeDir()
|
||||
USER_CACHE_DIR, _ = os.UserCacheDir()
|
||||
defaults = map[string]interface{}{
|
||||
"ADDITIONAL_PADDING_X": 12,
|
||||
"ADDITIONAL_PADDING_Y": 16,
|
||||
"IMAGE_WIDTH_EXTRA_X": -1.5,
|
||||
"IMAGE_WIDTH_EXTRA_Y": -3.75,
|
||||
"MUSIC_DIRECTORY": getMusicDirectory() + "/",
|
||||
"MUSIC_DIRECTORY": utils.CheckDirectoryFmt(getMusicDirectory()),
|
||||
"PORT": "6600",
|
||||
"DEFAULT_IMAGE_PATH": "default.jpg",
|
||||
"COVER_IMAGE_PATH": "cover.jpg",
|
||||
"CACHE_DIR": utils.CheckDirectoryFmt(USER_CACHE_DIR),
|
||||
}
|
||||
)
|
||||
|
||||
|
9
main.go
9
main.go
@ -4,6 +4,8 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
|
||||
"github.com/aditya-K2/fuzzy"
|
||||
"github.com/aditya-K2/goMP/cache"
|
||||
"github.com/aditya-K2/goMP/config"
|
||||
@ -34,8 +36,6 @@ func main() {
|
||||
}
|
||||
defer CONN.Close()
|
||||
cache.SetCacheDir(viper.GetString("CACHE_DIR"))
|
||||
cache.SetDefaultPath(viper.GetString("DEFAULT_IMAGE_PATH"))
|
||||
cache.LoadCache(viper.GetString("CACHE_FILE"))
|
||||
r := newRenderer()
|
||||
c, _ := CONN.CurrentSong()
|
||||
if len(c) != 0 {
|
||||
@ -57,7 +57,7 @@ func main() {
|
||||
Repeat, _ = strconv.ParseBool(_v["repeat"])
|
||||
|
||||
ARTIST_TREE, err = GenerateArtistTree()
|
||||
ARTIST_TREE_CONTENT := ConvertToArray()
|
||||
ARTIST_TREE_CONTENT := utils.ConvertToArray(ARTIST_TREE)
|
||||
NOTIFICATION_SERVER = NewNotificationServer()
|
||||
NOTIFICATION_SERVER.Start()
|
||||
|
||||
@ -208,7 +208,7 @@ func main() {
|
||||
if i == 10 {
|
||||
break
|
||||
}
|
||||
suggestions = append(suggestions, getFormattedString(match.Str, w-2))
|
||||
suggestions = append(suggestions, utils.GetFormattedString(match.Str, w-2))
|
||||
}
|
||||
return suggestions
|
||||
} else {
|
||||
@ -256,5 +256,4 @@ func main() {
|
||||
if err := UI.App.Run(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
cache.WriteCache(viper.GetString("CACHE_FILE"))
|
||||
}
|
||||
|
@ -3,6 +3,8 @@ package main
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
|
||||
"github.com/aditya-K2/tview"
|
||||
"github.com/gdamore/tcell/v2"
|
||||
)
|
||||
@ -23,7 +25,7 @@ func NewNotification(s string) *Notification {
|
||||
|
||||
/* Draw Function for the Notification Primitive */
|
||||
func (self *Notification) Draw(screen tcell.Screen) {
|
||||
termDetails := getWidth()
|
||||
termDetails := utils.GetWidth()
|
||||
|
||||
var (
|
||||
COL int = int(termDetails.Col)
|
||||
|
@ -4,6 +4,8 @@ import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
|
||||
"github.com/aditya-K2/tview"
|
||||
"github.com/gdamore/tcell/v2"
|
||||
)
|
||||
@ -69,14 +71,14 @@ func (s *progressBar) updateProgress() {
|
||||
if du != 0 {
|
||||
percentage := el / du * 100
|
||||
if err == nil && err1 == nil {
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s Volume: %s ]", formatString(_status["state"]), formatString(_status["random"]), formatString(_status["repeat"]), _status["volume"])).SetTitleAlign(tview.AlignRight)
|
||||
s.t.GetCell(2, 0).Text = getText(float64(_width), percentage, strTime(el)+"/"+strTime(du)+"("+strconv.FormatFloat(percentage, 'f', 2, 32)+"%"+")")
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s Volume: %s ]", utils.FormatString(_status["state"]), utils.FormatString(_status["random"]), utils.FormatString(_status["repeat"]), _status["volume"])).SetTitleAlign(tview.AlignRight)
|
||||
s.t.GetCell(2, 0).Text = utils.GetText(float64(_width), percentage, utils.StrTime(el)+"/"+utils.StrTime(du)+"("+strconv.FormatFloat(percentage, 'f', 2, 32)+"%"+")")
|
||||
} else {
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s]", formatString(_status["state"]), formatString(_status["random"]), formatString(_status["repeat"]))).SetTitleAlign(tview.AlignRight)
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s]", utils.FormatString(_status["state"]), utils.FormatString(_status["random"]), utils.FormatString(_status["repeat"]))).SetTitleAlign(tview.AlignRight)
|
||||
s.t.GetCell(2, 0).Text = ""
|
||||
}
|
||||
} else {
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s Volume: %s ]", formatString(_status["state"]), formatString(_status["random"]), formatString(_status["repeat"]), _status["volume"])).SetTitleAlign(tview.AlignRight)
|
||||
s.t.GetCell(2, 0).Text = getText(float64(_width), 0, " ---:---")
|
||||
s.t.SetTitle(fmt.Sprintf("[[::i] %s [-:-:-]Shuffle: %s Repeat: %s Volume: %s ]", utils.FormatString(_status["state"]), utils.FormatString(_status["random"]), utils.FormatString(_status["repeat"]), _status["volume"])).SetTitleAlign(tview.AlignRight)
|
||||
s.t.GetCell(2, 0).Text = utils.GetText(float64(_width), 0, " ---:---")
|
||||
}
|
||||
}
|
||||
|
39
render.go
39
render.go
@ -1,7 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"image"
|
||||
"os"
|
||||
|
||||
"github.com/aditya-K2/goMP/cache"
|
||||
"github.com/aditya-K2/goMP/utils"
|
||||
"github.com/nfnt/resize"
|
||||
"github.com/spf13/viper"
|
||||
"gitlab.com/diamondburned/ueberzug-go"
|
||||
)
|
||||
@ -41,11 +46,11 @@ func (self *Renderer) Send(path string) {
|
||||
|
||||
*/
|
||||
func openImage(path string, c chan string) {
|
||||
fw, fh := getFontWidth()
|
||||
fw, fh := utils.GetFontWidth()
|
||||
var im *ueberzug.Image
|
||||
if path != "stop" {
|
||||
extractedImage := getImagePath(path)
|
||||
img2, _ := getImg(extractedImage)
|
||||
img2, _ := GetImg(extractedImage)
|
||||
im, _ = ueberzug.NewImage(img2, int(float32(IMG_X)*fw)+viper.GetInt("ADDITIONAL_PADDING_X"), int(float32(IMG_Y)*fh)+viper.GetInt("ADDITIONAL_PADDING_Y"))
|
||||
}
|
||||
d := <-c
|
||||
@ -75,12 +80,12 @@ func getImagePath(path string) string {
|
||||
a, err := CONN.ListInfo(path)
|
||||
var extractedImage string
|
||||
if err == nil && len(a) != 0 {
|
||||
if val, err := cache.GetFromCache(a[0]["artist"], a[0]["album"]); err == nil {
|
||||
extractedImage = val
|
||||
if cache.Exists(a[0]["artist"], a[0]["album"]) {
|
||||
extractedImage = cache.GenerateName(a[0]["artist"], a[0]["album"])
|
||||
} else {
|
||||
imagePath := cache.AddToCache(a[0]["artist"], a[0]["album"])
|
||||
absPath := viper.GetString("MUSIC_DIRECTORY") + path
|
||||
extractedImage = extractImageFromFile(absPath, imagePath)
|
||||
imagePath := cache.GenerateName(a[0]["artist"], a[0]["album"])
|
||||
absPath := utils.CheckDirectoryFmt(viper.GetString("MUSIC_DIRECTORY")) + path
|
||||
extractedImage = utils.ExtractImageFromFile(absPath, imagePath)
|
||||
if extractedImage == viper.GetString("DEFAULT_IMAGE_PATH") && viper.GetString("GET_COVER_ART_FROM_LAST_FM") == "TRUE" {
|
||||
downloadedImage, err := getImageFromLastFM(a[0]["artist"], a[0]["album"], imagePath)
|
||||
if err == nil {
|
||||
@ -88,7 +93,6 @@ func getImagePath(path string) string {
|
||||
extractedImage = downloadedImage
|
||||
} else {
|
||||
NOTIFICATION_SERVER.Send("Falling Back to Default Image.")
|
||||
cache.PointToDefault(a[0]["artist"], a[0]["album"])
|
||||
}
|
||||
} else {
|
||||
NOTIFICATION_SERVER.Send("Extracted Image Successfully")
|
||||
@ -97,3 +101,22 @@ func getImagePath(path string) string {
|
||||
}
|
||||
return extractedImage
|
||||
}
|
||||
|
||||
func GetImg(uri string) (image.Image, error) {
|
||||
f, err := os.Open(uri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
img, _, err := image.Decode(f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fw, fh := utils.GetFontWidth()
|
||||
img = resize.Resize(
|
||||
uint(float32(IMG_W)*(fw+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_X")))), uint(float32(IMG_H)*(fh+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_Y")))),
|
||||
img,
|
||||
resize.Bilinear,
|
||||
)
|
||||
return img, nil
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ togglePlayBack : [ "p", "SPACE", "]" ] # using the quotes is neccessary.
|
||||
# 3. Fallback to the default image.
|
||||
#
|
||||
#
|
||||
CACHE_DIR : "/path/to/the/cache/Directory" # for e.g "~/.config/goMP/cache/" Please Note that adding a / at the end is neccessary.
|
||||
CACHE_DIR : "/path/to/the/cache/Directory" # for e.g "~/.config/goMP/cache/"
|
||||
# You will have to manually create this directory.
|
||||
CACHE_FILE : "/path/to/the/cache/file" # Cache file stores the path to all the images ( think of it like a database. )
|
||||
# Soon will be deprecated.
|
||||
|
@ -1,14 +1,12 @@
|
||||
package main
|
||||
package utils
|
||||
|
||||
import (
|
||||
"image"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/bogem/id3v2"
|
||||
"github.com/mewkiz/flac"
|
||||
"github.com/mewkiz/flac/meta"
|
||||
"github.com/nfnt/resize"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
@ -64,41 +62,23 @@ func GetFlacImage(songPath, imagePath string) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func extractImageFromFile(uri string, imagePath string) string {
|
||||
func ExtractImageFromFile(uri string, imagePath string) string {
|
||||
_i := imagePath
|
||||
if strings.HasSuffix(uri, ".mp3") {
|
||||
imagePath := GetMp3Image(uri, imagePath)
|
||||
if imagePath == "" {
|
||||
Copy(viper.GetString("DEFAULT_IMAGE_PATH"), _i)
|
||||
return viper.GetString("DEFAULT_IMAGE_PATH")
|
||||
} else {
|
||||
return imagePath
|
||||
}
|
||||
} else if strings.HasSuffix(uri, ".flac") {
|
||||
imagePath := GetFlacImage(uri, imagePath)
|
||||
if imagePath == "" {
|
||||
Copy(viper.GetString("DEFAULT_IMAGE_PATH"), _i)
|
||||
return viper.GetString("DEFAULT_IMAGE_PATH")
|
||||
} else {
|
||||
return imagePath
|
||||
}
|
||||
} else {
|
||||
Copy(viper.GetString("DEFAULT_IMAGE_PATH"), _i)
|
||||
return viper.GetString("DEFAULT_IMAGE_PATH")
|
||||
}
|
||||
}
|
||||
|
||||
func getImg(uri string) (image.Image, error) {
|
||||
f, err := os.Open(uri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
img, _, err := image.Decode(f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fw, fh := getFontWidth()
|
||||
img = resize.Resize(
|
||||
uint(float32(IMG_W)*(fw+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_X")))), uint(float32(IMG_H)*(fh+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_Y")))),
|
||||
img,
|
||||
resize.Bilinear,
|
||||
)
|
||||
return img, nil
|
||||
return imagePath
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package main
|
||||
package utils
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
@ -14,7 +15,7 @@ type winsize struct {
|
||||
Ypixel uint16
|
||||
}
|
||||
|
||||
func getWidth() *winsize {
|
||||
func GetWidth() *winsize {
|
||||
ws := &winsize{}
|
||||
retCode, _, errno := syscall.Syscall(syscall.SYS_IOCTL,
|
||||
uintptr(syscall.Stdin),
|
||||
@ -27,14 +28,14 @@ func getWidth() *winsize {
|
||||
return ws
|
||||
}
|
||||
|
||||
func getFontWidth() (float32, float32) {
|
||||
g := getWidth()
|
||||
func GetFontWidth() (float32, float32) {
|
||||
g := GetWidth()
|
||||
fw := (float32(g.Xpixel) / float32(g.Col))
|
||||
fh := (float32(g.Ypixel) / float32(g.Row))
|
||||
return fw, fh
|
||||
}
|
||||
|
||||
func strTime(e float64) string {
|
||||
func StrTime(e float64) string {
|
||||
a := int(e)
|
||||
var min, seconds string
|
||||
if a/60 < 10 {
|
||||
@ -52,24 +53,24 @@ func strTime(e float64) string {
|
||||
return min + ":" + seconds
|
||||
}
|
||||
|
||||
func insertAt(inputString, stringTobeInserted string, index int) string {
|
||||
func InsertAt(inputString, stringTobeInserted string, index int) string {
|
||||
s := inputString[:index] + stringTobeInserted + inputString[index:]
|
||||
return s
|
||||
}
|
||||
|
||||
func getText(width, percentage float64, eta string) string {
|
||||
func GetText(width, percentage float64, eta string) string {
|
||||
q := "[#000000:#ffffff:b]"
|
||||
var a string
|
||||
a += strings.Repeat(" ", int(width)-len(eta))
|
||||
a = insertAt(a, eta, int(width/2)-10)
|
||||
a = insertAt(a, "[-:-:-]", int(width*percentage/100))
|
||||
a = InsertAt(a, eta, int(width/2)-10)
|
||||
a = InsertAt(a, "[-:-:-]", int(width*percentage/100))
|
||||
q += a
|
||||
return q
|
||||
}
|
||||
|
||||
func ConvertToArray() []string {
|
||||
func ConvertToArray(ArtistTree map[string]map[string]map[string]string) []string {
|
||||
var p []string
|
||||
for k2, v := range ARTIST_TREE {
|
||||
for k2, v := range ArtistTree {
|
||||
p = append(p, k2)
|
||||
for k1, v1 := range v {
|
||||
p = append(p, k1)
|
||||
@ -81,7 +82,7 @@ func ConvertToArray() []string {
|
||||
return p
|
||||
}
|
||||
|
||||
func formatString(a interface{}) string {
|
||||
func FormatString(a interface{}) string {
|
||||
if a == "play" {
|
||||
return "Playing"
|
||||
} else if a == "1" {
|
||||
@ -94,3 +95,44 @@ func formatString(a interface{}) string {
|
||||
return "Paused"
|
||||
}
|
||||
}
|
||||
|
||||
func Copy(sourceImage, destinationImage string) error {
|
||||
source, err := ioutil.ReadFile(sourceImage)
|
||||
if err != nil {
|
||||
return err
|
||||
} else {
|
||||
err = ioutil.WriteFile(destinationImage, source, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func Join(stringSlice []string) string {
|
||||
var _s string = stringSlice[0]
|
||||
for i := 1; i < len(stringSlice); i++ {
|
||||
if _s != "" {
|
||||
_s += ("/" + stringSlice[i])
|
||||
}
|
||||
}
|
||||
return _s
|
||||
}
|
||||
|
||||
func GetFormattedString(s string, width int) string {
|
||||
if len(s) < width {
|
||||
s += strings.Repeat(" ", (width - len(s)))
|
||||
} else {
|
||||
s = s[:(width - 2)]
|
||||
s += " "
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func CheckDirectoryFmt(path string) string {
|
||||
if strings.HasSuffix(path, "/") {
|
||||
return path
|
||||
} else {
|
||||
return path + "/"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user