added logger and tagger
This commit is contained in:
30
pkg/logging/logger.go
Normal file
30
pkg/logging/logger.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"os"
|
||||
)
|
||||
|
||||
// NewLogger создает и настраивает новый экземпляр slog.Logger.
|
||||
func NewLogger(logLevel string) *slog.Logger {
|
||||
var level slog.Level
|
||||
switch logLevel {
|
||||
case "debug":
|
||||
level = slog.LevelDebug
|
||||
case "info":
|
||||
level = slog.LevelInfo
|
||||
case "warn":
|
||||
level = slog.LevelWarn
|
||||
case "error":
|
||||
level = slog.LevelError
|
||||
default:
|
||||
level = slog.LevelInfo
|
||||
}
|
||||
|
||||
opts := &slog.HandlerOptions{
|
||||
Level: level,
|
||||
}
|
||||
|
||||
handler := slog.NewTextHandler(os.Stdout, opts)
|
||||
return slog.New(handler)
|
||||
}
|
||||
61
pkg/tagger/id3.go
Normal file
61
pkg/tagger/id3.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package tagger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"gitea.mrixs.me/Mrixs/yamusic-bot/internal/model"
|
||||
"github.com/bogem/id3v2"
|
||||
)
|
||||
|
||||
// ID3Tagger реализует интерфейс interfaces.Tagger для работы с ID3-тегами.
|
||||
type ID3Tagger struct{}
|
||||
|
||||
// NewID3Tagger создает новый экземпляр теггера.
|
||||
func NewID3Tagger() *ID3Tagger {
|
||||
return &ID3Tagger{}
|
||||
}
|
||||
|
||||
// WriteTags записывает метаданные и обложку в указанный аудиофайл.
|
||||
func (t *ID3Tagger) WriteTags(filePath string, coverPath string, info *model.TrackInfo) error {
|
||||
tag, err := id3v2.Open(filePath, id3v2.Options{Parse: true})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open mp3 file for tagging: %w", err)
|
||||
}
|
||||
defer tag.Close()
|
||||
|
||||
tag.SetTitle(info.Title)
|
||||
tag.SetArtist(info.Artist)
|
||||
tag.SetAlbum(info.Album)
|
||||
tag.SetYear(strconv.Itoa(info.Year))
|
||||
tag.SetGenre(info.Genre)
|
||||
|
||||
// Добавляем номер трека, если он есть
|
||||
if info.TrackPosition > 0 {
|
||||
tag.AddTextFrame(tag.CommonID("Track number/Position in set"), id3v2.EncodingUTF8, strconv.Itoa(info.TrackPosition))
|
||||
}
|
||||
|
||||
// Встраиваем обложку
|
||||
if coverPath != "" {
|
||||
artwork, err := os.ReadFile(coverPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read cover file: %w", err)
|
||||
}
|
||||
|
||||
pic := id3v2.PictureFrame{
|
||||
Encoding: id3v2.EncodingUTF8,
|
||||
MimeType: "image/jpeg",
|
||||
PictureType: id3v2.PTFrontCover,
|
||||
Description: "Front Cover",
|
||||
Picture: artwork,
|
||||
}
|
||||
tag.AddAttachedPicture(pic)
|
||||
}
|
||||
|
||||
if err = tag.Save(); err != nil {
|
||||
return fmt.Errorf("failed to save id3 tags: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user