added logger and tagger

This commit is contained in:
2025-06-23 08:43:51 +03:00
parent 20090e5bb1
commit 406dd18b79
4 changed files with 102 additions and 1 deletions

30
pkg/logging/logger.go Normal file
View 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
View 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
}