mediaServer.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package main
  2. import (
  3. "net/http"
  4. "net/url"
  5. "imuslab.com/arozos/mod/apt"
  6. "imuslab.com/arozos/mod/media/mediaserver"
  7. )
  8. /*
  9. Media Server
  10. This function serve large file objects like video and audio file via asynchronize go routine :)
  11. Example usage:
  12. /media/?file=user:/Desktop/test/02.Orchestra- エミール (Addendum version).mp3
  13. /media/?file=user:/Desktop/test/02.Orchestra- エミール (Addendum version).mp3&download=true
  14. This will serve / download the file located at files/users/{username}/Desktop/test/02.Orchestra- エミール (Addendum version).mp3
  15. PLEASE ALWAYS USE URLENCODE IN THE LINK PASSED INTO THE /media ENDPOINT
  16. */
  17. func mediaServer_init() {
  18. //Create a media server
  19. mediaServer = mediaserver.NewMediaServer(&mediaserver.Options{
  20. BufferPoolSize: *bufferPoolSize,
  21. BufferFileMaxSize: *bufferFileMaxSize,
  22. EnableFileBuffering: *enable_buffering,
  23. TmpDirectory: *tmp_directory,
  24. Authagent: authAgent,
  25. UserHandler: userHandler,
  26. Logger: systemWideLogger,
  27. })
  28. //Setup the virtual path resolver
  29. mediaServer.SetVirtualPathResolver(GetFSHandlerSubpathFromVpath)
  30. //Register media serving endpoints
  31. http.HandleFunc("/media/", mediaServer.ServerMedia)
  32. http.HandleFunc("/media/download/", mediaServer.ServerMedia) //alias for &download=xxx
  33. http.HandleFunc("/media/getMime/", mediaServer.ServeMediaMime)
  34. //Check if ffmpeg exists
  35. ffmpegInstalled, _ := apt.PackageExists("ffmpeg")
  36. if ffmpegInstalled {
  37. //ffmpeg installed. allow transcode
  38. http.HandleFunc("/media/transcode/", mediaServer.ServeVideoWithTranscode)
  39. http.HandleFunc("/media/transcode/audio/", mediaServer.ServeAudioWithTranscode)
  40. http.HandleFunc("/media/duration/", mediaServer.GetAudioDuration)
  41. } else {
  42. //ffmpeg not installed. Redirect transcode endpoint back to /media/
  43. http.HandleFunc("/media/transcode/", func(w http.ResponseWriter, r *http.Request) {
  44. // Extract the original query parameters
  45. originalURL := r.URL
  46. queryParams := originalURL.RawQuery
  47. // Define the new base URL for redirection
  48. newBaseURL := "/media/"
  49. // Parse the new base URL
  50. newURL, err := url.Parse(newBaseURL)
  51. if err != nil {
  52. http.Error(w, "Internal Server Error", http.StatusInternalServerError)
  53. return
  54. }
  55. // Append the original query parameters to the new URL
  56. newURL.RawQuery = queryParams
  57. // Perform the redirection
  58. http.Redirect(w, r, newURL.String(), http.StatusFound)
  59. })
  60. }
  61. }