1515import com .couchbase .lite .QueryEnumerator ;
1616import com .couchbase .lite .QueryRow ;
1717
18+ import java .io .File ;
19+ import java .io .IOException ;
20+ import java .net .URL ;
1821import java .util .ArrayList ;
1922import java .util .HashMap ;
2023import java .util .List ;
24+ import java .util .Locale ;
2125import java .util .Map ;
2226
2327import javax .annotation .Nullable ;
2428
2529import io .compactd .client .CompactdClient ;
30+ import io .compactd .client .CompactdPreset ;
31+ import io .compactd .client .CompactdRequest ;
2632
2733/**
2834 * Created by Vincent on 30/10/2017.
@@ -37,8 +43,10 @@ public class CompactdTrack extends CompactdModel {
3743 private CompactdAlbum mAlbum ;
3844 private double mDuration ;
3945 private int mNumber ;
46+ private String mStorageLocation ;
4047
4148 private static SparseArray <CompactdTrack > cache = new SparseArray <>();
49+ private CompactdPreset mStoragePreset ;
4250
4351 public CompactdTrack (Manager manager , String id ) {
4452 super (manager , id );
@@ -52,11 +60,31 @@ public CompactdTrack(CompactdTrack other) {
5260 mAlbum = new CompactdAlbum (other .getAlbum ());
5361 mDuration = other .getDuration ();
5462 mNumber = other .getNumber ();
63+ mStorageLocation = other .getStorageLocation ();
64+ mStoragePreset = other .getStoragePreset ();
5565 }
5666
67+ public Map <String , Object > toMap () {
68+ Map <String , Object > map = new HashMap <>();
69+
70+ map .put ("name" , getName ());
71+ map .put ("hidden" , isHidden ());
72+ map .put ("artist" , getArtist ().getId ());
73+ map .put ("album" , getAlbum ().getId ());
74+ map .put ("duration" , getDuration ());
75+ map .put ("number" , getNumber ());
76+
77+ if (getStorageLocation () != null && !getStorageLocation ().isEmpty ()) {
78+ map .put ("storage_loc" , getStorageLocation ());
79+ map .put ("storage_preset" , getStoragePreset ());
80+ }
81+
82+ return map ;
83+ }
5784 @ Override
5885 public void fromMap (Map <String , Object > map ) {
5986 super .fromMap (map );
87+
6088 mName = (String ) map .get ("name" );
6189 mHidden = map .containsKey ("hidden" ) && (boolean ) map .get ("hidden" );
6290
@@ -78,6 +106,14 @@ public void fromMap(Map<String, Object> map) {
78106
79107 mDuration = getMillisDurationFromSeconds (map .get ("duration" ));
80108 mNumber = (Integer ) map .get ("number" );
109+
110+ if (map .containsKey ("storage_preset" )) {
111+ mStoragePreset = CompactdPreset .from (map .get ("storage_preset" ).toString ());
112+ }
113+
114+ if (map .containsKey ("storage_loc" )) {
115+ mStorageLocation = (String ) map .get ("storage_loc" );
116+ }
81117 }
82118
83119 private int getMillisDurationFromSeconds (Object ms ) {
@@ -314,4 +350,94 @@ public static String databaseName() {
314350 return CompactdClient .getInstance ().getPrefix () + DATABASE_NAME ;
315351 }
316352
353+ public String getStorageLocation () {
354+ return mStorageLocation ;
355+ }
356+
357+ private void setStorageLocation (String mStorageLocation ) {
358+ this .mStorageLocation = mStorageLocation ;
359+ }
360+
361+ public void update () throws CouchbaseLiteException {
362+ Database database = mManager .getDatabase (databaseName ());
363+ Document doc = database .getDocument (getId ());
364+ Map <String , Object > properties = new HashMap <>();
365+ properties .putAll (doc .getProperties ());
366+ properties .putAll (toMap ());
367+
368+ try {
369+ doc .putProperties (properties );
370+ } catch (CouchbaseLiteException e ) {
371+ e .printStackTrace ();
372+ }
373+ }
374+
375+ public CompactdPreset getStoragePreset () {
376+ return mStoragePreset ;
377+ }
378+
379+ private void setStoragePreset (CompactdPreset preset ) {
380+ mStoragePreset = preset ;
381+ }
382+
383+ public void setStorageOptions (SyncOptions opts ) {
384+ String dir = opts .getDestination ();
385+ try {
386+ fetch ();
387+ } catch (CouchbaseLiteException e ) {
388+ e .printStackTrace ();
389+ return ;
390+ }
391+ String artist = getArtist ().getName ();
392+ String album = getAlbum ().getName ();
393+ String track = getName ();
394+ String number = String .format (Locale .getDefault (),"%02d" , getNumber ());
395+ String base = dir + (dir .endsWith ("/" ) ? "" : "/" );
396+
397+ String dest = base + artist + " - " + album + "/" + number + " - " + track + ".mp3" ;
398+
399+ setStorageLocation (dest );
400+ setStoragePreset (opts .getPreset ());
401+ }
402+
403+ public boolean isAvailableOffline () {
404+ return getStorageLocation () != null && new File (getStorageLocation ()).exists ();
405+ }
406+
407+ public void sync () {
408+ Log .d (TAG , "sync: '" + getId () + "' to '" + getStorageLocation () + "'" );
409+ if (isAvailableOffline ()) {
410+ return ;
411+ }
412+
413+ String uri = getId ().replaceAll ("^library\\ /" , "" );
414+
415+ CompactdClient client = CompactdClient .getInstance ();
416+
417+ URL baseURL = client .getUrl ();
418+ String endpoint = "/api/boombox/" + uri + "/" + getStoragePreset ().getPreset ();
419+
420+ String token = client .getToken ();
421+
422+ CompactdRequest req = new CompactdRequest (baseURL , endpoint , token );
423+
424+ String dest = getStorageLocation ();
425+
426+ try {
427+ req .saveToDisk (dest + ".tmp" );
428+ } catch (IOException e ) {
429+ e .printStackTrace ();
430+ return ;
431+ }
432+
433+ File temp = new File (dest + ".tmp" );
434+
435+ if (temp .renameTo (new File (dest ))) {
436+ try {
437+ update ();
438+ } catch (CouchbaseLiteException e ) {
439+ e .printStackTrace ();
440+ }
441+ }
442+ }
317443}
0 commit comments