1 /****************************************************************************************
2 * Copyright (c) 2007-2008 Maximilian Kossick <maximilian.kossick@googlemail.com> *
3 * *
4 * This program is free software; you can redistribute it and/or modify it under *
5 * the terms of the GNU General Public License as published by the Free Software *
6 * Foundation; either version 2 of the License, or (at your option) any later *
7 * version. *
8 * *
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
11 * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
12 * *
13 * You should have received a copy of the GNU General Public License along with *
14 * this program. If not, see <http://www.gnu.org/licenses/>. *
15 ****************************************************************************************/
16
17 #include "core-impl/meta/stream/Stream.h"
18 #include "core-impl/meta/stream/Stream_p.h"
19
20 #include "core/support/Amarok.h"
21 #include "core/support/Debug.h"
22 #include "core/meta/Meta.h"
23 #include "core-impl/meta/default/DefaultMetaTypes.h"
24 #include "core-impl/support/UrlStatisticsStore.h"
25
26 #include <QWeakPointer>
27 #include <QString>
28
29 using namespace MetaStream;
30
Track(const QUrl & url)31 Track::Track( const QUrl &url )
32 : Meta::Track()
33 , d( new Track::Private( this ) )
34 {
35 d->url = url;
36 d->artistPtr = Meta::ArtistPtr( new StreamArtist( d ) );
37 d->albumPtr = Meta::AlbumPtr( new StreamAlbum( d ) );
38 d->genrePtr = Meta::GenrePtr( new StreamGenre( d ) );
39 d->composerPtr = Meta::ComposerPtr( new Meta::DefaultComposer() );
40 d->yearPtr = Meta::YearPtr( new Meta::DefaultYear() );
41 }
42
~Track()43 Track::~Track()
44 {
45 delete d;
46 }
47
48 QString
name() const49 Track::name() const
50 {
51 if( d->title.isEmpty() )
52 return i18n( "Stream (%1)", d->url.url() );
53 return d->title;
54 }
55
56 QUrl
playableUrl() const57 Track::playableUrl() const
58 {
59 return d->url;
60 }
61
62 QString
prettyUrl() const63 Track::prettyUrl() const
64 {
65 return playableUrl().toDisplayString();
66 }
67
68 QString
uidUrl() const69 Track::uidUrl() const
70 {
71 return playableUrl().url();
72 }
73
74 QString
notPlayableReason() const75 Track::notPlayableReason() const
76 {
77 return networkNotPlayableReason();
78 }
79
80 Meta::AlbumPtr
album() const81 Track::album() const
82 {
83 return d->albumPtr;
84 }
85
86 Meta::ArtistPtr
artist() const87 Track::artist() const
88 {
89 return d->artistPtr;
90 }
91
92 Meta::GenrePtr
genre() const93 Track::genre() const
94 {
95 return d->genrePtr;
96 }
97
98 Meta::ComposerPtr
composer() const99 Track::composer() const
100 {
101 return d->composerPtr;
102 }
103
104 Meta::YearPtr
year() const105 Track::year() const
106 {
107 return d->yearPtr;
108 }
109
110 qreal
bpm() const111 Track::bpm() const
112 {
113 return -1.0;
114 }
115
116 QString
comment() const117 Track::comment() const
118 {
119 return d->comment;
120 }
121
122 int
trackNumber() const123 Track::trackNumber() const
124 {
125 return d->trackNumber;
126 }
127
128 int
discNumber() const129 Track::discNumber() const
130 {
131 return 0;
132 }
133
134 qint64
length() const135 Track::length() const
136 {
137 return d->length;
138 }
139
140 int
filesize() const141 Track::filesize() const
142 {
143 return 0;
144 }
145
146 int
sampleRate() const147 Track::sampleRate() const
148 {
149 return 0;
150 }
151
152 int
bitrate() const153 Track::bitrate() const
154 {
155 return 0;
156 }
157
158 void
finishedPlaying(double playedFraction)159 Track::finishedPlaying( double playedFraction )
160 {
161 // playedFraction will nearly always be 1, because EngineController updates length
162 // just before calling finishedPlaying(). Mimic Last.fm scrobbling wrt min length
163 // requirement, tracks shorter than 30s are often ads etc.
164 if( length() < 30 * 1000 )
165 return;
166 Meta::Track::finishedPlaying( playedFraction );
167 }
168
169 QString
type() const170 Track::type() const
171 {
172 // don't localize. See EngineController quirks
173 return QStringLiteral("stream");
174 }
175
176 void
setInitialInfo(const QString & artist,const QString & album,const QString & title,qint64 length,int trackNumber)177 Track::setInitialInfo( const QString &artist, const QString &album, const QString &title,
178 qint64 length, int trackNumber )
179 {
180 if( d->artist.isEmpty() )
181 d->artist = artist;
182 if( d->album.isEmpty() )
183 d->album = album;
184 if( d->title.isEmpty() )
185 d->title = title;
186
187 if( d->length == 0 )
188 d->length = length;
189 if( d->trackNumber == 0 )
190 d->trackNumber = trackNumber;
191 }
192