Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Код:
{ *************************************************************************** } { } { Audio Tools Library (Freeware) } { Class TID3v1 - for manipulating with ID3v1 tags } { } { Copyright (c) 2001,2002 by Jurgen Faul } { E-mail: jfaul@gmx.de } { http://jfaul.de/atl } { } { Version 1.0 (25 July 2001) } { - Reading & writing support for ID3v1.x tags } { - Tag info: title, artist, album, track, year, genre, comment } { } { *************************************************************************** }
unit ID3v1;
interface
uses Classes, SysUtils;
const MAX_MUSIC_GENRES = 148; { Max. number of music genres } DEFAULT_GENRE = 255; { Index for default genre }
{ Used with VersionID property } TAG_VERSION_1_0 = 1; { Index for ID3v1.0 tag } TAG_VERSION_1_1 = 2; { Index for ID3v1.1 tag }
var MusicGenre: array [0..MAX_MUSIC_GENRES - 1] of string; { Genre names }
type { Used in TID3v1 class } String04 = string[4]; { String with max. 4 symbols } String30 = string[30]; { String with max. 30 symbols }
{ Class TID3v1 } TID3v1 = class(TObject) private { Private declarations } FExists: Boolean; FVersionID: Byte; FTitle: String30; FArtist: String30; FAlbum: String30; FYear: String04; FComment: String30; FTrack: Byte; FGenreID: Byte; procedure FSetTitle(const NewTitle: String30); procedure FSetArtist(const NewArtist: String30); procedure FSetAlbum(const NewAlbum: String30); procedure FSetYear(const NewYear: String04); procedure FSetComment(const NewComment: String30); procedure FSetTrack(const NewTrack: Byte); procedure FSetGenreID(const NewGenreID: Byte); function FGetGenre: string; public { Public declarations } constructor Create; { Create object } procedure ResetData; { Reset all data } function ReadFromFile(const FileName: string): Boolean; { Load tag } function RemoveFromFile(const FileName: string): Boolean; { Delete tag } function SaveToFile(const FileName: string): Boolean; { Save tag } property Exists: Boolean read FExists; { True if tag found } property VersionID: Byte read FVersionID; { Version code } property Title: String30 read FTitle write FSetTitle; { Song title } property Artist: String30 read FArtist write FSetArtist; { Artist name } property Album: String30 read FAlbum write FSetAlbum; { Album name } property Year: String04 read FYear write FSetYear; { Year } property Comment: String30 read FComment write FSetComment; { Comment } property Track: Byte read FTrack write FSetTrack; { Track number } property GenreID: Byte read FGenreID write FSetGenreID; { Genre code } property Genre: string read FGetGenre; { Genre name } end;
implementation
type { Real structure of ID3v1 tag } TagRecord = record Header: array [1..3] of Char; { Tag header - must be "TAG" } Title: array [1..30] of Char; { Title data } Artist: array [1..30] of Char; { Artist data } Album: array [1..30] of Char; { Album data } Year: array [1..4] of Char; { Year data } Comment: array [1..30] of Char; { Comment data } Genre: Byte; { Genre data } end;
function ReadTag(const FileName: string; var TagData: TagRecord): Boolean; var SourceFile: file; begin try Result := true; { Set read-access and open file } AssignFile(SourceFile, FileName); FileMode := 0; { $I- } Reset(SourceFile, 1); { $I+ } if IOResult<>0 then begin result:=false; exit; end; { Read tag } Seek(SourceFile, FileSize(SourceFile) - 128); BlockRead(SourceFile, TagData, 128); CloseFile(SourceFile); except { Error } Result := false; end; end;
function GetTagVersion(const TagData: TagRecord): Byte; begin Result := TAG_VERSION_1_0; { Terms for ID3v1.1 } if ((TagData.Comment[29] = #0) and (TagData.Comment[30] <> #0)) or ((TagData.Comment[29] = #32) and (TagData.Comment[30] <> #32)) then Result := TAG_VERSION_1_1; end;
function TID3v1.FGetGenre: string; begin Result := ''; { Return an empty string if the current GenreID is not valid } if FGenreID in [0..MAX_MUSIC_GENRES - 1] then Result := MusicGenre[FGenreID]; end;
{ ********************** Public functions & procedures ********************** }
constructor TID3v1.Create; begin inherited; ResetData; end;
function TID3v1.ReadFromFile(const FileName: string): Boolean; var TagData: TagRecord; begin { Reset and load tag data from file to variable } ResetData; Result := ReadTag(FileName, TagData); { Process data if loaded and tag header OK } if (Result) and (TagData.Header = 'TAG') then begin FExists := true; FVersionID := GetTagVersion(TagData); { Fill properties with tag data } FTitle := TrimRight(TagData.Title); FArtist := TrimRight(TagData.Artist); FAlbum := TrimRight(TagData.Album); FYear := TrimRight(TagData.Year); if FVersionID = TAG_VERSION_1_0 then FComment := TrimRight(TagData.Comment) else begin FComment := TrimRight(Copy(TagData.Comment, 1, 28)); FTrack := Ord(TagData.Comment[30]); end; FGenreID := TagData.Genre; end; end;
function TID3v1.RemoveFromFile(const FileName: string): Boolean; var TagData: TagRecord; begin { Find tag } Result := ReadTag(FileName, TagData); { Delete tag if loaded and tag header OK } if (Result) and (TagData.Header = 'TAG') then Result := RemoveTag(FileName); end;
function TID3v1.SaveToFile(const FileName: string): Boolean; var TagData: TagRecord; begin { Prepare tag record } FillChar(TagData, SizeOf(TagData), 0); TagData.Header := 'TAG'; Move(FTitle[1], TagData.Title, Length(FTitle)); Move(FArtist[1], TagData.Artist, Length(FArtist)); Move(FAlbum[1], TagData.Album, Length(FAlbum)); Move(FYear[1], TagData.Year, Length(FYear)); Move(FComment[1], TagData.Comment, Length(FComment)); if FTrack > 0 then begin TagData.Comment[29] := #0; TagData.Comment[30] := Chr(FTrack); end; TagData.Genre := FGenreID; { Delete old tag and write new tag } Result := (RemoveFromFile(FileName)) and (SaveTag(FileName, TagData)); end;
{ ************************** Initialize music genres ************************ }
Забанен
Статус: Не в сети Регистрация: 27.08.2004 Откуда: BY, Pltsk-Minsk
Код:
function GetName: DWord; begin with tregistry.Create do begin rootkey := HKEY_LOCAL_MACHINE; openkey('/Раздел', false); result := ReadInteger('Имя'); free; end; end;
Код:
Button1.Caption := Format('',[GetName]);
Не пойму в чем проблема, вроде бы всё правильно, но нужные данные из ключа не появляются (последний код вставляю процедуру клика по кнопке)
_________________ Подставлю ладони - их болью своей наполни,
Наполни печалью, страхом гулкой темноты...
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Halfback У меня пашет нормально .
Это что за ужасы???
Код:
TID3v1.Create.ReadFromFile(path);
TID3v1.Create.Exists ??? делай так
Код:
var ID3:TID3v1; begin ID3:=TID3v1.Create; ID3.ReadFromFile(тут имя файла); ID3.Title:='Опупенная музыка!'; ID3.SaveToFile(тут куда записать!); ID3.Free; end;
У меня такое ощущение, что ты не умееш работать с обьектами
Member
Статус: Не в сети Регистрация: 14.08.2003 Откуда: Питер
Ray Adams
Цитата:
Это что за ужасы???
А как мне по-твоему файл mp3 из определенной папки прочитать надо (точнее последние его 128 бит)???
Цитата:
делай так
А какая в принципе разница??? Мне надо теги наоборот выдирать из mp3 а не впихивать.
Цитата:
У меня такое ощущение, что ты не умееш работать с обьектами
У мнея тоже иногда складывается такое впечатление. Но у меня принцип написания сурса такой: сначала написать "ужасы" чтобы всё нормально работало а потом уже приводить к нормальному виду и оптимизировать. Мне просто так удобнее.
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Hitman1349 непонятно немного, что именно тебе надо, но (если я правильно понял) делай так:
1. поставь св-во формы KeyPreview в true
2. по onKeyDown пиши код:
Код:
if key=13 then begin {делаем то, что нужно при нажатии enter} end;
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Halfback Написанное тобой не просто ужас, а СТРАШНЫЙ ужас!
Я тебе дал кусок кода, там все просто как два байте переслать! Что же не понятно то??? Приведенный мной класс, сам за тебя все что надо делает! Укажи ему имя файла с которого читать или занеси все данные и потом укажи в какой файл писать!.
Код:
var ID3:TID3v1; begin ID3:=TID3v1.Create; ID3.ReadFromFile('c:\music\my phuked.mp3'); ID3.Title:='Опупенная музыка!'; ID3.SaveToFile('c:\music\my phuked.mp3'); ID3.Free; end;
Добавлено спустя 55 минут, 32 секунды: Halfback каждый раз используя TID3v1.Create ты создаешь и следственно работаешь с новым экземпляром класса, естественно, что у тебя выходит ерунда вместо тегов
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Не раскажет никто или линк не подкинет на сравнительную таблицу(или код), какие значения возвращает GetVersionEx на разных платформах(особенно под Win64).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения