 Deutsche Version
  
	Deutsche Version
	
	Features
	Media files often contain metadata. This extension extracts metadata from media files and makes them available. The 
	metadata can be extracted from physically existing files as well as from streaming files (e.g. "https://...mp3). All 
	data can be completed by program.
	The UrsMediaNotification 
	extension can accept the retrieved metadata directly (later !!!). An album image contained in the metadata can be saved 
	or passed directly to an
	
	Image component.
	
	
		
			| Version | Adjustments | 
		
			| 1.0 (2021-07-06) | Initial version | 
		
			| 1.1 (2024-09-04) | Adaptations to Android 14 | 
	
	
	
	Download
	The  UrsAI2MediaHelper 
	ZIP archive for download. The archive contains the source code, the compiled binary for uploading to the App Inventor 
	and a sample application.
	Usage
	The extension is a wrapper for the Android
	
	MediaMetadataRetriever class.
	Test data
	A test file with metadata is available at the address
	https://ullisroboterseite.de/test.mp3. 
	The example contains the same file as an asset file.
	Laod data
	The main methods are LoadMetaData and
	LoadMetaDataAsync. These two methods extract the 
	metadata from a media file. The following values are valid for the Source parameter 
	:
	
		
			| Type | Prefix | Example | 
		
			| URL | http or https | https://ullisroboterseite.de/test.mp3 | 
		
			| Asset | // or nothing | //test.mp3 or test.mp3 | 
		
			| File, relative path | / | /data/user/0/edu.mit.appinventor.aicompanion3/test.mp3 | 
		
			| File, absolute path | file:/// | file:///Android/data/edu.mit.appinventor.aicompanion3/test.mp3 | 
	
	If an invalid file specification is entered, the specified file does not exist or is not a media file, it can take 
	up to 30 seconds for the MediaMetadataRetriever to recognize this and return. This 
	is especially true when the files are obtained from the Internet. The 
	Timeout property can be used to define the maximum time to wait for the response.
	LoadMetaData waits for the response from the MediaMetadataRetriever 
	and returns whether the process was successful. The application remains inactive for this time.
	LoadMetaDataAsync loads the metadata in a separate 
	thread and reports the result via the AfterLoadMetaData 
	event. The application remains active while the metadata is being retrieved. However, you have to make sure that you 
	do not access the data before the event has been triggered with the parameter 
	Success = true.
	Note: 
	It is not the case that all metadata is always present in each media file.
	Album image
	The following values are valid for property AlbumImageFile;
	
		
			| Type | Prefix | Example | 
		
			| URL | http or https | https://ullisroboterseite.de/ulli.png | 
		
			| Asset | // or nothing | //ulli.png or
			ulli.png | 
		
			| File, relative path | / | /data/user/0/edu.mit.appinventor.aicompanion3/ulli.png | 
		
			| Fiel, absolute path | file:/// | file:///Android/data/edu.mit.appinventor.aicompanion3/ulli.png | 
	
	When specifying an URL, the image is loaded synchronously. This can take some time with large files or slow connections. 
	Another possibility is to use an extension that enables an asynchronous (concurrent) download of the file ( e.g. the
	
	ImageLoader extension ).
	The properties AlbumImageWidthDip,
	AlbumImageHeightDip, 
	AlbumImageWidthRaw and 
	AlbumImageHeightRaw return informations on the size of the graphic. The size 
	of the graphic can be adjusted with the methods ResizeAlbumImageDip 
	or ResizeAlbumImageRaw. The
	SaveAlbumImage and
	SaveAlbumImageToAppDir methods save the graphic as a file 
	and can be made available to other file-based components.
	The ToImageBlock method displays the graphic in the 
	specified
	
	Image component.
	File support
	
	
		- GetVolumes: returns a list of the root directories 
		of the data strorages
- GetAppDataDir: returns the path to the private 
		application directory
- GetDownloadDir: returns the path to the download 
		directory
- GetFileList: returns a list with the names of files in a directory
- RemoveFile: removes the specified file
- RemoveFileFromAppDir: removes a file in the private 
		application directory
Error handling
	Errors are reported via the 
	
	Screen.ErrorOccurred event.
	
	Reference
	Properties
	
		- 
		
		Album 
- Gests or sets the album title for the media.
- AlbumImageFile 
- Reads the album image from the specified file. The file name can only valid if it is set by program. After calling
		LoadMetaData or 
		LoadMetaDataAsync, this field is empty.
 If the album image cannot be 
		loaded, the 
		
		Screen.ErrorOccurred event is triggered with the error number 17500.
- AlbumImageHeightDip 
- Gets the height of the album image in DIP  (Device 
		Independent Pixel) units.
- AlbumImageHeightRaw 
- Gets the height of the album image in units of pixels.
- AlbumImageWidthDip 
- Gets the width of the album image in DIP  (Device 
		Independent Pixel) units.
- AlbumImageWidthRaw 
- Gets the width of the album image in units of pixels.
- 
		
		Artist 
- Gets or sets the artist / performer.
- 
		
		Author 
- Gets or sets the author.
- 
		
		Duration 
- Gets or sets the duration in milliseconds.
- DurationFormattedLong 
- Gets the duration as text in the format H:MM:SS.
- DurationFormattedShort 
- Gets the duration as text in the format M:SS.
- DurationSeconds 
- Gets or sets the duration in seconds.
- 
		
		Genre 
- Gets or sets the genre of the media.
- HasAlbumImage 
- Returns whether there is a valid album image.
- 
		
		MimeType 
- Gets or sets the MIME type.
- Timeout 
- Specifies how long (in seconds) to wait for metadata to be loaded from the Internet. The default is 3 seconds.
- 
		
		Title 
- Gets or sets the title of the media file.
- 
		
		Writer 
- Gets or sets the writer of the media file. 
- 
		
		Year 
- Gets or sets the year of creation.
Methods
	
		- GetAppDataDir (Prefix)
- Returns the path for the app sepcific directory. Calling GetAppDataDir()on my test 
		device (in the example below) returns the following result:
 file:///data/user/0/edu.mit.appinventor.aicompanion3/
 
- GetDownloadDir (Prefix)
- Returns the path for the download directory. Prefix is placed in front of 
		the name. Calling GetDownloadDir("file://")on my test device (in the example below) 
		returns the following result:
 file:///storage/emulated/0/Download
- GetFileList (Directory)
- Returns a list with the names of the files in the specified directory. The file:// 
		prefix for the Directory parameter is optional. Subdirectory names are preceded by "D:". Calling
		GetFileList(GetAppDataDir())on my test device for the example program returns a list 
		with the following elements:
  
- GetVolumes (Prefix)
- Returns a list of the installed volumes. The internal memory can usually be found under index 1, the external 
		SD card under index 2. Prefix is placed in front of the name. Calling
		getVolumes("file://)on my test device returns the following items :
 file:///storage/emulated/
 file:///storage/F277-0260/
- LoadMetaData (Source)
- Loads media metadata from the specified media file. For valid values for the parameter
		Source, see Load data. The return value is
		true if the metadata could be loaded successfully, otherwise
		false.
 The application is blocked during readout (see also 
		Load data and Timeout property).
- LoadMetaDataAsync (Source)
- Loads media metadata from the specified media file in a separate thread. For valid values for the parameter
		Source, see Load data. After the retrieving process is complete, 
		the AfterLoadMetaData event is triggered. No 
		valid metadata is available before the event has been triggered with the parameter 
		Success = true.
 The application is
		not blocked during the readout (see also Load data and
		Timeout property).
- RemoveFile (Path)
- Deletes the specified file. The prefix file:// for the parameter
		Path is optional.
 If the file could not be deleted, the
		
		
		
		Screen.ErrorOccurred is triggered with the error number 17512.
- RemoveFileFromAppDir (Filename)
- Deletes the specified file in the private application directory. Filename 
		can contain subdirectories relative to the private application directory (see 
		GetAppDataDir).
 If the file could not be deleted, the
		
		
		
		Screen.ErrorOccurred is triggered with the error number 17512.
- ResizeAlbumImageDip (NewWidth,
		NewHeight)
- Resizes the album image. The size data is given in the unit DIP (Device 
		Independent Pixel).
 If one of the size specifications is ≤ 0, the 
		
		Screen.ErrorOccurred event is triggered with the error number 17511.
- ResizeAlbumImageRaw (NewWidth,
		NewHeight)
- Resizes the album image. 
		The size data is given in the unit Pixel.
 If one of the size specifications is ≤ 0, the 
		
		Screen.ErrorOccurred event is triggered with the error number 17511.
- SaveAlbumImage (Path, Format)
- Saves the album image under the specified file path. Format: 0:
		PNG, 1: JPEG. The file extension
		.png or .jpg is not added automatically, but must 
		be specified appropriately in parameter Path. The prefix
		file:// for the parameter Path is optional.
 If the file could not be written, the 
		
		Screen.ErrorOccurred is triggered with the error number 17512.
 If the Format 
		parameter has a value other than 0 or 1, the 
		
		Screen.ErrorOccurred is triggered with the error number 17513.
 
- SaveAlbumImageToAppDir (Filename,
		Format)
- Saves the file relative to the private application directory (see 
		GetAppDataDir). Format: 0:
		PNG, 1: JPEG. The file extension
		.png or .jpg is not added automatically, but must 
		be specified appropriately in parameter Path.
 If the file could not be written, 
		the 
		
		
		Screen.ErrorOccurred is triggered with the error number 17512.
 If the
		Format parameter has a value other than 0 or 1, the 
		
		Screen.ErrorOccurred is triggered with the error number 17513.
- ToImageBlock (ImageBlock)
- If present, displays the album image in the specified
		
		Image component.
 If the specified component is not of the type
		
		Image, the 
		
		Screen.ErrorOccurred is triggered with the error number 17514.
Events
	
		- AfterLoadMetaData (Success)
- The event is triggered when the result of the retrieving process is available after calling
		LoadMetaDataAsync. Success 
		has the value true if metadata could be read in, otherwise the value
		false. 
Example
	The download archive contains a sample project:
	
	 MediaHelper Test
	 MediaHelper Test
	The example can load media metadata synchronously (Load Media Metadata) and asynchronously 
	(Load Media Metadata async). The album image can be saved in the private folder of the 
	app (Save album image) and deleted (Remove file). The
	List files button lists the files in the app's private folder.
	
	
	I have collected a few tips for creating your own extensions: 
	
	AI2 FAQ: Developing extensions 
	.