/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* ĠNote Stream , Ġandroid Ġmusic Ġplayer Ġand Ġstream er Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠT in ĠÅ ł v age lj Ġ< tin . sv age lj . email @ gmail . com > Ġa . k . a . ĠCa elli an Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ċ Ġ* Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ċ Ġ* Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ċ Ġ* Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ċ Ġ* Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL Ċ Ġ* ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING Ċ Ġ* ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER Ċ Ġ* ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġhr . ca elli an . not est ream . database Ċ Ċ import Ġandroid . database . Cursor Index OutOfBoundsException Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġandroid . database . sqlite . SQLite Exception Ċ import Ġandroid . database . sqlite . SQLite Open Helper Ċ import Ġandroid . util . Log Ċ import Ġhr . ca elli an . not est ream . Note Stream Ċ import Ġhr . ca elli an . not est ream . data . play able . Play able Ċ import Ġhr . ca elli an . not est ream . data . play able . Play able Local Ċ import Ġhr . ca elli an . not est ream . data . play able . Play able Source Ċ import Ġhr . ca elli an . not est ream . data . play able . Play able YouTube Ċ import Ġhr . ca elli an . not est ream . data . playlist . Playlist Ċ import Ġhr . ca elli an . not est ream . lib . Constants Ċ import Ġhr . ca elli an . not est ream . lib . Constants . DB _ PLAY ABLE S _ ID Ċ import Ġhr . ca elli an . not est ream . lib . Constants . DB _ PLAY LIST _ INFO _ ID Ċ import Ġhr . ca elli an . not est ream . lib . Constants . DB _ PLAY LIST _ PREFIX Ċ import Ġhr . ca elli an . not est ream . lib . Constants . PLAY LIST _ AUTHOR Ċ import Ġhr . ca elli an . not est ream . lib . Constants . PLAY LIST _ CAP ACITY Ċ import Ġhr . ca elli an . not est ream . lib . Constants . PLAY LIST _ ID Ċ import Ġhr . ca elli an . not est ream . lib . Constants . PLAY LIST _ LABEL Ċ import Ġhr . ca elli an . not est ream . lib . Constants . SQL _ NOT _ NULL Ċ import Ġhr . ca elli an . not est ream . lib . Constants . SQL _ PRIMARY _ KEY Ċ import Ġhr . ca elli an . not est ream . lib . Constants . SQL _ TYPE _ INTEGER Ċ import Ġhr . ca elli an . not est ream . lib . Constants . SQL _ TYPE _ TEXT Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ AL BU M Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ AUTHOR Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ COVER _ PATH Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ END Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ GEN RE Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ ID Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ LENGTH Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ LY R ICS Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ PATH Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ RAT ING Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ SOURCE Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ START Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ TIMESTAMP Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ TITLE Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ TRACK Ċ import Ġhr . ca elli an . not est ream . lib . Constants . TRACK _ YEAR Ċ Ċ object ĠNote Stream DB Ġ: ĠSQLite Open Helper ( Note Stream . instance , ĠConstants . DB _ NAME , Ġnull , ĠConstants . DB _ VERSION ) Ġ{ ĊĊĠĠĠ Ġfun Ġcreate Play ables Table ( db : ĠSQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ$ DB _ PLAY ABLE S _ ID Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ ID Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ PRIMARY _ KEY , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ SOURCE Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ NOT _ NULL , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ PATH Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ NOT _ NULL , Ġ" Ġ+ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ TITLE Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ NOT _ NULL , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ AUTHOR Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ AL BU M Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ YEAR Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ TRACK Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ GEN RE Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ RAT ING Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ LY R ICS Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ START Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ END Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ LENGTH Ġ$ SQL _ TYPE _ INTEGER , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ COVER _ PATH Ġ$ SQL _ TYPE _ TEXT " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"); " ĊĊĠĠĠĠĠĠĠ Ġdb . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Playlist Info Table ( db : ĠSQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ$ DB _ PLAY LIST _ INFO _ ID Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ PLAY LIST _ ID Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ PRIMARY _ KEY , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ PLAY LIST _ AUTHOR Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ PLAY LIST _ LABEL Ġ$ SQL _ TYPE _ TEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ PLAY LIST _ CAP ACITY Ġ$ SQL _ TYPE _ TEXT " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"); " ĊĊĠĠĠĠĠĠĠ Ġdb . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( db : ĠSQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Play ables Table ( db ) ĊĠĠĠĠĠĠĠ Ġcreate Playlist Info Table ( db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Upgrade ( db : ĠSQLite Database , Ġold Version : ĠInt , Ġnew Version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( old Version Ġ!= Ġnew Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstatement Ġ= Ġ" DROP ĠTABLE ĠIF ĠEXISTS Ġ$ DB _ PLAY ABLE S _ ID ; ĠDROP ĠTABLE ĠIF ĠEXISTS Ġ$ DB _ PLAY LIST _ INFO _ ID ; ĠV AC U UM ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠonCreate ( db ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsync Playlist ( pl : ĠPlaylist , Ġid : ĠString Ġ= Ġ"", Ġauthor : ĠString Ġ= Ġ"", Ġlabel : ĠString Ġ= Ġ"", Ġcapacity : ĠInt Ġ= Ġ 5 1 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb id Ġ= Ġmake DB Safe String ( pl . id ) ĊĠĠĠĠĠĠĠ Ġvar Ġstatement Ġ= Ġ" CREATE ĠTABLE ĠIF ĠNOT ĠEXISTS Ġ$ DB _ PLAY LIST _ PREFIX $ db id Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ ID Ġ$ SQL _ TYPE _ TEXT Ġ$ SQL _ PRIMARY _ KEY , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ TIMESTAMP Ġ$ SQL _ TYPE _ INTEGER Ġ$ SQL _ NOT _ NULL );" ĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġpl . playlist ĊĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatement Ġ= Ġ" INSERT ĠOR ĠIG NORE ĠINTO Ġ$ DB _ PLAY LIST _ PREFIX $ db id Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ TRACK _ ID , Ġ$ TRACK _ TIMESTAMP ) ĠVALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \" ${ it . id }\ ", Ġ${ pl . timestamps [ it ] }); Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= ĠarrayOf ( TRACK _ ID , ĠTR ACK _ TIMESTAMP ) ĊĠĠĠĠĠĠĠ Ġ( writable Database . query ("$ DB _ PLAY LIST _ PREFIX $ db id ", Ġcolumns , Ġnull , Ġnull , Ġnull , Ġnull , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Id Ġ= Ġc . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list . map Ġ{ Ġit . id Ġ}. contains ( it Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Play able ( it Id )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĊĠĠĠĠĠĠĠ Ġstatement Ġ= Ġ" INSERT ĠOR ĠIG NORE ĠINTO Ġ$ DB _ PLAY LIST _ INFO _ ID Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ PLAY LIST _ ID , Ġ$ PLAY LIST _ AUTHOR , Ġ$ PLAY LIST _ LABEL , Ġ$ PLAY LIST _ CAP ACITY ) ĠVALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \" $ id \", Ġ\"$ author \", Ġ\"$ label \", Ġ$ capacity );" ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Playlist ( pl : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" INSERT ĠOR ĠREPLACE ĠINTO Ġ$ DB _ PLAY LIST _ INFO _ ID Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ PLAY LIST _ ID , Ġ$ PLAY LIST _ AUTHOR , Ġ$ PLAY LIST _ LABEL , Ġ$ PLAY LIST _ CAP ACITY ) ĠVALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \" ${ pl . id }\ ", Ġ\" ${ pl . author }\ ", Ġ\" ${ pl . label }\ ", Ġ${ pl . capacity }); " ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Play able ( id : ĠString ): ĠPlay able ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġget Play able Data ( id ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( data [ TRACK _ SOURCE ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay able Source . LOCAL . id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay able Local ( data [ TRACK _ PATH ]. toString (), Ġdata [ TRACK _ TITLE ]. toString (), Ġdata [ TRACK _ AUTHOR ]. toString (), Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlay able Source . Y OUT UBE . id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay able YouTube ( data [ TRACK _ PATH ]. toString (), Ġdata [ TRACK _ TITLE ]. toString (), Ġdata [ TRACK _ AUTHOR ]. toString (), Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Database ", Ġ" Unable Ġto Ġdeserialize Ġ'${ data [ TRACK _ ID ]} '. ĠUnknown Ġsource !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Play able Data ( p : ĠPlay able ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Play able Data ( p . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Play able Data ( id : ĠString ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < String , ĠAny >() ĊĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= ĠarrayOf ( TRACK _ ID , ĠTR ACK _ SOURCE , ĠTR ACK _ PATH , ĠTR ACK _ TITLE , ĠTR ACK _ AUTHOR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTR ACK _ AL BU M , ĠTR ACK _ YEAR , ĠTR ACK _ TRACK , ĠTR ACK _ GEN RE , ĠTR ACK _ RAT ING , ĠTR ACK _ LY R ICS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTR ACK _ START , ĠTR ACK _ END , ĠTR ACK _ LENGTH , ĠTR ACK _ COVER _ PATH ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreadable Database . query ( Constants . DB _ PLAY ABLE S _ ID , Ġcolumns , Ġ"$ TRACK _ ID = ?", ĠarrayOf ( id ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ ID ] Ġ= Ġc . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ SOURCE ] Ġ= Ġc . getString ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ PATH ] Ġ= Ġc . getString ( 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ TITLE ] Ġ= Ġc . getString ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ AUTHOR ] Ġ= Ġc . getString ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ AL BU M ] Ġ= Ġc . getString ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ YEAR ] Ġ= Ġc . getInt ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ TRACK ] Ġ= Ġc . getInt ( 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ GEN RE ] Ġ= Ġc . getString ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ RAT ING ] Ġ= Ġc . getInt ( 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ LY R ICS ] Ġ= Ġc . getString ( 1 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ START ] Ġ= Ġc . getInt ( 1 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ END ] Ġ= Ġc . getInt ( 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ LENGTH ] Ġ= Ġc . getInt ( 1 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ TRACK _ COVER _ PATH ] Ġ= Ġc . getString ( 1 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCursor Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Database ", Ġ" Cursor Index OutOfBoundsException Ġfor Ġ'$ id '. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Play able ( p : ĠPlay able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Info Ġ= Ġp . info ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" INSERT ĠOR ĠREPLACE ĠINTO Ġ$ DB _ PLAY ABLE S _ ID Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ TRACK _ ID , Ġ$ TRACK _ SOURCE , Ġ$ TRACK _ PATH , Ġ$ TRACK _ TITLE , Ġ$ TRACK _ AUTHOR , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ AL BU M , Ġ$ TRACK _ YEAR , Ġ$ TRACK _ TRACK , Ġ$ TRACK _ GEN RE , Ġ$ TRACK _ RAT ING , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ TRACK _ LY R ICS , Ġ$ TRACK _ START , Ġ$ TRACK _ END , Ġ$ TRACK _ LENGTH , Ġ$ TRACK _ COVER _ PATH ) ĠVALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \" ${ p . id }\ ", Ġ\" ${ p . play able Source . id }\ ", Ġ\" ${ p . path }\ ", Ġ\" ${ make DB Safe String ( p Info . title Ġ?: Ġ"") }\ ", Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" ${ make DB Safe String ( p Info . author Ġ?: Ġ"") }\ ", Ġ\" ${ make DB Safe String ( p Info . album Ġ?: Ġ"") }\ ", Ġ${ p Info . year Ġ?: Ġ 0 }, Ġ${ p Info . track Ġ?: Ġ 0 }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\" ${ p Info . genre Ġ?: Ġ"" }\ ", Ġ${ p Info . rating }, Ġ\" ${ p Info . lyr ics Ġ?: Ġ"" }\ ", Ġ${ p Info . start }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ p Info . end }, Ġ${ p Info . length }, Ġ\" ${ p Info . cover Path }\ "); " ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSQLite Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Database ", Ġ" Unable Ġto Ġexecute ĠSQL Ġstatement : Ġ$ statement ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠaddTo Playlist ( p : ĠPlay able , Ġto : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Play able ( p ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" INSERT ĠOR ĠREPLACE ĠINTO Ġ$ DB _ PLAY LIST _ PREFIX ${ make DB Safe String ( to . id )} Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ($ TRACK _ ID , Ġ$ TRACK _ TIMESTAMP ) ĠVALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \" ${ p . id }\ ", Ġ${ System . currentTimeMillis () }); " ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Play able ( p : ĠPlay able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" DELETE ĠFROM Ġ$ DB _ PLAY ABLE S _ ID ĠWHERE Ġ$ TRACK _ ID Ġ= Ġ\" ${ p . id }\ "; " ĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĊĠĠĠĠĠĠĠ ĠNote Stream . instance . data . play lists . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove From Playlist ( p , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove From Playlist ( p : ĠPlay able , Ġplaylist : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" DELETE ĠFROM Ġ$ DB _ PLAY LIST _ PREFIX ${ make DB Safe String ( playlist )} ĠWHERE Ġ$ TRACK _ ID Ġ= Ġ\" ${ p . id }\ "; " ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove From Playlist ( p : ĠPlay able , Ġfrom : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" DELETE ĠFROM Ġ$ DB _ PLAY LIST _ PREFIX ${ make DB Safe String ( from . id )} ĠWHERE Ġ$ TRACK _ ID Ġ= Ġ\" ${ p . id }\ "; " ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Playlist ( pl : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstatement Ġ= Ġ" DROP ĠTABLE ĠIF ĠEXISTS Ġ$ DB _ PLAY LIST _ PREFIX ${ make DB Safe String ( pl . id )}; " ĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĊĠĠĠĠĠĠĠ Ġstatement Ġ= Ġ" DELETE ĠFROM Ġ$ DB _ PLAY LIST _ INFO _ ID ĠWHERE Ġ$ PLAY LIST _ ID Ġ= Ġ\" ${ pl . id }\ "; " ĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Playlist ( pl : ĠPlaylist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġ" DELETE ĠFROM Ġ$ DB _ PLAY LIST _ PREFIX ${ make DB Safe String ( pl . id )}; " ĊĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL ( statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvac uum () Ġ{ ĊĠĠĠĠĠĠĠ Ġwritable Database . exec SQL (" V AC U UM ; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake DB Safe String ( s : ĠString ): ĠString Ġ= Ġs . replace ( Regex ("[ ^ \\ w \\ d ] "), Ġ"") Ċ }