diff options
author | Yoni Rabkin <yoni@rabkins.net> | 2017-03-01 17:06:42 -0500 |
---|---|---|
committer | Yoni Rabkin <yoni@rabkins.net> | 2017-03-01 17:06:42 -0500 |
commit | 6601ba8ef710b8ed260773e18a3baa940a7adc3a (patch) | |
tree | 33e9b493e7bdccc57823fd364f6074a52faf626b | |
parent | 0b0bdd12eb97797d3c481de70871d64f42672a58 (diff) |
Move to a new emms-print-metadata.
The new emms-print-metadata is written in C++ and brings on board new
features from TagLib.
Patch by Petteri Hintsanen <petterih@iki.fi>.
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | doc/emms.texinfo | 2 | ||||
-rw-r--r-- | lisp/emms-info.el | 2 | ||||
-rw-r--r-- | src/emms-print-metadata.cpp | 112 |
6 files changed, 123 insertions, 4 deletions
@@ -19,6 +19,7 @@ Martin Schoenmakers <aiviru@diamond-age.net> Matthew Kennedy <mkennedy@gentoo.org> Michael Olson <mwolson@gnu.org> Nick Alcock <nix@esperi.org.uk> +Petteri Hintsanen <petterih@iki.fi> Tassilo Horn <tassilo@member.fsf.org> Thierry Volpiatto Trent Buck <trentbuck@gmail.com> @@ -35,8 +35,8 @@ lisp: docs: $(MAKE) -C $(DOCDIR) -emms-print-metadata: $(SRCDIR)/emms-print-metadata.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $(SRCDIR)/$@ $< `taglib-config --cflags --libs` -ltag_c +emms-print-metadata: $(SRCDIR)/emms-print-metadata.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $(SRCDIR)/$@ $< `taglib-config --cflags --libs` install: test -d $(SITELISP) || mkdir -p $(SITELISP) @@ -1,3 +1,9 @@ +News since version 4.2: + + - New (C++) emms-print-metadata brings more TagLib features. + - Compilation warnings gone (excl. cl). + - Bug fix: emms-lyrics free variable fix. + News since version 4.1: - Removed defunct streams. diff --git a/doc/emms.texinfo b/doc/emms.texinfo index 8bc25a4..159e94e 100644 --- a/doc/emms.texinfo +++ b/doc/emms.texinfo @@ -922,7 +922,7 @@ track as argument. @cindex using taglib The communication with the TagLib library is done via a tiny program -written in C @file{emms-print-metadata.c}. To compile +written in C++ @file{emms-print-metadata.cpp}. To compile @file{emms-print-metadata} invoke: @command{make emms-print-metadata} diff --git a/lisp/emms-info.el b/lisp/emms-info.el index cfc206b..50b1813 100644 --- a/lisp/emms-info.el +++ b/lisp/emms-info.el @@ -1,6 +1,6 @@ ;;; emms-info.el --- Retrieving track information -;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation Inc. +;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2015 Free Software Foundation Inc. ;; Author: Jorgen Schaefer <forcer@forcix.cx> diff --git a/src/emms-print-metadata.cpp b/src/emms-print-metadata.cpp new file mode 100644 index 0000000..7283657 --- /dev/null +++ b/src/emms-print-metadata.cpp @@ -0,0 +1,112 @@ +/* emms-print-metadata.cpp --- Info function for TagLib + Copyright (C) 2016 Free Software Foundation, Inc. + + Author: Petteri Hintsanen <petterih@iki.fi> + + This file is part of EMMS. + + EMMS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + EMMS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with EMMS; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#include <taglib/fileref.h> +#include <taglib/tag.h> +#include <taglib/tpropertymap.h> +#include <iostream> + +static const char* const tags_to_extract[] = { + "album", + "albumsort", + "albumartist", + "albumartistsort", + "artist", + "artistsort", + "composer", + "composersort", + "performer", + "year", + "originalyear", + "date", + "originaldate", + "genre", + "label", + "title", + "titlesort", + "tracknumber", + "discnumber" +}; + +void print_tag (const TagLib::PropertyMap& tags, const std::string& tag); + +int +main (int argc, char* argv[]) +{ + if (argc != 2) + { + std::cerr << argv[0] << ": " + << "usage: emms-print-metadata FILENAME" + << std::endl + << "FILENAME must end to one of these extensions: " + << TagLib::FileRef::defaultFileExtensions ().toString () + << std::endl; + return 1; + } + + TagLib::FileRef file (argv[1]); + if (file.isNull ()) { + std::cerr << argv[0] << ": " + << argv[1] << ": " + << "file does not exist or is of an unknown type" + << std::endl; + return 1; + } + + const TagLib::PropertyMap tags = file.file ()->properties (); + if (tags.isEmpty ()) { + std::cerr << argv[0] << ": " + << argv[1] << ": " + << "file does not have tags or is of an unknown type" + << std::endl; + return 1; + } + + for (unsigned int i = 0; i < sizeof (tags_to_extract) / sizeof (char*); + i++) + { + print_tag (tags, tags_to_extract[i]); + } + + int length = 0; + if (file.audioProperties ()) + { + const TagLib::AudioProperties* properties = file.audioProperties (); + length = properties->length (); + } + std::cout << "info-playing-time=" << length << std::endl; + + return 0; +} + +void +print_tag (const TagLib::PropertyMap& tags, const std::string& tag) +{ + TagLib::StringList values = tags[tag]; + if (!values.isEmpty ()) + { + const TagLib::String& value = values.front (); + std::cout << "info-" << tag << "=" << value.to8Bit (true) << std::endl; + } +} + +/* emms-print-taglib-metadata.cpp ends here. */ |