From 19f0a8bc72f58397d3191162e3c01e3fa093e0c9 Mon Sep 17 00:00:00 2001 From: Jadon Fowler Date: Mon, 30 Oct 2017 17:23:54 -0700 Subject: [PATCH 1/2] Scrape README from GitHub if the source is provided If a user provides a source repository on GitHub for the project, the contents of the Home page will be set to the contents of the README. Closes #87 Signed-off-by: Jadon Fowler --- app/models/project/Project.scala | 14 +++++++++++++- app/util/GitHubUtil.scala | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 app/util/GitHubUtil.scala diff --git a/app/models/project/Project.scala b/app/models/project/Project.scala index 3a2c85e81..4b30bf552 100755 --- a/app/models/project/Project.scala +++ b/app/models/project/Project.scala @@ -23,6 +23,7 @@ import ore.project.FlagReasons.FlagReason import ore.project.{Categories, ProjectMember} import ore.user.MembershipDossier import ore.{Joinable, Visitable} +import util.GitHubUtil import util.StringUtils._ /** @@ -446,7 +447,18 @@ case class Project(override val id: Option[Int] = None, * @return Project home page */ def homePage: Page = Defined { - val page = new Page(this.id.get, Page.HomeName, Page.Template(this.name, Page.HomeMessage), false, -1) + var body = Page.HomeMessage + val source = this.settings.source + if (source.isDefined && GitHubUtil.isGitHubUrl(source.get)) { + val urlParts = source.get.split("//github.com/")(1).split("/") + val ghUser = urlParts(0) + val ghProject = urlParts(1) + val readme = GitHubUtil.getReadme(ghUser, ghProject) + if (readme != null && readme.isDefined) { + body = readme.get + } + } + val page = new Page(this.id.get, Page.HomeName, Page.Template(this.name, body), false, -1) this.service.await(page.schema.getOrInsert(page)).get } diff --git a/app/util/GitHubUtil.scala b/app/util/GitHubUtil.scala new file mode 100644 index 000000000..0d968addb --- /dev/null +++ b/app/util/GitHubUtil.scala @@ -0,0 +1,24 @@ +package util + +import java.io.FileNotFoundException + +import scala.io.Source + +object GitHubUtil { + + private val identifier = "A-Za-z0-9-_" + private val gitHubUrlPattern = s"""http(s)?://github.com/[$identifier]+/[$identifier]+(/)?""".r.pattern + private val readmeUrl = "https://raw.githubusercontent.com/%s/%s/master/README.md" + + def isGitHubUrl(url: String): Boolean = gitHubUrlPattern.matcher(url).matches() + + def getReadme(user: String, project: String): Option[String] = { + try { + val readme = Source.fromURL(readmeUrl.format(user, project)).mkString + Some(readme) + } catch { + case _: FileNotFoundException => None + } + } + +} From 37f6cd61b6153536c4dee874611cf68c6e888377 Mon Sep 17 00:00:00 2001 From: Jadon Fowler Date: Tue, 13 Mar 2018 23:09:29 -0700 Subject: [PATCH 2/2] Support any GitHub README when scraping GitHub has a lovely API for retrieving a repository's README. Signed-off-by: Jadon Fowler --- app/util/GitHubUtil.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/util/GitHubUtil.scala b/app/util/GitHubUtil.scala index 0d968addb..ef39483e5 100644 --- a/app/util/GitHubUtil.scala +++ b/app/util/GitHubUtil.scala @@ -2,19 +2,23 @@ package util import java.io.FileNotFoundException +import play.api.libs.json.{JsValue, Json} + import scala.io.Source object GitHubUtil { private val identifier = "A-Za-z0-9-_" private val gitHubUrlPattern = s"""http(s)?://github.com/[$identifier]+/[$identifier]+(/)?""".r.pattern - private val readmeUrl = "https://raw.githubusercontent.com/%s/%s/master/README.md" + private val readmeApi = "https://api.github.com/repos/%s/%s/readme" def isGitHubUrl(url: String): Boolean = gitHubUrlPattern.matcher(url).matches() def getReadme(user: String, project: String): Option[String] = { try { - val readme = Source.fromURL(readmeUrl.format(user, project)).mkString + val readmeApiJson: JsValue = Json.parse(Source.fromURL(readmeApi.format(user, project)).mkString) + val url = (readmeApiJson \ "download_url").get.toString() + val readme = Source.fromURL(url).mkString Some(readme) } catch { case _: FileNotFoundException => None