1 /****************************************************************************************
2 * Copyright (c) 2013 Anmol Ahuja <darthcodus@gmail.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 "CollectionTypeExporter.h"
18
19 #include "core/meta/Meta.h"
20 #include "core-impl/collections/support/CollectionManager.h"
21 #include "core/collections/Collection.h"
22 #include "core/collections/CollectionLocation.h"
23 #include "core/capabilities/TranscodeCapability.h"
24 #include "core/transcoding/TranscodingController.h"
25 #include "scripting/scriptengine/ScriptingDefines.h"
26
27 #include <QIcon>
28 #include <QJSEngine>
29 #include <QJSValue>
30
31 using namespace AmarokScript;
32
33 using Collections::Collection;
34 using Collections::QueryMaker;
35
36 #define GET_COLLECTION( returnVal ) Collection *collection = m_collection.data(); if( !collection ) return returnVal;
37
38 void
init(QJSEngine * engine)39 CollectionPrototype::init( QJSEngine *engine )
40 {
41 qRegisterMetaType<Collection*>();
42 QMetaType::registerConverter<Collection*, QJSValue>( [=] (Collection* collection) {
43 return toScriptValue<Collection*, CollectionPrototype>( engine, collection );
44 } );
45 QMetaType::registerConverter<QJSValue, Collection*>( [] (QJSValue jsValue) {
46 Collection* collection;
47 fromScriptValue<Collection*, CollectionPrototype>( jsValue, collection );
48 return collection;
49 } );
50
51 qRegisterMetaType<Collections::CollectionList>();
52 QMetaType::registerConverter<Collections::CollectionList,QJSValue>( [=] (Collections::CollectionList collectionList) {
53 return toScriptArray<Collections::CollectionList>( engine, collectionList);
54
55 } );
56 QMetaType::registerConverter<QJSValue,Collections::CollectionList>( [] (QJSValue jsValue) {
57 Collections::CollectionList collectionList;
58 fromScriptArray<Collections::CollectionList>( jsValue, collectionList );
59 return collectionList;
60 } );
61
62 }
63
64 //script invokable
65
66 void
copyTracks(const Meta::TrackPtr & track,Collection * targetCollection)67 CollectionPrototype::copyTracks( const Meta::TrackPtr &track, Collection* targetCollection )
68 {
69 copyTracks( Meta::TrackList() << track, targetCollection );
70 }
71
72 void
copyTracks(const Meta::TrackList & tracks,Collection * targetCollection)73 CollectionPrototype::copyTracks( const Meta::TrackList &tracks, Collection* targetCollection )
74 {
75 GET_COLLECTION()
76 if( !targetCollection )
77 return;
78 collection->location()->prepareCopy( removeInvalidTracks( tracks ), targetCollection->location() );
79 }
80
81 void
queryAndCopyTracks(QueryMaker * queryMaker,Collection * targetCollection)82 CollectionPrototype::queryAndCopyTracks( QueryMaker *queryMaker, Collection* targetCollection )
83 {
84 GET_COLLECTION()
85 if( !queryMaker || !targetCollection )
86 return;
87 collection->location()->prepareCopy( queryMaker, targetCollection->location() );
88 }
89
90 void
moveTracks(const Meta::TrackPtr & track,Collection * targetCollection)91 CollectionPrototype::moveTracks( const Meta::TrackPtr &track, Collection *targetCollection )
92 {
93 moveTracks( Meta::TrackList() << track, targetCollection );
94 }
95
96 void
moveTracks(const Meta::TrackList & tracks,Collection * targetCollection)97 CollectionPrototype::moveTracks( const Meta::TrackList &tracks, Collection *targetCollection )
98 {
99 GET_COLLECTION()
100 if( !targetCollection )
101 return;
102 collection->location()->prepareMove( removeInvalidTracks( tracks ), targetCollection->location() );
103 }
104
105 void
queryAndMoveTracks(QueryMaker * queryMaker,Collection * targetCollection)106 CollectionPrototype::queryAndMoveTracks( QueryMaker *queryMaker, Collection *targetCollection )
107 {
108 GET_COLLECTION()
109 if( !queryMaker || !targetCollection )
110 return;
111 collection->location()->prepareMove( queryMaker, targetCollection->location() );
112 }
113
114 void
removeTracks(const Meta::TrackList & list)115 CollectionPrototype::removeTracks( const Meta::TrackList &list )
116 {
117 GET_COLLECTION()
118 collection->location()->prepareRemove( removeInvalidTracks( list ) );
119 }
120
removeTracks(const Meta::TrackPtr & track)121 void CollectionPrototype::removeTracks( const Meta::TrackPtr &track )
122 {
123 removeTracks( Meta::TrackList() << track );
124 }
125
126 void
queryAndRemoveTracks(QueryMaker * queryMaker)127 CollectionPrototype::queryAndRemoveTracks( QueryMaker* queryMaker )
128 {
129 GET_COLLECTION()
130 if( !queryMaker )
131 return;
132 collection->location()->prepareRemove( queryMaker );
133 }
134
135 QueryMaker*
queryMaker()136 CollectionPrototype::queryMaker()
137 {
138 GET_COLLECTION( 0 );
139 return collection->queryMaker();
140 }
141
142 //private methods
143
144 QIcon
icon() const145 CollectionPrototype::icon() const
146 {
147 GET_COLLECTION( QIcon() )
148 return collection->icon();
149 }
150
151 QString
collectionId() const152 CollectionPrototype::collectionId() const
153 {
154 GET_COLLECTION( QString() );
155 return collection->collectionId();
156 }
157
158 bool
isOrganizable() const159 CollectionPrototype::isOrganizable() const
160 {
161 GET_COLLECTION( false );
162 return collection->isOrganizable();
163 }
164
165 bool
isWritable() const166 CollectionPrototype::isWritable() const
167 {
168 GET_COLLECTION( false );
169 return collection->isWritable();
170 }
171
172 QString
toString() const173 CollectionPrototype::toString() const
174 {
175 GET_COLLECTION( QString() );
176 return collection->prettyName();
177 }
178
179 float
totalCapacity() const180 CollectionPrototype::totalCapacity() const
181 {
182 GET_COLLECTION( 0.0 )
183 return collection->totalCapacity();
184 }
185
186 float
usedCapacity() const187 CollectionPrototype::usedCapacity() const
188 {
189 GET_COLLECTION( 0.0 )
190 return collection->usedCapacity();
191 }
192
193 bool
isValid() const194 CollectionPrototype::isValid() const
195 {
196 GET_COLLECTION( false )
197 return true;
198 }
199
200 bool
isQueryable() const201 CollectionPrototype::isQueryable() const
202 {
203 if( CollectionManager::instance()->collectionStatus( collectionId() ) &
204 CollectionManager::CollectionQueryable )
205 return true;
206 return false;
207 }
208
209 bool
isViewable() const210 CollectionPrototype::isViewable() const
211 {
212 if( CollectionManager::instance()->collectionStatus( collectionId() ) &
213 CollectionManager::CollectionViewable )
214 return true;
215 return false;
216 }
217
218 bool
supportsTranscode() const219 CollectionPrototype::supportsTranscode() const
220 {
221 GET_COLLECTION( false )
222 if( !collection->has<Capabilities::TranscodeCapability>() )
223 return false;
224 Transcoding::Controller *tcC = Amarok::Components::transcodingController();
225 if( tcC && !tcC->availableEncoders().isEmpty() )
226 return true;
227 return false;
228 }
229
230 //private
231
CollectionPrototype(Collection * collection)232 CollectionPrototype::CollectionPrototype( Collection *collection )
233 : QObject( nullptr ) //script owned
234 , m_collection( collection )
235 {
236 connect( collection, &Collections::Collection::updated, this, &CollectionPrototype::updated );
237 connect( collection->location(), &Collections::CollectionLocation::aborted, this, &CollectionPrototype::aborted );
238 connect( collection->location(), &Collections::CollectionLocation::finishCopy, this, &CollectionPrototype::finishCopy );
239 connect( collection->location(), &Collections::CollectionLocation::finishRemove, this, &CollectionPrototype::finishRemove );
240 connect( collection, &Collections::Collection::remove, this, &CollectionPrototype::removed );
241 }
242
243 Meta::TrackList
removeInvalidTracks(const Meta::TrackList & tracks)244 CollectionPrototype::removeInvalidTracks(const Meta::TrackList& tracks)
245 {
246 Meta::TrackList cleaned;
247 foreach( const Meta::TrackPtr &track, tracks )
248 {
249 if( track )
250 cleaned << track;
251 }
252 return cleaned;
253 }
254
255 QString
prettyLocation() const256 CollectionPrototype::prettyLocation() const
257 {
258 GET_COLLECTION( QString() )
259 return collection->location()->prettyLocation();
260 }
261
262 QStringList
actualLocation() const263 CollectionPrototype::actualLocation() const
264 {
265 GET_COLLECTION( QStringList() )
266 return collection->location()->actualLocation();
267 }
268
269 #undef GET_COLLECTION
270