Advertisement
Guest User

Untitled

a guest
May 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. class MediaFinder
  2.  
  3. alias FileInfo = NamedTuple(name: String, directory: String, size: UInt64)
  4.  
  5. DEFAULT_MEDIA_TYPES = {
  6. images: ["jpg", "jpeg", "gif", "png", "exif", "tiff", "bmp"],
  7. videos: ["webm", "mkv", "flv", "vob", "ogv", "ogg", "gifv", "mng", "avi", "mts", "m2ts", "mov", "qt", "wmv", "mp4", "m4p", "mpg", "mpeg", "m4v", "3gp", "3g2"],
  8. audios: ["aa", "aac", "aax", "aiff", "flac", "m4a", "m4p", "mp3", "ogg", "sln", "wav", "wma"]
  9. }
  10.  
  11. @media_types = DEFAULT_MEDIA_TYPES
  12.  
  13. @search_paths = [] of String
  14.  
  15. getter matches
  16. @matches = [] of FileInfo
  17.  
  18. def initialize
  19. end
  20.  
  21. def search_for(media_key : Symbol | String)
  22. media_key = media_key.to_s
  23.  
  24. unless @media_types.has_key?(media_key)
  25. raise "Media type '#{media_key}' is invalid"
  26. end
  27.  
  28. file_exts = @media_types[media_key]
  29. file_paths = [] of String
  30.  
  31. @search_paths.each do |path|
  32. dir = Dir.glob(path)
  33. puts "#{path}\t- found #{dir.size} files"
  34. dir.reject! { |i| [".", ".."].includes?(i) }
  35. file_paths.concat(dir)
  36. end
  37.  
  38. file_paths.each do |p|
  39. ext = p.split(".").last
  40. info = {
  41. name: File.basename(p),
  42. directory: File.dirname(p),
  43. size: File.size(p)
  44. }
  45.  
  46. @matches.push(info) if file_exts.includes?(ext)
  47. end
  48.  
  49. puts "Found #{@matches.size} #{media_key[0..-2]} files"
  50. end
  51.  
  52. def add_search_path(path : String, base_dir = nil)
  53. @search_paths.push( File.expand_path(path, base_dir) ).uniq!
  54. end
  55.  
  56. end
  57.  
  58. m = MediaFinder.new
  59. m.add_search_path "~/Pictures/**/*"
  60. m.search_for :images
  61. grouped = m.matches.group_by { |info| info[:directory] }
  62. pp grouped
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement