forked from pknotfound/OpenGraphParser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOpenGraphParser.kt
More file actions
115 lines (94 loc) · 3.68 KB
/
OpenGraphParser.kt
File metadata and controls
115 lines (94 loc) · 3.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.kedia.ogparser
import kotlinx.coroutines.*
import kotlin.coroutines.CoroutineContext
class OpenGraphParser @JvmOverloads constructor(
private val listener: OpenGraphCallback,
private var showNullOnEmpty: Boolean = false,
private val cacheProvider: CacheProvider? = null,
timeout: Int? = null,
jsoupProxy: JsoupProxy? = null,
maxBodySize: Int? = null) {
private val jsoupNetworkCall = JsoupNetworkCall(
timeout, jsoupProxy, maxBodySize
)
private constructor(builder: Builder): this(
builder.listener,
builder.showNullOnEmpty,
builder.cacheProvider,
builder.timeout,
builder.jsoupProxy,
builder.maxBodySize
)
class Builder(
val listener: OpenGraphCallback
) {
var showNullOnEmpty: Boolean = false
private set
var cacheProvider: CacheProvider? = null
private set
var timeout: Int? = null
private set
var jsoupProxy: JsoupProxy? = null
private set
var maxBodySize: Int? = null
private set
// Setter methods for the vars
fun showNullOnEmpty(showNullOnEmpty: Boolean) = apply { this.showNullOnEmpty = showNullOnEmpty }
fun cacheProvider(cacheProvider: CacheProvider) = apply { this.cacheProvider = cacheProvider }
fun timeout(timeout: Int) = apply { this.timeout = timeout }
fun jsoupProxy(jsoupProxy: JsoupProxy) = apply { this.jsoupProxy = jsoupProxy }
fun maxBodySize(maxBodySize: Int) = apply { this.maxBodySize = maxBodySize }
fun build() = OpenGraphParser(this)
}
fun parse(url: String) {
ParseLink(url).parse()
}
inner class ParseLink(private val url: String) : CoroutineScope {
private val job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun parse() = launch {
val result = fetchContent(url)
result?.let {
listener.onPostResponse(it)
}
}
}
private suspend fun fetchContent(url: String) = withContext(Dispatchers.IO) {
var validatedUrl = url
if (!validatedUrl.contains("http")) {
validatedUrl = "http://$validatedUrl"
}
cacheProvider?.getOpenGraphResult(url)?.let {
return@withContext it
}
var openGraphResult: OpenGraphResult? = null
AGENTS.forEach {
openGraphResult = jsoupNetworkCall.callUrl(validatedUrl, it)
val isResultNull = checkNullParserResult(openGraphResult)
if (!isResultNull) {
openGraphResult?.let { cacheProvider?.setOpenGraphResult(it, url) }
return@withContext openGraphResult
}
}
if (checkNullParserResult(openGraphResult) && showNullOnEmpty) {
launch(Dispatchers.Main) {
listener.onError("Null or empty response from the server")
}
return@withContext null
}
openGraphResult?.let { cacheProvider?.setOpenGraphResult(it, url) }
return@withContext openGraphResult
}
companion object {
private val AGENTS = arrayOf(
"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)",
"Mozilla",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
"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",
"WhatsApp/2.19.81 A",
"facebookexternalhit/1.1",
"facebookcatalog/1.0"
)
}
}