https://github.com/clementine-player/Clementine/commit/e9c09b1c4054925fa6366233cb44d4d0a543258f.patch
compatibility added with taglib1
--- a/ext/libclementine-tagreader/cloudstream.cpp
+++ b/ext/libclementine-tagreader/cloudstream.cpp
@@ -91,7 +91,11 @@
   clear();
 }
 
+#if (TAGLIB_MAJOR_VERSION == 2)
+TagLib::ByteVector CloudStream::readBlock(size_t length) {
+#else
 TagLib::ByteVector CloudStream::readBlock(ulong length) {
+#endif
   const uint start = cursor_;
   const uint end = qMin(cursor_ + length - 1, length_ - 1);
 
@@ -144,11 +148,19 @@
   qLog(Debug) << Q_FUNC_INFO << "not implemented";
 }
 
+#if (TAGLIB_MAJOR_VERSION == 2)
+void CloudStream::insert(const TagLib::ByteVector&, TagLib::offset_t, size_t) {
+#else
 void CloudStream::insert(const TagLib::ByteVector&, ulong, ulong) {
+#endif
   qLog(Debug) << Q_FUNC_INFO << "not implemented";
 }
 
+#if (TAGLIB_MAJOR_VERSION == 2)
+void CloudStream::removeBlock(TagLib::offset_t, size_t) {
+#else
 void CloudStream::removeBlock(ulong, ulong) {
+#endif
   qLog(Debug) << Q_FUNC_INFO << "not implemented";
 }
 
@@ -159,7 +171,11 @@
 
 bool CloudStream::isOpen() const { return true; }
 
+#if (TAGLIB_MAJOR_VERSION == 2)
+void CloudStream::seek(TagLib::offset_t offset, TagLib::IOStream::Position p) {
+#else
 void CloudStream::seek(long offset, TagLib::IOStream::Position p) {
+#endif
   switch (p) {
     case TagLib::IOStream::Beginning:
       cursor_ = offset;
@@ -178,11 +194,19 @@
 
 void CloudStream::clear() { cursor_ = 0; }
 
+#if (TAGLIB_MAJOR_VERSION == 2)
+TagLib::offset_t CloudStream::tell() const { return cursor_; }
+
+TagLib::offset_t CloudStream::length() { return length_; }
+
+void CloudStream::truncate(TagLib::offset_t) {
+#else
 long CloudStream::tell() const { return cursor_; }
 
 long CloudStream::length() { return length_; }
 
 void CloudStream::truncate(long) {
+#endif
   qLog(Debug) << Q_FUNC_INFO << "not implemented";
 }
 
--- a/ext/libclementine-tagreader/cloudstream.h
+++ b/ext/libclementine-tagreader/cloudstream.h
@@ -35,6 +35,19 @@
 
   // Taglib::IOStream
   virtual TagLib::FileName name() const;
+#if (TAGLIB_MAJOR_VERSION == 2)
+  virtual TagLib::ByteVector readBlock(size_t length);
+  virtual void writeBlock(const TagLib::ByteVector&);
+  virtual void insert(const TagLib::ByteVector&, TagLib::offset_t, size_t);
+  virtual void removeBlock(TagLib::offset_t, size_t);
+  virtual bool readOnly() const;
+  virtual bool isOpen() const;
+  virtual void seek(TagLib::offset_t offset, TagLib::IOStream::Position p);
+  virtual void clear();
+  virtual TagLib::offset_t tell() const;
+  virtual TagLib::offset_t length();
+  virtual void truncate(TagLib::offset_t);
+#else
   virtual TagLib::ByteVector readBlock(ulong length);
   virtual void writeBlock(const TagLib::ByteVector&);
   virtual void insert(const TagLib::ByteVector&, ulong, ulong);
@@ -46,6 +59,7 @@
   virtual long tell() const;
   virtual long length();
   virtual void truncate(long);
+#endif
 
   google::sparsetable<char>::size_type cached_bytes() const {
     return cache_.num_nonempty();
--- a/ext/libclementine-tagreader/tagreader.cpp
+++ b/ext/libclementine-tagreader/tagreader.cpp
@@ -198,7 +198,7 @@
     // Find album artists
     TagLib::APE::ItemListMap::ConstIterator it = items.find("ALBUM ARTIST");
     if (it != items.end()) {
-      TagLib::StringList album_artists = it->second.toStringList();
+      TagLib::StringList album_artists = it->second.values();
       if (!album_artists.isEmpty()) {
         Decode(album_artists.front(), nullptr, song->mutable_albumartist());
       }
@@ -243,22 +243,22 @@
     }
 
     if (items.contains("BPM")) {
-      Decode(items["BPM"].toStringList().toString(", "), nullptr,
+      Decode(items["BPM"].values().toString(", "), nullptr,
              song->mutable_performer());
     }
 
     if (items.contains("PERFORMER")) {
-      Decode(items["PERFORMER"].toStringList().toString(", "), nullptr,
+      Decode(items["PERFORMER"].values().toString(", "), nullptr,
              song->mutable_performer());
     }
 
     if (items.contains("COMPOSER")) {
-      Decode(items["COMPOSER"].toStringList().toString(", "), nullptr,
+      Decode(items["COMPOSER"].values().toString(", "), nullptr,
              song->mutable_composer());
     }
 
     if (items.contains("GROUPING")) {
-      Decode(items["GROUPING"].toStringList().toString(" "), nullptr,
+      Decode(items["GROUPING"].values().toString(" "), nullptr,
              song->mutable_grouping());
     }
 
@@ -565,8 +565,8 @@
   if (fileref->audioProperties()) {
     song->set_bitrate(fileref->audioProperties()->bitrate());
     song->set_samplerate(fileref->audioProperties()->sampleRate());
-    song->set_length_nanosec(fileref->audioProperties()->length() *
-                             kNsecPerSec);
+    song->set_length_nanosec(fileref->audioProperties()->lengthInMilliseconds() *
+                             kNsecPerMsec);
   }
 
   // Get the filetype if we can
@@ -1376,9 +1376,15 @@
   std::unique_ptr<TagLib::File> tag;
   if (mime_type == "audio/mpeg" &&
       title.endsWith(".mp3", Qt::CaseInsensitive)) {
+#if (TAGLIB_MAJOR_VERSION == 2)
+    tag.reset(new TagLib::MPEG::File(stream.get(), true,
+                                     TagLib::AudioProperties::Accurate,
+                                     TagLib::ID3v2::FrameFactory::instance()));
+#else
     tag.reset(new TagLib::MPEG::File(stream.get(),
                                      TagLib::ID3v2::FrameFactory::instance(),
                                      TagLib::AudioProperties::Accurate));
+#endif
   } else if (mime_type == "audio/mp4" ||
              (mime_type == "audio/mpeg" &&
               title.endsWith(".m4a", Qt::CaseInsensitive))) {
@@ -1398,9 +1398,15 @@
                                             TagLib::AudioProperties::Accurate));
   } else if (mime_type == "application/x-flac" || mime_type == "audio/flac" ||
              mime_type == "audio/x-flac") {
+#if (TAGLIB_MAJOR_VERSION == 2)
+    tag.reset(new TagLib::FLAC::File(stream.get(), true,
+                                     TagLib::AudioProperties::Accurate,
+                                     TagLib::ID3v2::FrameFactory::instance()));
+#else
     tag.reset(new TagLib::FLAC::File(stream.get(),
                                      TagLib::ID3v2::FrameFactory::instance(),
                                      true, TagLib::AudioProperties::Accurate));
+#endif
   } else if (mime_type == "audio/x-ms-wma") {
     tag.reset(new TagLib::ASF::File(stream.get(), true,
                                     TagLib::AudioProperties::Accurate));
@@ -1431,7 +1431,7 @@
     song->set_type(cpb::tagreader::SongMetadata_Type_STREAM);
 
     if (tag->audioProperties()) {
-      song->set_length_nanosec(tag->audioProperties()->length() * kNsecPerSec);
+      song->set_length_nanosec(tag->audioProperties()->lengthInMilliseconds() * kNsecPerMsec);
     }
     return true;
   }
