mirror of
https://github.com/koreader/koreader
synced 2024-11-13 19:11:25 +00:00
2f9db25969
* Add a new socketutil module with a few helper functions that allow us to: * Always use a sane User-Agent (previously, only Wikipedia did so) * Set timeouts in an almost sane manner. Doing it explicitly prevents an interaction with KOSync that does crazy stuff I don't even want to try to understand. * Unified said timeouts based on the request's intended usage (except for Wikipedia, which already had meaningful timeout values). * Stopped using LuaSec directly, LuaSocket defers to LuaSec sanely on its own. Everything now transparently supports HTTPS without code duplication.
268 lines
8.4 KiB
Lua
268 lines
8.4 KiB
Lua
local Blitbuffer = require("ffi/blitbuffer")
|
|
local CenterContainer = require("ui/widget/container/centercontainer")
|
|
local CloseButton = require("ui/widget/closebutton")
|
|
local FrameContainer = require("ui/widget/container/framecontainer")
|
|
local Geom = require("ui/geometry")
|
|
local Font = require("ui/font")
|
|
local HorizontalGroup = require("ui/widget/horizontalgroup")
|
|
local HorizontalSpan = require("ui/widget/horizontalspan")
|
|
local ImageWidget = require("ui/widget/imagewidget")
|
|
local InputContainer = require("ui/widget/container/inputcontainer")
|
|
local LeftContainer = require("ui/widget/container/leftcontainer")
|
|
local LineWidget = require("ui/widget/linewidget")
|
|
local OverlapGroup = require("ui/widget/overlapgroup")
|
|
local RenderImage = require("ui/renderimage")
|
|
local ScrollHtmlWidget = require("ui/widget/scrollhtmlwidget")
|
|
local Size = require("ui/size")
|
|
local TextBoxWidget = require("ui/widget/textboxwidget")
|
|
local TextWidget = require("ui/widget/textwidget")
|
|
local UIManager = require("ui/uimanager")
|
|
local VerticalGroup = require("ui/widget/verticalgroup")
|
|
local VerticalSpan = require("ui/widget/verticalspan")
|
|
local https = require("ssl.https")
|
|
local _ = require("gettext")
|
|
local Screen = require("device").screen
|
|
local T = require("ffi/util").template
|
|
|
|
local GoodreadsBook = InputContainer:new{
|
|
padding = Size.padding.fullscreen,
|
|
}
|
|
|
|
function GoodreadsBook:init()
|
|
self.small_font_face = Font:getFace("smallffont")
|
|
self.medium_font_face = Font:getFace("ffont")
|
|
self.large_font_face = Font:getFace("largeffont")
|
|
self.screen_width = Screen:getWidth()
|
|
self.screen_height = Screen:getHeight()
|
|
UIManager:setDirty(self, function()
|
|
return "ui", self.dimen
|
|
end)
|
|
self[1] = FrameContainer:new{
|
|
width = self.screen_width,
|
|
height = self.screen_height,
|
|
background = Blitbuffer.COLOR_WHITE,
|
|
bordersize = 0,
|
|
padding = 0,
|
|
self:getStatusContent(self.screen_width),
|
|
}
|
|
end
|
|
|
|
function GoodreadsBook:getStatusContent(width)
|
|
return VerticalGroup:new{
|
|
align = "left",
|
|
OverlapGroup:new{
|
|
dimen = Geom:new{ w = width, h = Size.item.height_default },
|
|
CloseButton:new{ window = self },
|
|
},
|
|
self:genHeader(_("Book info")),
|
|
self:genBookInfoGroup(),
|
|
self:genHeader(_("Review")),
|
|
self:bookReview(),
|
|
}
|
|
end
|
|
|
|
function GoodreadsBook:genHeader(title)
|
|
local header_title = TextWidget:new{
|
|
text = title,
|
|
face = self.medium_font_face,
|
|
fgcolor = Blitbuffer.COLOR_WEB_GRAY,
|
|
}
|
|
local padding_span = HorizontalSpan:new{ width = self.padding}
|
|
local line_width = (self.screen_width - header_title:getSize().w) / 2 - self.padding * 2
|
|
local line_container = LeftContainer:new{
|
|
dimen = Geom:new{ w = line_width, h = self.screen_height / 25 },
|
|
LineWidget:new{
|
|
background = Blitbuffer.COLOR_LIGHT_GRAY,
|
|
dimen = Geom:new{
|
|
w = line_width,
|
|
h = Size.line.thick,
|
|
}
|
|
}
|
|
}
|
|
|
|
return VerticalGroup:new{
|
|
VerticalSpan:new{ width = Size.span.vertical_large },
|
|
HorizontalGroup:new{
|
|
align = "center",
|
|
padding_span,
|
|
line_container,
|
|
padding_span,
|
|
header_title,
|
|
padding_span,
|
|
line_container,
|
|
padding_span,
|
|
},
|
|
VerticalSpan:new{ width = Size.span.vertical_large },
|
|
}
|
|
end
|
|
|
|
function GoodreadsBook:genBookInfoGroup()
|
|
local split_span_width = math.floor(self.screen_width * 0.05)
|
|
local img_width, img_height
|
|
if Screen:getScreenMode() == "landscape" then
|
|
img_width = Screen:scaleBySize(132)
|
|
img_height = Screen:scaleBySize(184)
|
|
else
|
|
img_width = Screen:scaleBySize(132 * 1.5)
|
|
img_height = Screen:scaleBySize(184 * 1.5)
|
|
end
|
|
local height = img_height
|
|
local width = self.screen_width - 1.5 * split_span_width - img_width
|
|
-- title
|
|
local book_meta_info_group = VerticalGroup:new{
|
|
align = "center",
|
|
TextBoxWidget:new{
|
|
text = self.dates.title,
|
|
face = self.medium_font_face,
|
|
padding = Size.padding.small,
|
|
alignment = "center",
|
|
width = width,
|
|
},
|
|
}
|
|
-- author
|
|
local text_author = TextBoxWidget:new{
|
|
text = self.dates.author,
|
|
width = width,
|
|
face = self.large_font_face,
|
|
alignment = "center",
|
|
}
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = text_author:getSize().h },
|
|
text_author
|
|
}
|
|
)
|
|
--span
|
|
local span_author = VerticalSpan:new{ width = math.floor(height * 0.1) }
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = Screen:scaleBySize(10) },
|
|
span_author
|
|
}
|
|
)
|
|
-- series
|
|
local text_series = TextWidget:new{
|
|
text = T(_("Series: %1"), self.dates.series),
|
|
face = self.small_font_face,
|
|
padding = Size.padding.small,
|
|
}
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = text_series:getSize().h },
|
|
text_series
|
|
}
|
|
)
|
|
-- rating
|
|
local text_rating = TextWidget:new{
|
|
text = T(_("Rating: %1"), self.dates.rating),
|
|
face = self.small_font_face,
|
|
padding = Size.padding.small,
|
|
}
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = text_rating:getSize().h },
|
|
text_rating
|
|
}
|
|
)
|
|
-- pages
|
|
local text_pages = TextWidget:new{
|
|
text = T(_("Pages: %1"), self.dates.pages),
|
|
face = self.small_font_face,
|
|
padding = Size.padding.small,
|
|
}
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = text_pages:getSize().h },
|
|
text_pages
|
|
}
|
|
)
|
|
-- relesse date
|
|
local text_release = TextWidget:new{
|
|
text = T(_("Release date: %1"), self.dates.release),
|
|
face = self.small_font_face,
|
|
padding = Size.padding.small,
|
|
}
|
|
table.insert(book_meta_info_group,
|
|
CenterContainer:new{
|
|
dimen = Geom:new{ w = width, h = text_release:getSize().h },
|
|
text_release
|
|
}
|
|
)
|
|
local book_info_group = HorizontalGroup:new{
|
|
align = "top",
|
|
HorizontalSpan:new{ width = split_span_width }
|
|
}
|
|
-- thumbnail
|
|
local body = https.request(self.dates.image)
|
|
local bb_image
|
|
if body then bb_image = RenderImage:renderImageData(body, #body, false, img_width, img_height) end
|
|
if bb_image then
|
|
table.insert(book_info_group, ImageWidget:new{
|
|
image = bb_image,
|
|
})
|
|
else
|
|
table.insert(book_info_group, ImageWidget:new{
|
|
file = "plugins/goodreads.koplugin/goodreadsnophoto.png",
|
|
width = img_width,
|
|
height = img_height,
|
|
})
|
|
end
|
|
|
|
local book_info_group_span = HorizontalGroup:new{
|
|
align = "top",
|
|
HorizontalSpan:new{ width = split_span_width / 2 }
|
|
}
|
|
table.insert(book_info_group, book_info_group_span)
|
|
table.insert(book_info_group, CenterContainer:new{
|
|
dimen = Geom:new{ w = width , h = height },
|
|
book_meta_info_group,
|
|
})
|
|
return CenterContainer:new{
|
|
dimen = Geom:new{ w = self.screen_width, h = math.floor(self.screen_height * 0.35) },
|
|
book_info_group,
|
|
}
|
|
end
|
|
|
|
function GoodreadsBook:bookReview()
|
|
local css = [[
|
|
@page {
|
|
margin: 0;
|
|
font-family: 'Noto Sans';
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
line-height: 1.3;
|
|
text-align: justify;
|
|
}
|
|
]]
|
|
|
|
local book_meta_info_group = VerticalGroup:new{
|
|
align = "center",
|
|
padding = 0,
|
|
bordersize = 0,
|
|
ScrollHtmlWidget:new{
|
|
html_body = self.dates.description,
|
|
css = css,
|
|
width = math.floor(self.screen_width * 0.9),
|
|
height = math.floor(self.screen_height * 0.48),
|
|
dialog = self,
|
|
}
|
|
}
|
|
return CenterContainer:new{
|
|
dimen = Geom:new{ w = self.screen_width, h = math.floor(self.screen_height * 0.5) },
|
|
book_meta_info_group,
|
|
}
|
|
end
|
|
|
|
function GoodreadsBook:onAnyKeyPressed()
|
|
return self:onClose()
|
|
end
|
|
|
|
function GoodreadsBook:onClose()
|
|
UIManager:close(self, "flashui")
|
|
return true
|
|
end
|
|
|
|
return GoodreadsBook
|