niedziela, 24 lipca 2011

XBMC match movie title based on filename

Bardzo często zdarzało mi się że XBMC przydzielał niepoprawny film z imdb na podstawie dziwnej nazwy pliku np: "rx-hl-720p-dtshd.mkv"
Z poziomu interfejsu XBMC znalezienie takich nieprawidłowości było niemożliwe.

Większość moich filmów ma poprawne nazwy katalogów więc pomyślełem że mogę użyć nazwy katalogu do weryfikcaji tego co XBMC przypisał do danego pliku na dysku.

XBMC składuje swoje dane w sqlite i ma ładny opis co gdzie leży. W związku z tym napisałem króciutki programik do weryfikacji mapowań XBMC:


require 'rubygems'
require 'sqlite3'

STOPWORDS = [ "the", "ii", "iii", "iv", "v", "vi", "3d"]
WHITELIST = YAML.load_file(ENV['HOME'] + '/bin/xbmc-verify.yml')

def detect_movie(title, path)
words = title.downcase.gsub(/[^a-z0-9]+/, " ").gsub(/ +/, " ").split(" ")
words.delete_if { |w| STOPWORDS.include? w }
dir = path.downcase
included = words.collect { |w| dir.include?(w) ? true : nil }.compact
included.length == words.length
end

db = SQLite3::Database.new ENV['HOME'] + "/.xbmc/userdata/Database/MyVideos34.db"

db.execute("select c00, c16, strPath from movieview" ) do |row|
next if WHITELIST.include? File.basename(row[2])
unless detect_movie(row[0], row[2]) or detect_movie(row[1], row[2])
movie_title = row[1]
movie_title << " (#{row[0]})" if row[0] != row[1]
puts "!!! #{movie_title} - #{row[2]}"
end
end