Skip to content

Instantly share code, notes, and snippets.

@georgboe
Created October 29, 2010 20:48
Show Gist options
  • Save georgboe/654376 to your computer and use it in GitHub Desktop.
Save georgboe/654376 to your computer and use it in GitHub Desktop.
Sorts downloaded files and folders into categories.
class ReleaseSorter
def self.sorters
@sorters ||= Array.new
end
def self.sort_statistics(release_name)
sorters.each do |sorter|
puts "#{sorter.name} - #{sorter.perform_match(release_name)}"
end
puts
end
def self.sort_release(release_name)
results = {}
raise "No matchers available" if sorters.empty?
sorters.each do |sorter|
results[sorter.name] = sorter.perform_match(release_name)
end
categories = results.select { |k,v| v == results.values.max }.keys
categories.length == 1 ? categories.first : categories
end
end
class SorterClass
def self.inherited(klass)
ReleaseSorter.sorters << klass
end
def self.matchers
@matchers ||= Array.new
end
def self.disqualifiers
@disqualifiers ||= Array.new
end
def self.match(arg)
matchers << arg
end
def self.disqualify(arg)
disqualifiers << arg
end
def self.perform_match(release_name)
raise "@matchers must be set in all subclasses." if @matchers.nil?
disqualifiers.each do |disqualifier|
return 0 if release_name.match(Regexp.new(disqualifier, Regexp::IGNORECASE))
end
count = 0
matchers.each do |matcher|
count += 1 if release_name.match(Regexp.new(matcher, Regexp::IGNORECASE))
end
count
end
end
class APPS < SorterClass
match "0DAY"
match "WIN"
match "MAC"
match "Keygen"
match "KeyMaker"
match "Patch"
match "MacOSX"
match "x86"
match "x64"
match "serial"
match "[\\. ]v?(\\d{1,2}\\.+)+" # v1.2.0
match "dmg"
end
class DOX < SorterClass
match "ebook"
match "e-book"
match "pdf"
match "training"
end
class HD < SorterClass
match "(19|20)\\d{2}" # 1995 or 2010
match "bluray"
match "x264"
match "720p"
match "1080p"
match "DTS"
match "mkv"
match "hddvd"
disqualify "dvdrip"
disqualify "dvdscr"
end
class MP3 < SorterClass
match "CDS"
match "CDM"
match "FLAC"
match "OST"
match "soundtrack"
match "kbps"
match "mp3"
match "VA-"
match "Various Artists"
match "\\dCD" # 2CD
match "(19|20)\\d{2}" # 1995 or 2010
end
class TVX264 < SorterClass
match "S\\d{2}E\\d{2}" # S02E04
match "720p"
match "HDTV"
match "x264"
match "bluray"
match "WEB-DL"
match "\\d{2}x\\d{2}" # 02x04
match ".mkv$" # .mkv
match "(19|20)\\d{2}.\\d{2}.\\d{2}" # 2010.10.28
disqualify "PDTV"
end
class TVXVID < SorterClass
match "S\\d{2}E\\d{2}" # S02E04
match "S\\d{2}\." # S06
match "PDTV"
match "HDTV"
match "xvid"
match "webtv"
match "webrip"
match "dvdrip"
match "ws"
match "\\d{2}x\\d{2}" # 02x04
match "(19|20)\\d{2}.\\d{2}.\\d{2}" # 2010.10.28
match ".avi$" # .avi
end
class XVID < SorterClass
match "(19|20)\\d{2}" # 1995 or 2010
match "xvid"
match "dvdrip"
match "r5"
match "line"
match "dvdscr"
match "[\\. ]ts" # .TS
match "[\\. ]tc" # .TC
match "r6"
end
if $0 == __FILE__
unless ARGV.length > 0
abort "Usage: #{$0} [FILE OR FOLDER]"
end
ARGV.each do |arg|
puts "#{File.basename(arg)} - #{ReleaseSorter.sort_release(File.basename(arg))}"
# puts "#{File.basename(arg)} - #{ReleaseSorter.sort_statistics(File.basename(arg))}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment