diff --git a/src/apps/mediaplayer/playlist/UrlPlaylistItem.cpp b/src/apps/mediaplayer/playlist/UrlPlaylistItem.cpp index f14622e1bd..1546e3ebe8 100644 --- a/src/apps/mediaplayer/playlist/UrlPlaylistItem.cpp +++ b/src/apps/mediaplayer/playlist/UrlPlaylistItem.cpp @@ -7,6 +7,7 @@ #include "UrlPlaylistItem.h" #include +#include #include "MediaFileTrackSupplier.h" @@ -26,6 +27,9 @@ UrlPlaylistItem::UrlPlaylistItem(const UrlPlaylistItem& item) UrlPlaylistItem::UrlPlaylistItem(const BMessage* archive) { + const char* url = NULL; + if (archive->FindString("mediaplayer:url", &url) == B_OK) + fUrl = BUrl(url); } @@ -44,14 +48,17 @@ UrlPlaylistItem::Clone() const BArchivable* UrlPlaylistItem::Instantiate(BMessage* archive) { - return new UrlPlaylistItem(archive); + if (validate_instantiation(archive, "UrlPlaylistItem")) + return new (std::nothrow) UrlPlaylistItem(archive); + + return NULL; } status_t UrlPlaylistItem::Archive(BMessage* into, bool deep) const { - return B_NOT_SUPPORTED; + return into->AddString("mediaplayer:url", fUrl.UrlString()); } @@ -130,6 +137,18 @@ UrlPlaylistItem::RestoreFromTrash() } +bigtime_t +UrlPlaylistItem::_CalculateDuration() +{ + BMediaFile mediaFile(fUrl); + + if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1) + return 0; + + return mediaFile.TrackAt(0)->Duration(); +} + + TrackSupplier* UrlPlaylistItem::_CreateTrackSupplier() const { diff --git a/src/apps/mediaplayer/playlist/UrlPlaylistItem.h b/src/apps/mediaplayer/playlist/UrlPlaylistItem.h index 234f6d8e78..91f33385b4 100644 --- a/src/apps/mediaplayer/playlist/UrlPlaylistItem.h +++ b/src/apps/mediaplayer/playlist/UrlPlaylistItem.h @@ -48,6 +48,8 @@ public: BUrl Url() const; protected: + virtual bigtime_t _CalculateDuration(); + virtual TrackSupplier* _CreateTrackSupplier() const; private: