File: taglib.rb

package info (click to toggle)
ruby-taglib 1.1-7
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 92 kB
  • ctags: 200
  • sloc: ruby: 1,230; sh: 25; makefile: 3
file content (252 lines) | stat: -rw-r--r-- 5,350 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# Copyright (C) 2004 Neil Stevens <neil@hakubi.us>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
# THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name(s) of the author(s) shall not be
# used in advertising or otherwise to promote the sale, use or other dealings
# in this Software without prior written authorization from the author(s).

require 'dl'
require 'dl/import'

begin
	require 'mahoro'
	module TagLib
		MAHORO_PRESENT = true
	end
rescue Exception => e
	module TagLib
		MAHORO_PRESENT = false
	end
end

module TagLib

extend DL::Importable

begin
	dlload 'libtag_c.so'
rescue
	begin
		dlload 'libtag_c.dylib'
	rescue
		raise 'libtag_c not found or uses a filename not looked for.'
	end
end

File_Type =
[
	MPEG = 0,
	OggVorbis = 1,
	FLAC = 2,
	MPC = 3
]

extern 'void* taglib_file_new(char*)'
extern 'void* taglib_file_new_type(char*, int)'
extern 'void taglib_file_free(void*)'
extern 'void* taglib_file_tag(void*)'
extern 'void* taglib_file_audioproperties(void*)'
extern 'void* taglib_file_save(void*)'

extern 'char* taglib_tag_title(void*)'
extern 'char* taglib_tag_artist(void*)'
extern 'char* taglib_tag_album(void*)'
extern 'char* taglib_tag_comment(void*)'
extern 'char* taglib_tag_genre(void*)'
extern 'uint taglib_tag_year(void*)'
extern 'uint taglib_tag_track(void*)'
extern 'void taglib_tag_set_title(void*, char*)'
extern 'void taglib_tag_set_artist(void*, char*)'
extern 'void taglib_tag_set_album(void*, char*)'
extern 'void taglib_tag_set_comment(void*, char*)'
extern 'void taglib_tag_set_genre(void*, char*)'
extern 'void taglib_tag_set_year(void*, uint)'
extern 'void taglib_tag_set_track(void*, uint)'

extern 'int taglib_audioproperties_length(void*)'
extern 'int taglib_audioproperties_bitrate(void*)'
extern 'int taglib_audioproperties_samplerate(void*)'
extern 'int taglib_audioproperties_channels(void*)'

class BadPath < Exception
end

class BadFile < Exception
end

class BadTag < Exception
end

class BadAudioProperties < Exception
end

class File

	def initialize(p)
		@path = p
		if not @path
			raise BadPath.new
		end

		if MAHORO_PRESENT
			mahoro = Mahoro.new
			mahoro.flags = Mahoro::NONE
			mime = mahoro.file(@path)
			type = taglibForMime(mime)
		else
			type = nil
		end

		if type
			@file = TagLib.taglib_file_new_type(@path, type)
		else
			@file = TagLib.taglib_file_new(@path)
		end

		if not @file
			@path = nil
			raise BadFile.new
		end
	end

	def save
		TagLib.taglib_file_save(@file)
	end

	def close
		if @file
			TagLib.taglib_file_free(@file)
		end
		@path = nil
		@file = nil
		@tag = nil
		@audio = nil
	end

	def title
		return TagLib.taglib_tag_title(tag)
	end

	def title=(string)
		TagLib.taglib_tag_set_title(tag, string)
	end

	def artist
		return TagLib.taglib_tag_artist(tag)
	end

	def artist=(string)
		TagLib.taglib_tag_set_artist(tag, string)
	end

	def album
		return TagLib.taglib_tag_album(tag)
	end

	def album=(string)
		TagLib.taglib_tag_set_album(tag, string)
	end

	def comment
		return TagLib.taglib_tag_comment(tag)
	end

	def comment=(string)
		TagLib.taglib_tag_set_comment(tag, string)
	end

	def genre
		return TagLib.taglib_tag_genre(tag)
	end

	def genre=(string)
		TagLib.taglib_tag_set_genre(tag, string)
	end

	def year
		return TagLib.taglib_tag_year(tag)
	end

	def year=(uint)
		TagLib.taglib_tag_set_year(tag, uint)
	end

	def track
		return TagLib.taglib_tag_track(tag)
	end

	def track=(uint)
		TagLib.taglib_tag_set_track(tag, uint)
	end

	def length
		return TagLib.taglib_audioproperties_length(audio)
	end

	def bitrate
		return TagLib.taglib_audioproperties_bitrate(audio)
	end

	def samplerate
		return TagLib.taglib_audioproperties_samplerate(audio)
	end

	def channels
		return TagLib.taglib_audioproperties_channels(audio)
	end

private
	def tag
		if not @tag
			@tag = TagLib.taglib_file_tag(@file)
			if not @tag
				raise BadTag.new
			end
		end
		return @tag
	end

	def audio
		if not @audio
			@audio = TagLib.taglib_file_audioproperties(@file)
			if not @audio
				raise BadAudioProperties.new
			end
		end
		return @audio
	end

	def taglibForMime(mime)
		if mime.include?('MP3')
			return TagLib::MPEG
		end

		if mime.include?('Ogg') or mime.include?('ogg')
			if mime.include?('Vorbis') or mime.include?('vorbis')
				return TagLib::OggVorbis
			elsif mime.include?('FLAC')
				return TagLib::FLAC
			end
		end

		return nil
	end
end

end