169 lines
4.3 KiB
Lua
169 lines
4.3 KiB
Lua
--[[
|
|
* Copyright (C) 2014 Grilo Project
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
* as published by the Free Software Foundation; version 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*
|
|
--]]
|
|
|
|
---------------------------
|
|
-- Source initialization --
|
|
---------------------------
|
|
|
|
source = {
|
|
id = "grl-video-title-parsing",
|
|
name = "video-title-parsing",
|
|
description = "Video title parsing",
|
|
supported_keys = { "episode-title", 'show', 'publication-date', 'season', 'episode', 'title' },
|
|
supported_media = 'video',
|
|
resolve_keys = {
|
|
["type"] = "video",
|
|
required = { "title" },
|
|
},
|
|
}
|
|
|
|
blacklisted_words = {
|
|
"720p", "1080p", "x264",
|
|
"ws", "proper",
|
|
"real.repack", "repack",
|
|
"hdtv", "pdtv", "notv",
|
|
"dsr", "DVDRip", "divx", "xvid",
|
|
}
|
|
|
|
-- https://en.wikipedia.org/wiki/Video_file_format
|
|
video_suffixes = {
|
|
"webm", "mkv", "flv", "ogv", "ogg", "avi", "mov",
|
|
"wmv", "mp4", "m4v", "mpeg", "mpg"
|
|
}
|
|
|
|
parsers = {
|
|
tvshow = {
|
|
"(.-)[sS](%d+)[%s.]*[eE][pP]?(%d+)(.+)",
|
|
"(.-)(%d+)[xX.](%d+)(.+)",
|
|
},
|
|
movies = {
|
|
"(.-)(19%d%d)",
|
|
"(.-)(20%d%d)",
|
|
}
|
|
}
|
|
|
|
-- in case suffix is recognized, remove it and return true
|
|
-- or return the title and false if it fails
|
|
function remove_suffix(title)
|
|
local s = title:gsub(".*%.(.-)$", "%1")
|
|
if s then
|
|
for _, suffix in ipairs(video_suffixes) do
|
|
if s:find(suffix) then
|
|
local t = title:gsub("(.*)%..-$", "%1")
|
|
return t, true
|
|
end
|
|
end
|
|
end
|
|
return title, false
|
|
end
|
|
|
|
function clean_title(title)
|
|
return title:gsub("^[%s%W]*(.-)[%s%W]*$", "%1"):gsub("%.", " ")
|
|
end
|
|
|
|
function clean_title_from_blacklist(title)
|
|
local s = title:lower()
|
|
local last_index
|
|
local suffix_removed
|
|
|
|
-- remove movie suffix
|
|
s, suffix_removed = remove_suffix(s)
|
|
if suffix_removed == false then
|
|
grl.debug ("Suffix not find in " .. title)
|
|
end
|
|
|
|
-- ignore everything after the first blacklisted word
|
|
last_index = #s
|
|
for i, word in ipairs (blacklisted_words) do
|
|
local index = s:find(word:lower())
|
|
if index and index < last_index then
|
|
last_index = index - 1
|
|
end
|
|
end
|
|
return title:sub(1, last_index)
|
|
end
|
|
|
|
function parse_as_movie(media)
|
|
local title, date
|
|
local str = clean_title_from_blacklist (media.title)
|
|
for i, parser in ipairs(parsers.movies) do
|
|
title, date = str:match(parser)
|
|
if title and title ~= '' and date and date ~= '' then
|
|
media.title = clean_title(title)
|
|
media.publication_date = date
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function parse_as_episode(media)
|
|
local show, season, episode, title
|
|
for i, parser in ipairs(parsers.tvshow) do
|
|
show, season, episode, title = media.title:match(parser)
|
|
if show and season and episode and tonumber(season) < 50 then
|
|
media.show = clean_title(show)
|
|
media.season = season
|
|
media.episode = episode
|
|
media.episode_title = clean_title(clean_title_from_blacklist(title))
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function grl_source_resolve()
|
|
local req
|
|
local media = {}
|
|
|
|
req = grl.get_media_keys()
|
|
if not req or not req.title then
|
|
grl.callback()
|
|
return
|
|
end
|
|
|
|
media.title = req.title
|
|
|
|
-- It is easier to identify a tv show due information
|
|
-- related to episode and season number
|
|
if parse_as_episode(media) then
|
|
grl.debug(req.title .. " is an EPISODE")
|
|
grl.callback(media, 0)
|
|
return
|
|
end
|
|
|
|
if parse_as_movie(media) then
|
|
grl.debug(req.title .. " is a MOVIE")
|
|
grl.callback(media, 0)
|
|
return
|
|
end
|
|
|
|
local suffix_removed
|
|
media.title, suffix_removed = remove_suffix(media.title)
|
|
if media.title and suffix_removed then
|
|
grl.debug(req.title .. " is a MOVIE (without suffix)")
|
|
grl.callback(media, 0)
|
|
return
|
|
end
|
|
|
|
grl.debug("Fail to identify video: " .. req.title)
|
|
grl.callback()
|
|
end
|