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