Skip to content

Commit 6f1f2eb

Browse files
authored
Merge pull request #13 from Priyansh-Kedia/og_tags_bug
added support for twitter links
2 parents f60537a + 94d6460 commit 6f1f2eb

7 files changed

Lines changed: 138 additions & 64 deletions

File tree

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.kedia.ogparser
2+
3+
import android.util.Log
4+
import kotlinx.coroutines.Dispatchers
5+
import kotlinx.coroutines.launch
6+
import org.jsoup.Jsoup
7+
8+
class JsoupNetworkCall {
9+
10+
private val REFERRER = "http://www.google.com"
11+
private val TIMEOUT = 100000
12+
private val DOC_SELECT_QUERY = "meta[property^=og:]"
13+
private val OPEN_GRAPH_KEY = "content"
14+
private val PROPERTY = "property"
15+
private val OG_IMAGE = "og:image"
16+
private val OG_DESCRIPTION = "og:description"
17+
private val OG_URL = "og:url"
18+
private val OG_TITLE = "og:title"
19+
private val OG_SITE_NAME = "og:site_name"
20+
private val OG_TYPE = "og:type"
21+
22+
private var openGraphResult: OpenGraphResult? = null
23+
24+
fun callUrl(url: String, agent: String): OpenGraphResult? {
25+
openGraphResult = OpenGraphResult()
26+
try {
27+
val response = Jsoup.connect(url)
28+
.ignoreContentType(true)
29+
.userAgent(agent)
30+
.referrer(REFERRER)
31+
.timeout(TIMEOUT)
32+
.followRedirects(true)
33+
.execute()
34+
35+
val doc = response.parse()
36+
val ogTags = doc.select(DOC_SELECT_QUERY)
37+
when {
38+
ogTags.size > 0 ->
39+
ogTags.forEachIndexed { index, _ ->
40+
val tag = ogTags[index]
41+
val text = tag.attr(PROPERTY)
42+
43+
when (text) {
44+
OG_IMAGE -> {
45+
openGraphResult!!.image = (tag.attr(OPEN_GRAPH_KEY))
46+
}
47+
OG_DESCRIPTION -> {
48+
openGraphResult!!.description = (tag.attr(OPEN_GRAPH_KEY))
49+
}
50+
OG_URL -> {
51+
openGraphResult!!.url = (tag.attr(OPEN_GRAPH_KEY))
52+
}
53+
OG_TITLE -> {
54+
openGraphResult!!.title = (tag.attr(OPEN_GRAPH_KEY))
55+
}
56+
OG_SITE_NAME -> {
57+
openGraphResult!!.siteName = (tag.attr(OPEN_GRAPH_KEY))
58+
}
59+
OG_TYPE -> {
60+
openGraphResult!!.type = (tag.attr(OPEN_GRAPH_KEY))
61+
}
62+
}
63+
}
64+
}
65+
} catch (e: Exception) {
66+
e.printStackTrace()
67+
return null
68+
}
69+
70+
return openGraphResult
71+
}
72+
}

OGParser/src/main/java/com/kedia/ogparser/OpenGraphParser.kt

Lines changed: 19 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
11
package com.kedia.ogparser
22

33
import android.content.Context
4+
import android.util.Log
45
import kotlinx.coroutines.*
5-
import org.jsoup.Jsoup
66
import kotlin.coroutines.CoroutineContext
77

88

99
class OpenGraphParser(
1010
private val listener: OpenGraphCallback,
1111
private var showNullOnEmpty: Boolean = false,
12-
private val context: Context? = null
12+
context: Context? = null
1313
) {
1414

1515
private val sharedPrefs: SharedPrefs? = context?.let { SharedPrefs(it) }
1616

1717
private var url: String = ""
1818

19-
private val AGENT = "Mozilla"
20-
private val REFERRER = "http://www.google.com"
21-
private val TIMEOUT = 10000
22-
private val DOC_SELECT_QUERY = "meta[property^=og:]"
23-
private val OPEN_GRAPH_KEY = "content"
24-
private val PROPERTY = "property"
25-
private val OG_IMAGE = "og:image"
26-
private val OG_DESCRIPTION = "og:description"
27-
private val OG_URL = "og:url"
28-
private val OG_TITLE = "og:title"
29-
private val OG_SITE_NAME = "og:site_name"
30-
private val OG_TYPE = "og:type"
19+
private val AGENTS = mutableListOf(
20+
"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
21+
"Mozilla",
22+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
23+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
24+
"WhatsApp/2.19.81 A",
25+
"facebookexternalhit/1.1",
26+
"facebookcatalog/1.0"
27+
)
28+
private val jsoupNetworkCall = JsoupNetworkCall()
3129

3230
private var openGraphResult: OpenGraphResult? = null
3331

@@ -58,56 +56,17 @@ class OpenGraphParser(
5856
if (sharedPrefs?.urlExists(url) == true) {
5957
return@withContext sharedPrefs?.getOpenGraphResult(url)
6058
}
61-
openGraphResult = OpenGraphResult()
62-
try {
63-
val response = Jsoup.connect(url)
64-
.ignoreContentType(true)
65-
.userAgent(AGENT)
66-
.referrer(REFERRER)
67-
.timeout(TIMEOUT)
68-
.followRedirects(true)
69-
.execute()
7059

71-
val doc = response.parse()
72-
73-
val ogTags = doc.select(DOC_SELECT_QUERY)
74-
when {
75-
ogTags.size > 0 ->
76-
ogTags.forEachIndexed { index, _ ->
77-
val tag = ogTags[index]
78-
val text = tag.attr(PROPERTY)
79-
80-
when (text) {
81-
OG_IMAGE -> {
82-
openGraphResult!!.image = (tag.attr(OPEN_GRAPH_KEY))
83-
}
84-
OG_DESCRIPTION -> {
85-
openGraphResult!!.description = (tag.attr(OPEN_GRAPH_KEY))
86-
}
87-
OG_URL -> {
88-
openGraphResult!!.url = (tag.attr(OPEN_GRAPH_KEY))
89-
}
90-
OG_TITLE -> {
91-
openGraphResult!!.title = (tag.attr(OPEN_GRAPH_KEY))
92-
}
93-
OG_SITE_NAME -> {
94-
openGraphResult!!.siteName = (tag.attr(OPEN_GRAPH_KEY))
95-
}
96-
OG_TYPE -> {
97-
openGraphResult!!.type = (tag.attr(OPEN_GRAPH_KEY))
98-
}
99-
}
100-
}
60+
AGENTS.forEach {
61+
openGraphResult = jsoupNetworkCall.callUrl(url, it)
62+
val isResultNull = checkNullParserResult(openGraphResult)
63+
if (!isResultNull) {
64+
openGraphResult?.let { sharedPrefs?.setOpenGraphResult(it, url) }
65+
return@withContext openGraphResult
10166
}
102-
} catch (e: Exception) {
103-
e.printStackTrace()
104-
launch(Dispatchers.Main) {
105-
listener.onError(e.localizedMessage)
106-
}
107-
return@withContext null
10867
}
10968

110-
if ((openGraphResult!!.title.isNullOrEmpty() || openGraphResult!!.title.equals("null")) && (openGraphResult!!.description.isNullOrEmpty() || openGraphResult!!.description.equals("null")) && showNullOnEmpty) {
69+
if (checkNullParserResult(openGraphResult) && showNullOnEmpty) {
11170
launch(Dispatchers.Main) {
11271
listener.onError("Null or empty response from the server")
11372
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.kedia.ogparser
2+
3+
fun checkNullParserResult(openGraphResult: OpenGraphResult?): Boolean {
4+
return (openGraphResult?.title.isNullOrEmpty() ||
5+
openGraphResult?.title.equals("null")) &&
6+
(openGraphResult?.description.isNullOrEmpty() ||
7+
openGraphResult?.description.equals(
8+
"null"
9+
))
10+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
# OpenGraphParser
33
[![](https://jitpack.io/v/Priyansh-Kedia/OpenGraphParser.svg)](https://jitpack.io/#Priyansh-Kedia/OpenGraphParser)
4+
<a href="https://devlibrary.withgoogle.com/products/android/repos/Priyansh-Kedia-OpenGraphParser"><img alt="Google" src="images/google-devlib.svg"/></a>
45
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
56
<a href="https://proandroiddev.com/how-to-create-a-preview-for-a-link-in-android-6906d0aa9e12"><img alt="License" src="https://github.com/Priyansh-Kedia/OpenGraphParser/blob/og_tags_bug/images/Story-Medium.svg?raw=True"/></a>
67

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,63 @@
11
package com.kedia.opengraphpreview
22

3-
import androidx.appcompat.app.AppCompatActivity
43
import android.os.Bundle
5-
import android.os.Looper
64
import android.util.Log
5+
import androidx.appcompat.app.AppCompatActivity
76
import com.kedia.ogparser.OpenGraphCallback
87
import com.kedia.ogparser.OpenGraphParser
98
import com.kedia.ogparser.OpenGraphResult
109
import kotlinx.android.synthetic.main.activity_main.*
1110

1211
class MainActivity : AppCompatActivity(), OpenGraphCallback {
12+
13+
private val openGraphParser by lazy { OpenGraphParser(this, showNullOnEmpty = true) }
14+
15+
private val LINKS_TO_TEST = mutableListOf(
16+
"https://www.linkedin.com/posts/madhusmita-padhy_machinelearning-datascience-activity-6886390508722163712-yhQ0",
17+
"https://www.youtube.com/watch?v=n3zsoX7bRlc",
18+
"https://twitter.com/levelsio/status/1481942293108359168",
19+
"https://stackoverflow.com/questions/44515769/conda-is-not-recognized-as-internal-or-external-command",
20+
"https://github.com/Priyansh-Kedia/OpenGraphParser",
21+
"https://chat.whatsapp.com/DdWAKRkt2VfAmd4OS47y7P",
22+
"https://www.reddit.com/r/MachineLearning/comments/s3mjqf/deep_learning_interviews_hundreds_of_fully_solved/?utm_medium=android_app&utm_source=share",
23+
"https://instagram.com/fcbarcelona?utm_medium=copy_link",
24+
"https://www.facebook.com/groups/777946865955982/permalink/1385110621906267/"
25+
)
26+
1327
override fun onCreate(savedInstanceState: Bundle?) {
1428
super.onCreate(savedInstanceState)
1529
setContentView(R.layout.activity_main)
1630

17-
val openGraphParser = OpenGraphParser(this, context = this)
18-
openGraphParser.parse("https://www.youtube.com")
31+
openGraphParser.parse(LINKS_TO_TEST.first())
32+
LINKS_TO_TEST.removeFirstOrNull()
33+
34+
// for (link in LINKS_TO_TEST) {
35+
// Handler().postDelayed({
36+
// openGraphParser.parse(link)
37+
// }, 2000)
38+
// Log.e("TAG!!!!", "called parse")
39+
// }
1940

2041
button.setOnClickListener {
2142
openGraphParser.parse(tview.text.toString())
2243
}
2344
}
2445

2546
override fun onPostResponse(openGraphResult: OpenGraphResult) {
47+
Log.e("TAG!!!!", "response $openGraphResult")
2648
tview.setText(openGraphResult.toString())
49+
if (LINKS_TO_TEST.isNotEmpty()) {
50+
openGraphParser.parse(LINKS_TO_TEST.first())
51+
LINKS_TO_TEST.removeFirstOrNull()
52+
}
2753
}
2854

2955
override fun onError(error: String) {
3056
Log.e("TAG!!!!", "$error")
3157
// tview.text = error
58+
if (LINKS_TO_TEST.isNotEmpty()) {
59+
openGraphParser.parse(LINKS_TO_TEST.first())
60+
LINKS_TO_TEST.removeFirstOrNull()
61+
}
3262
}
3363
}

images/Story-Medium.svg

Lines changed: 1 addition & 0 deletions
Loading

images/google-devlib.svg

Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)