77 "strings"
88 "regexp"
99 "fmt"
10+ "path/filepath"
11+ "io"
1012 "golang.org/x/sync/errgroup"
1113
1214 cfg "explo/src/config"
@@ -33,7 +35,7 @@ func NewDownloader(cfg *cfg.DownloadConfig, httpClient *util.HttpClient) *Downlo
3335 case "youtube" :
3436 downloader = append (downloader , NewYoutube (cfg .Youtube , cfg .Discovery , cfg .DownloadDir , httpClient ))
3537 case "slskd" :
36- slskdClient := NewSlskd (cfg .Slskd )
38+ slskdClient := NewSlskd (cfg .Slskd , cfg . DownloadDir )
3739 slskdClient .AddHeader ()
3840 downloader = append (downloader , slskdClient )
3941 default :
@@ -128,4 +130,60 @@ func getFilename(title, artist string) string {
128130 a := re .ReplaceAllString (artist , "_" )
129131
130132 return fmt .Sprintf ("%s-%s" ,t ,a )
133+ }
134+
135+ func moveDownload (srcDir , destDir , trackPath , file string ) error { // Move download from the source dir to the dest dir (download dir)
136+ trackDir := filepath .Join (srcDir , trackPath )
137+ srcFile := filepath .Join (trackDir , file )
138+
139+ info , err := os .Stat (srcFile )
140+ if err != nil {
141+ return fmt .Errorf ("stat error: %s" , err .Error ())
142+ }
143+
144+ in , err := os .Open (srcFile )
145+ if err != nil {
146+ return fmt .Errorf ("couldn't open source file: %s" , err .Error ())
147+ }
148+
149+ defer func () {
150+ if cerr := in .Close (); cerr != nil {
151+ log .Printf ("warning: failed to close source file: %s" , cerr )
152+ }
153+ }()
154+
155+ dstDir := filepath .Join (destDir , trackPath )
156+ if err = os .MkdirAll (dstDir , os .ModePerm ); err != nil {
157+ return fmt .Errorf ("couldn't make download directory: %s" , err .Error ())
158+ }
159+
160+ dstFile := filepath .Join (dstDir , file )
161+ out , err := os .Create (dstFile )
162+ if err != nil {
163+ return fmt .Errorf ("couldn't create destination file: %s" , err .Error ())
164+ }
165+
166+ defer func () {
167+ if err = out .Close (); err != nil {
168+ log .Printf ("failed to close destination file: %s" , err .Error ())
169+ }
170+ }()
171+
172+ if _ , err = io .Copy (out , in ); err != nil {
173+ return fmt .Errorf ("copy failed: %s" , err .Error ())
174+ }
175+
176+ if err = out .Sync (); err != nil {
177+ return fmt .Errorf ("sync failed: %s" , err .Error ())
178+ }
179+
180+ if err = os .Chmod (dstFile , info .Mode ()); err != nil {
181+ return fmt .Errorf ("chmod failed: %s" , err .Error ())
182+ }
183+
184+ if err = os .Remove (srcFile ); err != nil {
185+ return fmt .Errorf ("failed to delete original file: %s" , err .Error ())
186+ }
187+
188+ return nil
131189}
0 commit comments