1/* 2 * Copyright 2016, Dario Casalinuovo 3 * All rights reserved. Distributed under the terms of the MIT license. 4 */ 5 6 7#include "UrlPlaylistItem.h" 8 9#include <MediaFile.h> 10#include <MediaTrack.h> 11 12#include "MediaFileTrackSupplier.h" 13 14 15UrlPlaylistItem::UrlPlaylistItem(BUrl url) 16 : 17 fUrl(url), 18 fDuration(-1) 19{ 20} 21 22 23UrlPlaylistItem::UrlPlaylistItem(const UrlPlaylistItem& item) 24{ 25 fUrl = BUrl(item.Url()); 26} 27 28 29UrlPlaylistItem::UrlPlaylistItem(const BMessage* archive) 30{ 31 const char* url = NULL; 32 if (archive->FindString("mediaplayer:url", &url) == B_OK) 33 fUrl = BUrl(url); 34} 35 36 37UrlPlaylistItem::~UrlPlaylistItem() 38{ 39} 40 41 42PlaylistItem* 43UrlPlaylistItem::Clone() const 44{ 45 return new UrlPlaylistItem(fUrl); 46} 47 48 49BArchivable* 50UrlPlaylistItem::Instantiate(BMessage* archive) 51{ 52 if (validate_instantiation(archive, "UrlPlaylistItem")) 53 return new (std::nothrow) UrlPlaylistItem(archive); 54 55 return NULL; 56} 57 58 59status_t 60UrlPlaylistItem::Archive(BMessage* into, bool deep) const 61{ 62 return into->AddString("mediaplayer:url", fUrl.UrlString()); 63} 64 65 66status_t 67UrlPlaylistItem::SetAttribute(const Attribute& attribute, const BString& string) 68{ 69 return B_ERROR; 70} 71 72 73status_t 74UrlPlaylistItem::GetAttribute(const Attribute& attribute, BString& string) const 75{ 76 if (attribute == ATTR_STRING_NAME) { 77 string = fUrl.UrlString(); 78 return B_OK; 79 } 80 81 return B_NOT_SUPPORTED; 82} 83 84 85status_t 86UrlPlaylistItem::SetAttribute(const Attribute& attribute, const int32& value) 87{ 88 return B_NOT_SUPPORTED; 89} 90 91 92status_t 93UrlPlaylistItem::GetAttribute(const Attribute& attribute, int32& value) const 94{ 95 return B_NOT_SUPPORTED; 96} 97 98 99status_t 100UrlPlaylistItem::SetAttribute(const Attribute& attribute, const int64& value) 101{ 102 return B_NOT_SUPPORTED; 103} 104 105 106status_t 107UrlPlaylistItem::GetAttribute(const Attribute& attribute, int64& value) const 108{ 109 if (attribute == ATTR_INT64_DURATION && fDuration >= 0) { 110 value = fDuration; 111 return B_OK; 112 } 113 return B_NOT_SUPPORTED; 114} 115 116 117status_t 118UrlPlaylistItem::SetAttribute(const Attribute& attribute, const float& value) 119{ 120 return B_NOT_SUPPORTED; 121} 122 123 124status_t 125UrlPlaylistItem::GetAttribute(const Attribute& attribute, float& value) const 126{ 127 return B_NOT_SUPPORTED; 128} 129 130 131BString 132UrlPlaylistItem::LocationURI() const 133{ 134 return fUrl.UrlString(); 135} 136 137 138status_t 139UrlPlaylistItem::GetIcon(BBitmap* bitmap, icon_size iconSize) const 140{ 141 return B_NOT_SUPPORTED; 142} 143 144 145status_t 146UrlPlaylistItem::MoveIntoTrash() 147{ 148 return B_NOT_SUPPORTED; 149} 150 151 152status_t 153UrlPlaylistItem::RestoreFromTrash() 154{ 155 return B_NOT_SUPPORTED; 156} 157 158 159bigtime_t 160UrlPlaylistItem::_CalculateDuration() 161{ 162 if (fDuration < 0) { 163 BMediaFile mediaFile(fUrl); 164 165 if (mediaFile.InitCheck() != B_OK || mediaFile.CountTracks() < 1) 166 return 0; 167 fDuration = mediaFile.TrackAt(0)->Duration(); 168 } 169 return fDuration; 170} 171 172 173TrackSupplier* 174UrlPlaylistItem::_CreateTrackSupplier() const 175{ 176 MediaFileTrackSupplier* supplier 177 = new(std::nothrow) MediaFileTrackSupplier(); 178 if (supplier == NULL) 179 return NULL; 180 181 BMediaFile* mediaFile = new(std::nothrow) BMediaFile(fUrl); 182 if (mediaFile == NULL || supplier->AddMediaFile(mediaFile) != B_OK) { 183 delete mediaFile; 184 delete supplier; 185 return NULL; 186 } 187 188 return supplier; 189} 190 191 192BUrl 193UrlPlaylistItem::Url() const 194{ 195 return fUrl; 196} 197