*добавлено получение закодированного тэга

This commit is contained in:
K1ndWha1e committed 2026-07-18 22:14:05 +03:00
1 parent 4196efa9a6
commit fdc72ae653
4 files changed
+57 -25

No files matched your search

+8 -3
View File
@@ -4,9 +4,9 @@ import os
import metadata import metadata
fn id3(){ fn id3(){
// mut audio := os.open("./data/АЛИСА 11000.mp3") or { panic(err) } mut audio := os.open("./data/АЛИСА 11000.mp3") or { panic(err) }
// mut audio := os.open("./data/Глава 2. 16 и 17 июля.mp3") or { panic(err) } // mut audio := os.open("./data/Глава 2. 16 и 17 июля.mp3") or { panic(err) }
mut audio := os.open("./data/01_01.mp3") or { panic(err) } // mut audio := os.open("./data/01_01.mp3") or { panic(err) }
// mut audio := os.open("./test.mp3") or { panic(err) } // mut audio := os.open("./test.mp3") or { panic(err) }
defer { defer {
@@ -39,7 +39,12 @@ fn id3(){
wav.id3v24.get_full_size(mut audio) wav.id3v24.get_full_size(mut audio)
wav.id3v24.fill_tag(mut audio) wav.id3v24.fill_tag(mut audio)
println(wav.id3v24.to_v1()) println(wav.id3v24.to_v1())
wav.id3v24.tit2.encode_size(4) // wav.id3v24.tit2.encode_size(4)
flex := wav.id3v24.tit2.get_encoded_frame_tag(4)
print(flex)
// println(wav.id3v24.tit2) // println(wav.id3v24.tit2)
} }
+34 -10
View File
@@ -11,10 +11,12 @@ pub struct Frame {
encoding_name string encoding_name string
data string data string
name string name string
encoding_name_idx u8
addition []u8 addition []u8
encoded_data []u8
apic ?[]u8 apic ?[]u8
encoded_size ?[]u8 encoded_size []u8
encoded_data ?[]u8 modified bool
} }
// Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE // Во врейме первый байт указывает кодировку 0 - ISO-8859-1 (Latin-1), 1 - UTF-16LE
@@ -42,6 +44,8 @@ fn (mut frame Frame) fill_frame(bytes []u8, start_position u64, idv3_version u8)
else { "UTF-8" } else { "UTF-8" }
} }
frame.encoding_name_idx = u8(bytes[frame.start+10])
if frame.name.to_lower() == "apic" { if frame.name.to_lower() == "apic" {
// Дополнительные байты с информацией (MIME) // Дополнительные байты с информацией (MIME)
frame.addition = bytes[frame.start+10..frame.start+24] frame.addition = bytes[frame.start+10..frame.start+24]
@@ -64,23 +68,43 @@ pub fn (mut frame Frame) encode_size(idv3_version u8) {
[u64(21), u64(14), u64(7), u64(0x7F)] [u64(21), u64(14), u64(7), u64(0x7F)]
} }
mut encoded_size := []u8{len: 4, cap: 16} mut encoded_size := []u8{len: 4}
encoded_size << u8((frame.size >> stride[0]) & stride[3]) encoded_size[0] = u8((frame.size >> stride[0]) & stride[3])
encoded_size << u8((frame.size >> stride[1]) & stride[3]) encoded_size[1] = u8((frame.size >> stride[1]) & stride[3])
encoded_size << u8((frame.size >> stride[2]) & stride[3]) encoded_size[2] = u8((frame.size >> stride[2]) & stride[3])
encoded_size << u8(frame.size & stride[3]) encoded_size[3] = u8(frame.size & stride[3])
frame.encoded_size = encoded_size frame.encoded_size = encoded_size
// fnums2 := [1, 10, 100].to_fixed_size()
} }
// Кодируем кадр для дальнейшей записи // Кодируем кадр для дальнейшей записи
pub fn (mut frame Frame) encode_frame(idv3_version u8) { pub fn (mut frame Frame) encode_frame(idv3_version u8) {
encoded_data := iconv.vstring_to_encoding(frame.data, frame.encoding_name) or { [u8(0), u8(0), u8(0), u8(0)] } encoded_data := iconv.vstring_to_encoding(frame.data, frame.encoding_name) or { [u8(0), u8(0), u8(0), u8(0)] }
frame.encoded_data = encoded_data frame.encoded_data = encoded_data
frame.size = u64(encoded_data.len)
//
frame.size = u64(encoded_data.len + 10)
frame.encode_size(idv3_version) frame.encode_size(idv3_version)
} }
// Получить закодированый тэг
pub fn (mut frame Frame) get_encoded_frame_tag(idv3_version u8) []u8 {
frame.encode_frame(idv3_version)
// Название тэга
mut encoded_tag := frame.name.bytes()
// Флаги, оставляем пустыми
encoded_tag << []u8{len: 2}
// Идекс кодировщика текста
encoded_tag << frame.encoding_name_idx
// Четыре числа на закодированный размер
encoded_tag << frame.encoded_size
// Уже сами данные
encoded_tag << frame.encoded_data
// Запас нулей чтобы не пересчитывать весь фрейм при маленьком редактировании
encoded_tag << []u8{len: 10}
return encoded_tag
}
+11 -9
View File
@@ -69,17 +69,19 @@ pub fn (mut id3v24 ID3v24) fill_tag(mut audio File) {
} }
// Конвертировать ID3 v2.3 в ID3 v1 // Конвертировать ID3 v2.3 в ID3 v1
pub fn (id3v23 ID3v24) to_v1() ID3v1 { pub fn (id3v24 ID3v24) to_v1() ID3v1 {
return ID3v1{ return ID3v1{
genre: id3v23.tcon.data genre: id3v24.tcon.data
title: id3v23.tit2.data title: id3v24.tit2.data
artist: id3v23.tpe2.data artist: id3v24.tpe2.data
album: id3v23.talb.data album: id3v24.talb.data
track: id3v23.trck.data.split('/')[0] track: id3v24.trck.data.split('/')[0]
year: id3v23.tdrc.data year: id3v24.tdrc.data
comment: id3v23.comment.data comment: id3v24.comment.data
} }
} }
pub fn insert(mut audio File) {
pub fn flexd() {
} }
+4 -3
View File
@@ -28,7 +28,8 @@ pub struct ID3v23 {
tcop Frame // Композитор (автор) tcop Frame // Композитор (автор)
apic Frame // Обложка apic Frame // Обложка
comment Frame // Комментарий comment Frame // Комментарий
others []Frame unknown Frame // Затычка
others []Frame // Остальные фреймы
version u8 = 3 // Версия тэга version u8 = 3 // Версия тэга
embedded bool // Присутвует ли тэг embedded bool // Присутвует ли тэг
} }
@@ -47,13 +48,13 @@ pub struct ID3v24 {
tcop Frame // Композитор (автор) tcop Frame // Композитор (автор)
apic Frame // Обложка apic Frame // Обложка
comment Frame // Комментарий comment Frame // Комментарий
others []Frame modified_frames []Frame // Затычка
others []Frame // Остальные фреймы
version u8 = 4 // Версия тэга version u8 = 4 // Версия тэга
embedded bool // Присутвует ли тэг embedded bool // Присутвует ли тэг
} }
@[heap]
pub struct Audio { pub struct Audio {
pub mut: pub mut:
id3v1 ID3v1 id3v1 ID3v1