| 
									
										
										
										
											1992-05-27 14:06:59 +00:00
										 |  |  | # Recognizing image files based on their first few bytes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #-------------------------# | 
					
						
							|  |  |  | # Recognize sound headers # | 
					
						
							|  |  |  | #-------------------------# | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def what(filename): | 
					
						
							|  |  |  | 	f = open(filename, 'r') | 
					
						
							|  |  |  | 	h = f.read(32) | 
					
						
							|  |  |  | 	for tf in tests: | 
					
						
							|  |  |  | 		res = tf(h, f) | 
					
						
							|  |  |  | 		if res: | 
					
						
							|  |  |  | 			return res | 
					
						
							|  |  |  | 	return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------# | 
					
						
							|  |  |  | # Subroutines per image file type # | 
					
						
							|  |  |  | #---------------------------------# | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_rgb(h, f): | 
					
						
							|  |  |  | 	# SGI image library | 
					
						
							|  |  |  | 	if h[:2] == '\001\332': | 
					
						
							|  |  |  | 		return 'rgb' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_rgb) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_gif(h, f): | 
					
						
							|  |  |  | 	# GIF ('87 and '89 variants) | 
					
						
							|  |  |  | 	if h[:6] in ('GIF87a', 'GIF89a'): | 
					
						
							|  |  |  | 		return 'gif' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_gif) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-10-18 17:09:59 +00:00
										 |  |  | def test_pbm(h, f): | 
					
						
							|  |  |  | 	# PBM (portable bitmap) | 
					
						
							| 
									
										
										
										
											1992-06-03 16:48:44 +00:00
										 |  |  | 	if len(h) >= 3 and \ | 
					
						
							| 
									
										
										
										
											1992-10-18 17:09:59 +00:00
										 |  |  | 		h[0] == 'P' and h[1] in '14' and h[2] in ' \t\n\r': | 
					
						
							|  |  |  | 		return 'pbm' | 
					
						
							| 
									
										
										
										
											1992-05-27 14:06:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-10-18 17:09:59 +00:00
										 |  |  | tests.append(test_pbm) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_pgm(h, f): | 
					
						
							|  |  |  | 	# PGM (portable graymap) | 
					
						
							|  |  |  | 	if len(h) >= 3 and \ | 
					
						
							|  |  |  | 		h[0] == 'P' and h[1] in '25' and h[2] in ' \t\n\r': | 
					
						
							|  |  |  | 		return 'pgm' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_pgm) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_ppm(h, f): | 
					
						
							|  |  |  | 	# PPM (portable pixmap) | 
					
						
							|  |  |  | 	if len(h) >= 3 and \ | 
					
						
							|  |  |  | 		h[0] == 'P' and h[1] in '36' and h[2] in ' \t\n\r': | 
					
						
							|  |  |  | 		return 'ppm' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_ppm) | 
					
						
							| 
									
										
										
										
											1992-05-27 14:06:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_tiff(h, f): | 
					
						
							|  |  |  | 	# TIFF (can be in Motorola or Intel byte order) | 
					
						
							|  |  |  | 	if h[:2] in ('MM', 'II'): | 
					
						
							|  |  |  | 		return 'tiff' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_tiff) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_rast(h, f): | 
					
						
							|  |  |  | 	# Sun raster file | 
					
						
							|  |  |  | 	if h[:4] == '\x59\xA6\x6A\x95': | 
					
						
							|  |  |  | 		return 'rast' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_rast) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-06-03 16:48:44 +00:00
										 |  |  | def test_xbm(h, f): | 
					
						
							|  |  |  | 	# X bitmap (X10 or X11) | 
					
						
							|  |  |  | 	s = '#define ' | 
					
						
							|  |  |  | 	if h[:len(s)] == s: | 
					
						
							|  |  |  | 		return 'xbm' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_xbm) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1993-06-23 09:30:50 +00:00
										 |  |  | def test_jpeg(h, f): | 
					
						
							|  |  |  | 	# JPEG data in JFIF format | 
					
						
							|  |  |  | 	if h[6:10] == 'JFIF': | 
					
						
							|  |  |  | 		return 'jpeg' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tests.append(test_jpeg) | 
					
						
							| 
									
										
										
										
											1992-05-27 14:06:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #--------------------# | 
					
						
							|  |  |  | # Small test program # | 
					
						
							|  |  |  | #--------------------# | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  | 	import sys | 
					
						
							|  |  |  | 	recursive = 0 | 
					
						
							|  |  |  | 	if sys.argv[1:] and sys.argv[1] == '-r': | 
					
						
							|  |  |  | 		del sys.argv[1:2] | 
					
						
							|  |  |  | 		recursive = 1 | 
					
						
							|  |  |  | 	try: | 
					
						
							|  |  |  | 		if sys.argv[1:]: | 
					
						
							|  |  |  | 			testall(sys.argv[1:], recursive, 1) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			testall(['.'], recursive, 1) | 
					
						
							|  |  |  | 	except KeyboardInterrupt: | 
					
						
							|  |  |  | 		sys.stderr.write('\n[Interrupted]\n') | 
					
						
							|  |  |  | 		sys.exit(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def testall(list, recursive, toplevel): | 
					
						
							|  |  |  | 	import sys | 
					
						
							|  |  |  | 	import os | 
					
						
							|  |  |  | 	for filename in list: | 
					
						
							|  |  |  | 		if os.path.isdir(filename): | 
					
						
							|  |  |  | 			print filename + '/:', | 
					
						
							|  |  |  | 			if recursive or toplevel: | 
					
						
							|  |  |  | 				print 'recursing down:' | 
					
						
							|  |  |  | 				import glob | 
					
						
							|  |  |  | 				names = glob.glob(os.path.join(filename, '*')) | 
					
						
							|  |  |  | 				testall(names, recursive, 0) | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				print '*** directory (use -r) ***' | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			print filename + ':', | 
					
						
							|  |  |  | 			sys.stdout.flush() | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				print what(filename) | 
					
						
							|  |  |  | 			except IOError: | 
					
						
							|  |  |  | 				print '*** not found ***' |