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