Created
October 29, 2010 20:48
-
-
Save georgboe/654376 to your computer and use it in GitHub Desktop.
Sorts downloaded files and folders into categories.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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