diff --git a/Dockerfile b/Dockerfile index 77878032f93b50f9ddd6b35102857a8072556388..aab9e4e9675acc136098e13cd8ff08cb45214e1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,12 @@ FROM golang:alpine as go_builder -RUN apk add --no-cache curl -RUN curl https://glide.sh/get | sh - -WORKDIR /go/src/app -COPY glide.* ./ -RUN glide install +WORKDIR /src +COPY go.* ./ +RUN go mod download COPY *.go ./ -RUN CGO_ENABLED=0 GOOS=linux go build -a app . +RUN CGO_ENABLED=0 GOOS=linux go build -o app . FROM scratch COPY --from=go_builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ -COPY --from=go_builder /go/src/app/app /app -ENTRYPOINT ["/app"] \ No newline at end of file +COPY --from=go_builder /src/app /app +ENTRYPOINT ["/app"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..1949a53a90813eeb4dd4499fcd0ca9d00aa2a68c --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +IMAGE := k8r.eu/justjanne/$(shell basename $(shell git remote get-url origin) .git) +TAGS := $(shell git describe --always --tags HEAD) + +.PHONY: build +build: + docker build --pull -t $(IMAGE):$(TAGS) . + docker tag $(IMAGE):$(TAGS) $(IMAGE):latest + @echo Successfully tagged $(IMAGE):$(TAGS) as latest + +.PHONY: push +push: build + docker push $(IMAGE):$(TAGS) + docker push $(IMAGE):latest + @echo Successfully pushed $(IMAGE):$(TAGS) as latest diff --git a/build.sh b/build.sh deleted file mode 100755 index d96811f2e8858ed305a9c3413b1451aa520f6701..0000000000000000000000000000000000000000 --- a/build.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -IMAGE=k8r.eu/justjanne/embed-helper -TAGS=$(git describe --always --tags HEAD) - -docker build -t $IMAGE:$TAGS . -docker tag $IMAGE:$TAGS $IMAGE:latest -echo Successfully tagged $IMAGE:latest -docker push $IMAGE:$TAGS -docker push $IMAGE:latest diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index dfbb00486baecac3c264cd77b5f9408539e0ffb1..0000000000000000000000000000000000000000 --- a/deploy.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -IMAGE=k8r.eu/justjanne/embed-helper -TAGS=$(git describe --always --tags HEAD) -DEPLOYMENT=embed-helper -POD=embed-helper - -kubectl set image deployment/$DEPLOYMENT $POD=$IMAGE:$TAGS diff --git a/glide.lock b/glide.lock deleted file mode 100644 index 6afde7f907e2721d806994b0d5204b7f7643480c..0000000000000000000000000000000000000000 --- a/glide.lock +++ /dev/null @@ -1,48 +0,0 @@ -hash: 580579292d28074fd3d1d1dc8839c97e8dad3795380023d934db98c6e8d47158 -updated: 2019-02-04T17:02:06.067158062+01:00 -imports: -- name: github.com/andybalholm/cascadia - version: 680b6a57bda4f657485ad44bdea42342ead737bc -- name: github.com/dyatlov/go-htmlinfo - version: d9417c75de65fbae5b16f4038b421c9e1cc61f0d - subpackages: - - htmlinfo -- name: github.com/dyatlov/go-oembed - version: 4bc5ab7a42e91e45e957f9b0c47f911efed16710 - subpackages: - - oembed -- name: github.com/dyatlov/go-opengraph - version: 816b6608b3c8c1e871bc9cf777f390e2532081fe - subpackages: - - opengraph -- name: github.com/dyatlov/go-readability - version: e7b2080f87f824caa519ed33dac6d4e4e413616d -- name: github.com/Jeffail/gabs - version: 7a0fed31069aba77993a518cc2f37b28ee7aa883 -- name: github.com/PuerkitoBio/goquery - version: 3dcf72e6c17f694381a21592651ca1464ded0e10 -- name: golang.org/x/net - version: bc3663df0ac92f928d419e31e0d2af22e683a5a2 - subpackages: - - html - - html/atom - - html/charset -- name: golang.org/x/text - version: f28f36722d5ef2f9655ad3de1f248e3e52ad5ebd - subpackages: - - encoding - - encoding/charmap - - encoding/htmlindex - - encoding/internal - - encoding/internal/identifier - - encoding/japanese - - encoding/korean - - encoding/simplifiedchinese - - encoding/traditionalchinese - - encoding/unicode - - internal/tag - - internal/utf8internal - - language - - runes - - transform -testImports: [] diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index 94b53616354e18a0406d45459e54a29e66c5b57a..0000000000000000000000000000000000000000 --- a/glide.yaml +++ /dev/null @@ -1,3 +0,0 @@ -package: git.kuschku.de/justjanne/embed-helper -import: -- package: github.com/dyatlov/go-htmlinfo/htmlinfo \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..bfee6403f20992b7b57abd4045a4fe01f81a31ac --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.kuschku.de/justjanne/embed-helper + +go 1.13 + +require golang.org/x/net v0.0.0-20160621215608-bc3663df0ac9 diff --git a/main.go b/main.go index a0f411afa93575dbe6c0e4543211c113a4d4b6c5..1055c6c48423967d73bded55c4092b9a8cf10b0a 100644 --- a/main.go +++ b/main.go @@ -136,6 +136,7 @@ type DataField struct { } type Data struct { + FromUrl string `json:"from_url"` Color string `json:"color"` AuthorName string `json:"author_name"` AuthorLink string `json:"author_link"` @@ -147,7 +148,7 @@ type Data struct { ImageUrl string `json:"image_url"` Type string `json:"type"` Player string `json:"player"` - Service string `json:"service"` + ServiceName string `json:"service_name"` ServiceIcon string `json:"service_icon"` Ts int `json:"ts"` } @@ -200,6 +201,7 @@ func resolve(base *url.URL, path string) string { func buildData(in InternalData, oEmbed OEmbed, providerFallbacks []func(*InternalData)) (out Data) { out = Data{} + out.FromUrl = in.url.String() out.TitleLink = in.url.String() out.Title = coalesce([]string{in.twitterTitle, in.ogTitle, in.metaTitle, in.title}) out.Text = coalesce([]string{in.twitterDescription, in.ogDescription, in.metaDescription}) @@ -208,9 +210,9 @@ func buildData(in InternalData, oEmbed OEmbed, providerFallbacks []func(*Interna for _, fallback := range providerFallbacks { out.Color = coalesce([]string{in.metaThemeColor, in.urlProviderMetaThemeColor}) - out.Service = coalesce([]string{oEmbed.ProviderName, in.ogSiteName, in.urlProviderOgSiteName, in.urlProviderMetaTitle, in.urlProviderTitle}) + out.ServiceName = coalesce([]string{oEmbed.ProviderName, in.ogSiteName, in.urlProviderOgSiteName, in.urlProviderMetaTitle, in.urlProviderTitle}) out.ServiceIcon = resolve(in.url, coalesce([]string{in.linkFavicon, in.urlProviderLinkFavicon, in.urlProviderIconPng, in.urlProviderIconIco})) - if out.Service != "" && out.ServiceIcon != "" { + if out.ServiceName != "" && out.ServiceIcon != "" { break } fallback(&in) @@ -283,234 +285,378 @@ func main() { matchers := map[string]func(*InternalData, string, string){} matchers["meta/twitter:card"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterCard = content + if internalData.twitterCard == "" { + internalData.twitterCard = content + } } matchers["meta/twitter:site"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterSite = content + if internalData.twitterSite == "" { + internalData.twitterSite = content + } } matchers["meta/twitter:site:id"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterSiteId = content + if internalData.twitterSiteId == "" { + internalData.twitterSiteId = content + } } matchers["meta/twitter:creator"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterCreator = content + if internalData.twitterCreator == "" { + internalData.twitterCreator = content + } } matchers["meta/twitter:creator:id"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterCreatorId = content + if internalData.twitterCreatorId == "" { + internalData.twitterCreatorId = content + } } matchers["meta/twitter:description"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterDescription = content + if internalData.twitterDescription == "" { + internalData.twitterDescription = content + } } matchers["meta/twitter:title"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterTitle = content + if internalData.twitterTitle == "" { + internalData.twitterTitle = content + } } matchers["meta/twitter:image"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterImage = content + if internalData.twitterImage == "" { + internalData.twitterImage = content + } } matchers["meta/twitter:image:src"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterImage = content + if internalData.twitterImage == "" { + internalData.twitterImage = content + } } matchers["meta/twitter:image:alt"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterImageAlt = content + if internalData.twitterImageAlt == "" { + internalData.twitterImageAlt = content + } } matchers["meta/twitter:player"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterPlayer = content + if internalData.twitterPlayer == "" { + internalData.twitterPlayer = content + } } matchers["meta/twitter:player:width"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterPlayerWidth = content + if internalData.twitterPlayerWidth == "" { + internalData.twitterPlayerWidth = content + } } matchers["meta/twitter:player:height"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterPlayerHeight = content + if internalData.twitterPlayerHeight == "" { + internalData.twitterPlayerHeight = content + } } matchers["meta/twitter:player:stream"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterPlayerStream = content + if internalData.twitterPlayerStream == "" { + internalData.twitterPlayerStream = content + } } matchers["meta/twitter:app:name:iphone"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppNameIphone = content + if internalData.twitterAppNameIphone == "" { + internalData.twitterAppNameIphone = content + } } matchers["meta/twitter:app:id:iphone"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppIdIphone = content + if internalData.twitterAppIdIphone == "" { + internalData.twitterAppIdIphone = content + } } matchers["meta/twitter:app:url:iphone"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppUrlIphone = content + if internalData.twitterAppUrlIphone == "" { + internalData.twitterAppUrlIphone = content + } } matchers["meta/twitter:app:name:ipad"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppNameIpad = content + if internalData.twitterAppNameIpad == "" { + internalData.twitterAppNameIpad = content + } } matchers["meta/twitter:app:id:ipad"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppIdIpad = content + if internalData.twitterAppIdIpad == "" { + internalData.twitterAppIdIpad = content + } } matchers["meta/twitter:app:url:ipad"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppUrlIpad = content + if internalData.twitterAppUrlIpad == "" { + internalData.twitterAppUrlIpad = content + } } matchers["meta/twitter:app:name:googleplay"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppNameGoogleplay = content + if internalData.twitterAppNameGoogleplay == "" { + internalData.twitterAppNameGoogleplay = content + } } matchers["meta/twitter:app:id:googleplay"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppIdGoogleplay = content + if internalData.twitterAppIdGoogleplay == "" { + internalData.twitterAppIdGoogleplay = content + } } matchers["meta/twitter:app:url:googleplay"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterAppUrlGoogleplay = content + if internalData.twitterAppUrlGoogleplay == "" { + internalData.twitterAppUrlGoogleplay = content + } } matchers["meta/twitter:label1"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterLabel1 = content + if internalData.twitterLabel1 == "" { + internalData.twitterLabel1 = content + } } matchers["meta/twitter:data1"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterData1 = content + if internalData.twitterData1 == "" { + internalData.twitterData1 = content + } } matchers["meta/twitter:label2"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterLabel2 = content + if internalData.twitterLabel2 == "" { + internalData.twitterLabel2 = content + } } matchers["meta/twitter:data2"] = func(internalData *InternalData, content string, extra string) { - internalData.twitterData2 = content + if internalData.twitterData2 == "" { + internalData.twitterData2 = content + } } matchers["meta/og:url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogUrl = content + if internalData.ogUrl == "" { + internalData.ogUrl = content + } } matchers["meta/og:title"] = func(internalData *InternalData, content string, extra string) { - internalData.ogTitle = content + if internalData.ogTitle == "" { + internalData.ogTitle = content + } } matchers["meta/og:description"] = func(internalData *InternalData, content string, extra string) { - internalData.ogDescription = content + if internalData.ogDescription == "" { + internalData.ogDescription = content + } } matchers["meta/og:type"] = func(internalData *InternalData, content string, extra string) { - internalData.ogType = content + if internalData.ogType == "" { + internalData.ogType = content + } } matchers["meta/og:locale"] = func(internalData *InternalData, content string, extra string) { - internalData.ogLocale = content + if internalData.ogLocale == "" { + internalData.ogLocale = content + } } matchers["meta/og:video"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideo = content + if internalData.ogVideo == "" { + internalData.ogVideo = content + } } matchers["meta/og:video:url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideoUrl = content + if internalData.ogVideoUrl == "" { + internalData.ogVideoUrl = content + } } matchers["meta/og:video:secure_url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideoSecureUrl = content + if internalData.ogVideoSecureUrl == "" { + internalData.ogVideoSecureUrl = content + } } matchers["meta/og:video:type"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideoType = content + if internalData.ogVideoType == "" { + internalData.ogVideoType = content + } } matchers["meta/og:video:width"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideoWidth = content + if internalData.ogVideoWidth == "" { + internalData.ogVideoWidth = content + } } matchers["meta/og:video:height"] = func(internalData *InternalData, content string, extra string) { - internalData.ogVideoHeight = content + if internalData.ogVideoHeight == "" { + internalData.ogVideoHeight = content + } } matchers["meta/og:image"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImage = content + if internalData.ogImage == "" { + internalData.ogImage = content + } } matchers["meta/og:image:url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImageUrl = content + if internalData.ogImageUrl == "" { + internalData.ogImageUrl = content + } } matchers["meta/og:image:secure_url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImageSecureUrl = content + if internalData.ogImageSecureUrl == "" { + internalData.ogImageSecureUrl = content + } } matchers["meta/og:image:type"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImageType = content + if internalData.ogImageType == "" { + internalData.ogImageType = content + } } matchers["meta/og:image:width"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImageWidth = content + if internalData.ogImageWidth == "" { + internalData.ogImageWidth = content + } } matchers["meta/og:image:height"] = func(internalData *InternalData, content string, extra string) { - internalData.ogImageHeight = content + if internalData.ogImageHeight == "" { + internalData.ogImageHeight = content + } } matchers["meta/og:audio"] = func(internalData *InternalData, content string, extra string) { - internalData.ogAudio = content + if internalData.ogAudio == "" { + internalData.ogAudio = content + } } matchers["meta/og:audio:url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogAudioUrl = content + if internalData.ogAudioUrl == "" { + internalData.ogAudioUrl = content + } } matchers["meta/og:audio:secure_url"] = func(internalData *InternalData, content string, extra string) { - internalData.ogAudioSecureUrl = content + if internalData.ogAudioSecureUrl == "" { + internalData.ogAudioSecureUrl = content + } } matchers["meta/og:audio:type"] = func(internalData *InternalData, content string, extra string) { - internalData.ogAudioType = content + if internalData.ogAudioType == "" { + internalData.ogAudioType = content + } } matchers["meta/og:site_name"] = func(internalData *InternalData, content string, extra string) { - internalData.ogSiteName = content + if internalData.ogSiteName == "" { + internalData.ogSiteName = content + } } matchers["meta/article:author"] = func(internalData *InternalData, content string, extra string) { - internalData.articleAuthor = content + if internalData.articleAuthor == "" { + internalData.articleAuthor = content + } } matchers["meta/article:publisher"] = func(internalData *InternalData, content string, extra string) { - internalData.articlePublisher = content + if internalData.articlePublisher == "" { + internalData.articlePublisher = content + } } matchers["meta/article:published_time"] = func(internalData *InternalData, content string, extra string) { - internalData.articlePublishedTime = content + if internalData.articlePublishedTime == "" { + internalData.articlePublishedTime = content + } } matchers["meta/soundcloud:user"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudUser = content + if internalData.soundcloudUser == "" { + internalData.soundcloudUser = content + } } matchers["meta/soundcloud:play_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudPlayCount = content + if internalData.soundcloudPlayCount == "" { + internalData.soundcloudPlayCount = content + } } matchers["meta/soundcloud:download_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudDownloadCount = content + if internalData.soundcloudDownloadCount == "" { + internalData.soundcloudDownloadCount = content + } } matchers["meta/soundcloud:comments_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudCommentsCount = content + if internalData.soundcloudCommentsCount == "" { + internalData.soundcloudCommentsCount = content + } } matchers["meta/soundcloud:like_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudLikeCount = content + if internalData.soundcloudLikeCount == "" { + internalData.soundcloudLikeCount = content + } } matchers["meta/soundcloud:sound_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudSoundCount = content + if internalData.soundcloudSoundCount == "" { + internalData.soundcloudSoundCount = content + } } matchers["meta/soundcloud:follower_count"] = func(internalData *InternalData, content string, extra string) { - internalData.soundcloudFollowerCount = content + if internalData.soundcloudFollowerCount == "" { + internalData.soundcloudFollowerCount = content + } } matchers["meta/title"] = func(internalData *InternalData, content string, extra string) { - internalData.metaTitle = content + if internalData.metaTitle == "" { + internalData.metaTitle = content + } } matchers["meta/description"] = func(internalData *InternalData, content string, extra string) { - internalData.metaDescription = content + if internalData.metaDescription == "" { + internalData.metaDescription = content + } } matchers["meta/author"] = func(internalData *InternalData, content string, extra string) { - internalData.metaAuthor = content + if internalData.metaAuthor == "" { + internalData.metaAuthor = content + } } matchers["meta/theme-color"] = func(internalData *InternalData, content string, extra string) { - internalData.metaThemeColor = content + if internalData.metaThemeColor == "" { + internalData.metaThemeColor = content + } } matchers["link/icon"] = func(internalData *InternalData, content string, extra string) { - internalData.linkFavicon = content + if internalData.linkFavicon == "" { + internalData.linkFavicon = content + } } matchers["link/author"] = func(internalData *InternalData, content string, extra string) { - internalData.linkAuthor = content + if internalData.linkAuthor == "" { + internalData.linkAuthor = content + } } matchers["link/alternate"] = func(internalData *InternalData, content string, extra string) { if extra == "application/json+oembed" { - internalData.oembedUrl = content + if internalData.oembedUrl == "" { + internalData.oembedUrl = content + } } } matchers["title"] = func(internalData *InternalData, content string, extra string) { - internalData.title = content + if internalData.title == "" { + internalData.title = content + } } providerMatchers := map[string]func(*InternalData, string, string){} providerMatchers["meta/og:site_name"] = func(internalData *InternalData, content string, extra string) { - internalData.urlProviderOgSiteName = content + if internalData.urlProviderOgSiteName == "" { + internalData.urlProviderOgSiteName = content + } } providerMatchers["meta/title"] = func(internalData *InternalData, content string, extra string) { - internalData.urlProviderMetaTitle = content + if internalData.urlProviderMetaTitle == "" { + internalData.urlProviderMetaTitle = content + } } providerMatchers["meta/theme-color"] = func(internalData *InternalData, content string, extra string) { - internalData.urlProviderMetaThemeColor = content + if internalData.urlProviderMetaThemeColor == "" { + internalData.urlProviderMetaThemeColor = content + } } providerMatchers["link/icon"] = func(internalData *InternalData, content string, extra string) { - internalData.urlProviderLinkFavicon = content + if internalData.urlProviderLinkFavicon == "" { + internalData.urlProviderLinkFavicon = content + } } providerMatchers["title"] = func(internalData *InternalData, content string, extra string) { - internalData.urlProviderTitle = content + if internalData.urlProviderTitle == "" { + internalData.urlProviderTitle = content + } } loadData := func(requestedUrl string) (Data, error) {