Kategorien
Programming Languages Rust rust-taglib

Announcement of Rust-TagLib 0.0.1

Rust-taglib provides Rust bindings to the TagLib library. TagLib is a library for reading and editing meta data information of various audio formats. Recently the Rust wrapper supports the operations exposed by the simple C binding interface only.

Example #1: Reading some tags

The following example prints some meta data information from given file

// give an alias to crate name  to shorten access
extern crate rust_taglib as taglib;

use std::path::Path;

fn main() {
    // construct path to file we wish to gain information from
    let file = Path::new("/some/file/reference");

    //  open file
    let meta = taglib::Metadata::new_from_file(file).unwrap();

    println!("Info for: {:?}",file.file_name().unwrap());

    // print some meta data contents 
    println!("* Artist:t{}", meta.get_artist().unwrap());
    println!("* Album:t{}", meta.get_album().unwrap());
    println!("* Tilte:t{}", meta.get_title().unwrap());
    println!("* Genre:t{}", meta.get_genre().unwrap());
}

The file does not need to be close explicitly instead all resources will be freed the value goes out of scope. This is achieved by implementing the Drop trait for the Metadata struct:

/// destructor to free resources
impl Drop for Metadata {
    fn drop(&mut self) {
        unsafe {
            if self.fd.is_some() {
                // free externally allocated strings
                taglib_sys::taglib_tag_free_strings();
                // free externally allocated resources
                taglib_sys::taglib_file_free(self.fd.unwrap());
            }
        }
        self.fd = None;
    }
}

Example #2: Modifing a tag

Next we want to modify the content of some tag and persist it:

extern crate rust_taglib as taglib;

use std::path::Path;

fn main() {
  let file = Path::new("/some/file/reference");

  match Metadata::new_from_file(file) {
          Ok(tag_data) => {
              // load and print old title information
              let title = tag_data.get_title().unwrap();
              println!("Old title is {}", title)

              // set title tag to a new value
              tag_data.set_title("my changed title");

              // finally save the changes back to file
              tag_data.save();
          }
          Err(e) => panic!(e)
      };
}

For bug reports or further suggestions file some issue on Bitbucket.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

16 + 8 =