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