From fd6f20da6a65f722c11ab46c2796710d9ebf473d Mon Sep 17 00:00:00 2001 From: Gurkengewuerz Date: Wed, 10 Oct 2018 23:58:01 +0200 Subject: [PATCH] added WebServer Wrapper Crawl more reddit metadata save data tp sqlite --- .gitignore | 2 + html/css/simple-grid.css | 198 ++ html/css/style.css | 1912 +++++++++++++++++ html/images/icons/android-chrome-192x192.png | Bin 0 -> 15557 bytes html/images/icons/android-chrome-512x512.png | Bin 0 -> 32107 bytes html/images/icons/apple-touch-icon.png | Bin 0 -> 11286 bytes html/images/icons/browserconfig.xml | 9 + html/images/icons/favicon-16x16.png | Bin 0 -> 1491 bytes html/images/icons/favicon-32x32.png | Bin 0 -> 2238 bytes html/images/icons/favicon.ico | Bin 0 -> 15086 bytes html/images/icons/mstile-150x150.png | Bin 0 -> 10221 bytes html/images/icons/safari-pinned-tab.svg | 32 + html/images/icons/site.webmanifest | 19 + html/images/top-big.jpg | Bin 0 -> 57064 bytes html/index.html | 289 +++ html/manifest.json | 20 + pom.xml | 10 + .../ripme/ripper/rippers/RedditRipper.java | 144 +- .../ripmewrapper/ImageCrawler.java | 71 + .../gurkengewuerz/ripmewrapper/Webserver.java | 72 + .../ripmewrapper/handler/APIHandler.java | 169 ++ .../ripmewrapper/handler/StaticHandler.java | 140 ++ 22 files changed, 3043 insertions(+), 44 deletions(-) create mode 100644 html/css/simple-grid.css create mode 100644 html/css/style.css create mode 100644 html/images/icons/android-chrome-192x192.png create mode 100644 html/images/icons/android-chrome-512x512.png create mode 100644 html/images/icons/apple-touch-icon.png create mode 100644 html/images/icons/browserconfig.xml create mode 100644 html/images/icons/favicon-16x16.png create mode 100644 html/images/icons/favicon-32x32.png create mode 100644 html/images/icons/favicon.ico create mode 100644 html/images/icons/mstile-150x150.png create mode 100644 html/images/icons/safari-pinned-tab.svg create mode 100644 html/images/icons/site.webmanifest create mode 100644 html/images/top-big.jpg create mode 100644 html/index.html create mode 100644 html/manifest.json create mode 100644 src/main/java/de/gurkengewuerz/ripmewrapper/ImageCrawler.java create mode 100644 src/main/java/de/gurkengewuerz/ripmewrapper/Webserver.java create mode 100644 src/main/java/de/gurkengewuerz/ripmewrapper/handler/APIHandler.java create mode 100644 src/main/java/de/gurkengewuerz/ripmewrapper/handler/StaticHandler.java diff --git a/.gitignore b/.gitignore index e7813bc7..c36c4a16 100644 --- a/.gitignore +++ b/.gitignore @@ -120,3 +120,5 @@ history.json .classpath *.txt bin/ + +reddit_meta.db \ No newline at end of file diff --git a/html/css/simple-grid.css b/html/css/simple-grid.css new file mode 100644 index 00000000..bd0931a6 --- /dev/null +++ b/html/css/simple-grid.css @@ -0,0 +1,198 @@ +/** +*** SIMPLE GRID +*** (C) ZACH COLE 2016 +**/ + +@import url(https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic); + +/* UNIVERSAL */ + +html, +body { + height: 100%; + width: 100%; + margin: 0; + padding: 0; + left: 0; + top: 0; + font-size: 100%; +} + +/* POSITIONING */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; + margin-left: auto; + margin-right: auto; +} + +.justify { + text-align: justify; +} + +/* ==== GRID SYSTEM ==== */ + +.container { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +.row { + position: relative; + width: 100%; +} + +.row [class^="col"] { + float: left; + margin: 0.5rem 2%; + min-height: 0.125rem; +} + +.col-1, +.col-2, +.col-3, +.col-4, +.col-5, +.col-6, +.col-7, +.col-8, +.col-9, +.col-10, +.col-11, +.col-12 { + width: 96%; +} + +.col-1-sm { + width: 4.33%; +} + +.col-2-sm { + width: 12.66%; +} + +.col-3-sm { + width: 21%; +} + +.col-4-sm { + width: 29.33%; +} + +.col-5-sm { + width: 37.66%; +} + +.col-6-sm { + width: 46%; +} + +.col-7-sm { + width: 54.33%; +} + +.col-8-sm { + width: 62.66%; +} + +.col-9-sm { + width: 71%; +} + +.col-10-sm { + width: 79.33%; +} + +.col-11-sm { + width: 87.66%; +} + +.col-12-sm { + width: 96%; +} + +.row::after { + content: ""; + display: table; + clear: both; +} + +.hidden-sm { + display: none; +} + +@media only screen and (min-width: 33.75em) { /* 540px */ + .container { + width: 80%; + } +} + +@media only screen and (min-width: 45em) { /* 720px */ + .col-1 { + width: 4.33%; + } + + .col-2 { + width: 12.66%; + } + + .col-3 { + width: 21%; + } + + .col-4 { + width: 29.33%; + } + + .col-5 { + width: 37.66%; + } + + .col-6 { + width: 46%; + } + + .col-7 { + width: 54.33%; + } + + .col-8 { + width: 62.66%; + } + + .col-9 { + width: 71%; + } + + .col-10 { + width: 79.33%; + } + + .col-11 { + width: 87.66%; + } + + .col-12 { + width: 96%; + } + + .hidden-sm { + display: block; + } +} + +@media only screen and (min-width: 60em) { /* 960px */ + .container { + width: 75%; + max-width: 60rem; + } +} diff --git a/html/css/style.css b/html/css/style.css new file mode 100644 index 00000000..a97bf5a3 --- /dev/null +++ b/html/css/style.css @@ -0,0 +1,1912 @@ +@import "https://fonts.googleapis.com/css?family=Raleway"; + +.category-container { + display: flex; + justify-content: center; + flex-wrap: wrap; + margin-bottom: 50px +} + +.category-row { + margin-left: 10px; + padding: 10px +} + +.category-small { + width: 40px +} + +.category-medium { + width: 150px +} + +.category-row > * { + padding: 10px; + font-size: 1.1em +} + +.category-row > .btn { + margin-right: 10px +} + +.category-row .delete-btn { + position: relative; + display: inline-block; + overflow: hidden; + opacity: .5 +} + +.category-row .delete-btn.active { + opacity: 1; + transition: 1s +} + +.category-row .static-value { + text-align: center; + color: red; + display: inline-block; + font-size: 1.5em; + width: 2em +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.25; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border: 1px solid transparent; + padding: .5rem 1rem; + font-size: 1rem; + border-radius: .25rem; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} + +.btn.active, .btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn-primary { + color: #fff; + background-color: #0275d8; + border-color: #0275d8 +} + +.btn-primary:hover { + color: #fff; + background-color: #025aa5; + border-color: #01549b +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de +} + +.btn-info.active { + color: #fff; + background-color: #31b0d5; + border-color: #269abc +} + +.btn-info.active:hover { + color: #fff; + background-color: #269abc; + border-color: #1b6d85 +} + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #2aabd2 +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c +} + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #419641 +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925 +} + +.list-page-container { + margin: auto; + color: #fff; + width: 100%; + height: 100%; + font-size: 1.7em +} + +.tree-container { + position: relative; + width: 90%; + font-size: 1em; + min-height: 3em +} + +.list-container .category-tree { + display: flex; + flex-wrap: wrap; + padding-top: 1em; + padding-bottom: 3em; + padding-left: 1em +} + +.tree-search-container { + display: flex; + justify-content: center; + padding-top: 1em; + padding-bottom: 1em +} + +.tree-search-middle { + width: 90% +} + +.tree-search { + padding: .7em; + box-sizing: border-box; + width: 100%; + display: inline-block +} + +.category-tree { + position: relative +} + +.category-tree > .list-category { + padding-top: 1em +} + +.category-tree > .list-category:first-child { + margin-top: 0 !important +} + +.list-category { + position: relative; + margin-top: -2.5em; + padding-top: .5em; + padding-left: 1em; + background-color: #1b252f +} + +.link-builder-container { + position: fixed; + display: flex; + align-items: center; + bottom: 0; + width: 100%; + z-index: 2; + background-color: #ff0592; + background-color: #1b252f +} + +.link-builder-filler { + position: relative; + margin-top: -2.5em; + height: 200px; + background-color: #1b252f +} + +.list-spinner { + position: relative; + margin-top: -2.5em; + height: 200px; + background-color: #1b252f +} + +.link-builder-close { + position: absolute; + display: flex; + right: 0; + top: 0; + bottom: 0; + font-weight: 700; + font-size: 1.1em; + justify-content: center; + align-items: center; + width: 5%; + min-width: 1.5em +} + +.link-builder-close-icon { + cursor: pointer; + width: 2em; + height: 2em; + line-height: 2em; + text-align: center +} + +.link-builder { + margin: auto; + width: 90%; + max-width: calc(100% - 3em); + padding-top: .5em; + padding-bottom: .5em +} + +.link-builder-icon { + height: 3em +} + +.link-builder-link { + display: flex; + align-items: center; + box-sizing: border-box; + background-color: #fff; + font-size: .8em; + line-height: 3em; + width: 100%; + color: #14171e +} + +.link-builder-link span { + overflow: hidden; + padding-left: .8em; + text-overflow: ellipsis; + width: 100% +} + +.link-builder-link:not(:first-child) { + margin-top: .8em +} + +.list-element-container { + position: relative +} + +.list-element-container.expanded { + padding-bottom: 3em !important +} + +.list-element-container.show-all { + padding-bottom: 2.5em !important +} + +.list-element-container:not(:empty) { + padding-top: .5em; + padding-bottom: .5em; + padding-left: 1em; + height: calc(100% - 100px); + overflow-y: hidden; + display: flex; + flex-wrap: wrap +} + +.list-show-more { + position: absolute; + bottom: 2.5em; + display: flex; + justify-content: center; + align-items: center; + font-size: 1em; + height: 1.5em; + left: 0; + right: 0; + width: 100% +} + +.list-element-container.expanded .list-show-more { + bottom: 1.5em +} + +.list-show-more-background { + position: absolute; + width: 100%; + height: 100%; + z-index: 0; + border-radius: .3rem; + background-color: #1b252f; + left: 0; + right: 0; + bottom: 0; + top: 0; + opacity: .8 +} + +.list-show-more-icon { + color: red; + color: #ea9215; + color: #ff0592; + cursor: pointer; + z-index: 1; + height: 1em +} + +.list-element { + min-width: 12em +} + +.list-checkbox { + font-size: 2em +} + +.list-header:hover .list-checkbox { + visibility: visible +} + +.list-element h3 { + display: inline-block; + font-size: .8em; + margin: 0; + margin-bottom: .5em; + margin-top: .5em; + font-weight: 400 +} + +.list-category h2 { + display: inline-block; + font-size: 1.1em; + margin: 0; + padding-bottom: .2em +} + +.list-header .fa { + padding-left: .5em; + padding-right: .5em +} + +.list-header .list-external-link { + margin-left: .3em; + margin-right: .5em +} + +.tree-checkbox { + cursor: pointer; + display: inline-block; + position: relative; + border-radius: .3rem; + margin-right: .7em; + height: 1em; + width: 1em; + background-color: #fff +} + +.tree-checkbox.checked > div { + border-bottom: 4px solid green; + border-right: 4px solid green; + transform: rotate(45deg); + height: 100%; + width: 50%; + position: absolute; + left: 10px; + bottom: 4px +} + +@media (min-width: 1280px) and (max-width: 1920px) { + .list-page-container { + font-size: 1.4em + } +} + +@media (max-width: 1280px) { + .list-page-container { + font-size: 1.3em + } +} + +.list-buttons { + display: flex; + justify-content: center +} + +.list-button { + cursor: pointer; + width: 2em; + text-align: center +} + +.list-button.active { + color: #ff0592 +} + +body { + background-color: #1b252f; + font-size: 14px; + font-family: Raleway, sans-serif; + width: 100%; + margin: 0 +} + +.center-bar { + position: absolute; + bottom: 0; + top: 0; + margin: auto; + color: #fff; + width: 100%; + height: 100%; + font-size: 5em +} + +.block { + padding: 6px; + display: inline-block +} + +.btn.large { + cursor: pointer; + padding: 1.3125rem 2.625rem; + font-size: 2.1875rem; + border-radius: .525rem +} + +.center-center { + height: 100%; + display: flex; + justify-content: center; + align-items: center +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #5bc0de +} + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #2aabd2 +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c +} + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #419641 +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925 +} + +@media (min-width: 1920px) { + .main-content { + padding: 0 5%; + max-width: 2000px + } + + .page-info-header { + padding: 0 5%; + max-width: 2000px + } + + .slideshow .info-bar { + font-size: 2em + } + + .slideshow .info-bar .right { + width: 100px !important + } + + .header { + font-size: 4em + } + + .slideshow .info-bar .middle { + width: calc(100% - 200px) + } + + .slideshow .info-bar .left { + width: 125px !important + } +} + +@media (min-width: 1280px) and (max-width: 1920px) { + .top img { + min-width: 2000px + } + + .top { + height: 300px !important + } + + .header { + font-size: 3.5em + } + + .main-content { + padding: 0 5% + } + + .page-info-header { + padding: 0 5% + } + + .grid .info-bar { + font-size: 1.5em !important + } + + .slideshow .info-bar { + font-size: 1.5em; + height: 80px !important + } + + div.arrow-bar.down { + height: 20px !important + } + + .info-bar .left { + font-size: 1.25em !important + } + + .external-link { + font-size: 1.1em !important + } + + .header h1 { + font-size: .9em !important + } +} + +@media (min-width: 800px) and (max-width: 1280px) { + .header h1 { + font-size: .8em !important + } + + .main-content { + padding: 0 5% + } + + .page-info-header { + padding: 0 5% + } + + .top img { + min-width: 1280px + } + + .top { + height: 200px !important + } + + .header { + font-size: 3em + } + + .grid .info-bar { + font-size: 1.4em !important + } + + .slideshow .info-bar { + font-size: 1.5em; + height: 70px !important + } + + div.arrow-bar.down { + height: 10px !important + } + + .info-bar .left { + font-size: 1.25em !important + } + + .external-link { + font-size: 1.1em !important + } +} + +@media (max-width: 799px) { + .top { + display: none + } + + .page-info-content { + padding: 4.5em 1em 1em 1em !important; + font-size: .5em !important + } + + .header { + visibility: hidden + } + + .error-bar { + font-size: 1.5em !important; + height: 100vh !important + } + + .grid .info-bar { + font-size: 1.3em !important + } + + .info-bar .left { + font-size: 1.25em !important + } + + .external-link { + font-size: 1.1em !important + } + + .center-bar { + font-size: 2em !important + } + + .center-bar .btn.large { + padding: .75rem 1.5rem; + font-size: 1.15rem; + border-radius: .3rem + } + + .center-bar .block { + padding: 4px + } + + .slideshow .info-bar { + font-size: 1.3em !important; + height: 55px !important + } + + video { + pointer-events: none + } + + div.arrow-bar { + visibility: hidden + } + + .media-element.grid:hover .media-overlay.gradient { + visibility: hidden !important + } + + .media-element.grid .border { + border-left: 0 !important; + border-right: 0 !important + } + + .stack { + width: 18px; + height: 13px + } + + .external-link a { + padding-left: 6px + } +} + +body { + -webkit-tap-highlight-color: transparent; + background-color: #1b252f; + font-size: 14px; + font-family: Raleway; + width: 100%; + margin: 0 +} + +body.slideshow { + height: 1px; + overflow-y: hidden +} + +.top { + height: 500px; + position: relative; + width: 100%; + overflow: hidden +} + +.hidden { + display: none !important +} + +.invisible { + visibility: hidden !important +} + +.top .image-wrapper { + position: absolute; + z-index: -1; + width: 100% +} + +.top img { + width: 100% +} + +.hide-top { + height: 100%; + width: 100%; + position: absolute; + background-color: #1b252f; + z-index: -1 +} + +.top-overlay { + height: 100%; + background: linear-gradient(to top, #1b252f 0, #1b252f 5%, rgba(24, 27, 30, 0) 100%); + text-align: center; + width: 100%; + display: table +} + +.header { + position: absolute; + color: #fff; + width: 100%; + height: 100% +} + +.header h1 { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 10px; + box-sizing: border-box; + line-height: 1.3em; + height: 100%; + width: 100%; + justify-content: center; + align-items: center; + font-size: 1em; + font-weight: 400 +} + +.header h1 a { + padding-left: .5em +} + +.header-single-item { + display: inline-block; + cursor: pointer; + margin-left: .3em; + margin-right: .3em +} + +div.media-element.grid .arrows { + display: none +} + +div.close-icon { + position: absolute; + font-size: 1.3em; + right: 0; + top: 10px; + width: 50px; + font-weight: 700; + text-align: center +} + +div.arrows { + z-index: 1; + position: absolute; + transition: opacity 1s; + webkit-transition: opacity 1s; + color: #fff; + left: 0; + height: 100%; + width: 100%; + font-size: 1.3em +} + +div.arrow-bar { + pointer-events: all; + z-index: 1; + position: absolute +} + +div.arrow-bar.right { + right: 0; + width: 50px; + height: 100% +} + +div.arrow-bar.left { + left: 0; + width: 50px; + height: 100% +} + +div.arrow-bar.up { + top: 0; + width: 100%; + height: 50px +} + +div.arrow-bar.down { + bottom: 0; + width: 100%; + height: 30px +} + +div.arrow { + position: absolute; + height: 30px; + width: 30px; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; + text-align: center +} + +.arrow-bar:hover i { + transform: scale(1.2) +} + +.screen-filler { + position: absolute; + z-index: -1; + width: 100%; + height: 105vh +} + +.media-element.slideshow .padded { + height: 200%; + width: 100%; + top: 0; + left: 0; + z-index: 2; + background-color: #000; + position: fixed +} + +.media-element img, .media-element video { + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + display: block; + width: 100% +} + +.media-element.slideshow .border { + height: 100vh; + width: 100vw; + position: relative +} + +.media-element.slideshow .overflow { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + width: 100% +} + +.fill-size { + height: 100%; + width: 100% +} + +.media-element.slideshow img, .media-element.slideshow video { + object-fit: contain; + z-index: -1; + width: 100%; + height: 100%; + max-height: 100% +} + +.main-content { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 1; + margin: auto; + width: 100% +} + +#media-container { + width: 100% +} + +.wrapper { + position: relative +} + +.media-element { + position: absolute; + vertical-align: top +} + +.media-element.grid .padded { + margin: auto +} + +.media-element.grid .border { + border: 1px solid #fff +} + +.media-element.grid .overflow { + display: flex; + align-items: center; + position: relative; + width: 100%; + overflow: hidden +} + +.media-element.loaded .overflow { + background-color: #000 +} + +.fill-width { + width: 100% +} + +.media-element .link { + margin-left: 60px +} + +.media-overlay { + visibility: hidden; + position: absolute; + pointer-events: none; + bottom: 0; + height: 100%; + width: 100% +} + +.media-element.grid:hover .media-overlay.gradient { + visibility: visible +} + +.media-element.grid .media-overlay.visible { + background: linear-gradient(to top, rgba(0, 0, 0, .13) 50%, rgba(0, 0, 0, 0) 100%); + height: 50px; + visibility: visible !important +} + +.media-element.grid .media-overlay.gradient { + background: linear-gradient(to top, rgba(27, 37, 47, .3) 5%, rgba(27, 37, 47, .1) 80%) +} + +.media-element.slideshow .media-overlay { + visibility: visible +} + +.disliked-image { + position: absolute; + height: 100%; + background-color: #1b252f; + width: 100%; + z-index: 0; + top: 0; + bottom: 0; + color: #fff; + display: flex; + height: 100%; + align-items: center; + justify-content: center; + font-size: 6em +} + +.disliked-image .i { + height: 100px; + width: 100px +} + +.play-video-icon { + position: absolute; + height: 100%; + top: 0; + bottom: 0; + font-size: 5em; + color: #fff; + width: 100% +} + +.play-video-icon i.fa-play { + padding: 10px +} + +.media-overlay .info .text a { + pointer-events: all +} + +.media-element:hover { + cursor: pointer +} + +.media-element.hide-controls .arrows { + opacity: 0 +} + +.spinner-container.bottom { + height: 400px; + position: relative +} + +.spinner-container.floating { + background-color: #1b252f; + height: 100vh; + width: 100%; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + position: fixed; + pointer-events: none; + opacity: 0; + transition: opacity .5s ease; + z-index: 2 +} + +.spinner-container.inline { + z-index: 2; + position: absolute; + top: 0; + left: 0; + right: 0; + pointer-events: none; + background-color: #1b252f; + height: 100%; + opacity: 0 +} + +.spinner-container.inline .spinner-top { + position: absolute; + top: calc(50vh - 6em); + left: 0; + right: 0 +} + +.spinner-container.slideshow { + background-color: #000 +} + +.spinner-container.on-top { + opacity: 1 +} + +.home-icon { + color: #fff; + font-size: 2.5em; + position: fixed; + left: 15px; + top: 15px; + z-index: 1; + cursor: pointer; + pointer-events: all +} + +.home-icon a { + padding: 5px +} + +.settings-position { + color: #fff; + font-size: 2.5em; + position: fixed; + right: 15px; + top: 15px; + z-index: 1; + pointer-events: all +} + +.settings-icon { + padding: 5px +} + +.info { + height: 100% +} + +.info-bar { + position: absolute; + color: #fff; + width: 100%; + height: 55px; + font-size: 1.7em +} + +.info-bar.info-bottom { + bottom: 0 +} + +.info-bar.info-top { + top: 0 +} + +.info-bar.immersive-info-bar { + display: none +} + +.error-bar { + color: #fff; + height: 300px; + font-size: 2em; + text-align: center +} + +.error-bar .subheader { + padding-top: 20px +} + +.error-bar .btn { + font-size: 1.1em +} + +.center-bar { + position: absolute; + bottom: 0; + top: 0; + margin: auto; + color: #fff; + width: 100%; + height: 100%; + font-size: 5em +} + +.block { + padding: 6px; + display: inline-block +} + +.btn.large { + cursor: pointer; + padding: 1.3125rem 2.625rem; + font-size: 2.1875rem; + border-radius: .525rem +} + +.btn-lg { + padding: .75rem 1.5rem; + font-size: 1.25rem; + border-radius: .3rem +} + +.slideshow .info-bar.info-bottom { + background: linear-gradient(to top, rgba(0, 0, 0, .13) 50%, rgba(0, 0, 0, 0) 100%); + height: 100px +} + +.slideshow .info-bar.info-top { + background: linear-gradient(to bottom, rgba(0, 0, 0, .2) 0, rgba(0, 0, 0, .2) 50%, rgba(0, 0, 0, 0) 100%); + height: 100px +} + +.info-bar .left { + position: absolute; + left: 0; + bottom: 0; + height: 100%; + pointer-events: all +} + +.grid .info-bar .left { + width: 75px +} + +.slideshow .info-bar .left { + width: 75px +} + +.info-bar .right { + position: absolute; + right: 0; + bottom: 0; + width: 60px; + height: 100%; + pointer-events: all +} + +.info-bar .middle { + position: absolute; + left: 0; + right: 0; + margin: auto; + bottom: 0; + height: 100%; + width: calc(100% - 150px); + pointer-events: all +} + +.center-center2 { + display: flex; + justify-content: center; + align-items: center +} + +.center-center { + height: 100%; + display: flex; + justify-content: center; + align-items: center +} + +.evenly-distribute { + height: 100%; + display: flex; + align-items: center +} + +.admin-search { + display: flex; + justify-content: center; + padding-top: 50px +} + +.admin-search .feed-element { + width: 90% +} + +.center-container { + margin: 100px +} + +.slideshow .heart { + z-index: 3 +} + +.grid .heart { + z-index: 0 !important +} + +.heart { + padding: 5px +} + +.heart.active { + color: red +} + +.media-element.slideshow .heart i { + z-index: 3 +} + +.media-element.slideshow .stack { + z-index: 3 +} + +.stack { + position: relative; + width: 17px; + height: 13px; + pointer-events: all +} + +.stack figure { + margin: auto +} + +.stack div { + border: 1px solid #fff; + height: 100%; + width: 100%; + position: absolute +} + +.stack .one { + transform: translate(20%, -20%) +} + +.stack .three { + transform: translate(-20%, 20%) +} + +.animated { + -webkit-animation-duration: 10s; + animation-duration: 10s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +@keyframes fadeIn { + 0% { + opacity: 0 + } + 100% { + opacity: 1 + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn +} + +.center-container { + max-width: 2000px; + width: 100% +} + +.admin-container .half { + display: inline-block; + width: 50% +} + +.admin-container .third { + display: inline-block; + width: 33% +} + +.admin-container .fourth { + display: inline-block; + width: 25% +} + +.admin-container .fifth { + display: inline-block; + width: 20% +} + +.inline { + display: inline-block +} + +.segment-dropdown { + display: flex +} + +.flex-rows { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-start +} + +.input-container { + box-sizing: border-box; + display: inline-block +} + +.feed-element { + width: 40%; + padding: 10px; + margin-left: 20px; + display: inline-block +} + +.input-with-padding { + padding: 10px; + margin-left: 20px +} + +.input-with-padding.highlight { + background-color: #8b8bf3 +} + +a { + color: #fff; + text-decoration: none +} + +.admin-container { + margin: auto; + color: #fff; + width: 100%; + height: 100%; + font-size: 1.6em +} + +.external-link { + position: absolute; + top: 3px; + bottom: 0; + margin: auto; + font-size: .8em +} + +.external-link a { + padding-left: 10px +} + +.settings-menu { + margin-top: 6px; + padding: 6px; + background-color: #1b252f; + box-shadow: 5px 5px 5px rgba(0, 0, 0, .3), -5px 5px 5px rgba(0, 0, 0, .3); + width: 240px; + position: absolute; + right: 15px; + font-size: 1.2rem +} + +.settings-checkbox { + display: inline-block; + float: right +} + +.settings-checkbox .tree-checkbox { + background-color: inherit +} + +.settings-checkbox .checked > div { + border-bottom: 4px solid red !important; + border-right: 4px solid red !important +} + +.settings-position i { + cursor: pointer +} + +.settings-menu .btn { + width: 100%; + margin-bottom: 10px; + text-align: left +} + +.settings-button { + cursor: pointer +} + +.settings-half { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + text-align: center; + display: inline-block; + width: 25% !important; + font-size: 1.1em; + padding-top: .3em; + padding-bottom: .4em; + transition: background-color .2s +} + +.settings-half:hover { + background-color: #881616 +} + +.settings-half.active { + background-color: red +} + +.settings-half.left { + margin-left: 25%; + border-radius: .3rem 0 0 .3rem +} + +.settings-half.right { + border-radius: 0 .3rem .3rem 0 +} + +.settings-item { + padding-top: .3em; + padding-left: .6em; + padding-bottom: 10px +} + +.reset-item { + padding-right: .6em +} + +.warning { + color: red +} + +.scroll-slider-container { + position: fixed; + width: calc(100vw - 150px); + max-width: 90vw; + height: 60px; + top: 40px; + left: 0; + right: 0; + z-index: 3; + opacity: 1; + margin: auto; + color: #fff; + transition: opacity 1s, visibility 1s +} + +.scroll-slider-hidden { + opacity: 0 +} + +.scroll-slider-background { + position: absolute; + z-index: -1; + height: 100%; + width: 100%; + background-color: #000; + background-color: #1b252f; + background-color: #1980e6; + background-color: #425a71; + background-color: #0d365d; + opacity: 1; + border-radius: .3rem +} + +.scroll-slider-icons { + vertical-align: top; + display: inline-block; + height: 100%; + width: 125px +} + +.scroll-slider-slider { + vertical-align: top; + display: inline-block; + width: calc(100% - 125px); + height: 100% +} + +.scroll-slider-element { + cursor: pointer; + background-color: #fff; + height: 50%; + width: 100%; + margin-left: 25px; + margin-right: 15px; + overflow: hidden; + border-radius: .3rem +} + +.scroll-slider-completed { + height: 100%; + background-color: #00f; + background-color: #1b252f; + background-color: red; + background-color: #ce1919 +} + +.scroll-slider-icons i { + cursor: pointer; + margin: 5px; + padding: 10px; + font-size: 1.8em +} + +.scroll-slider-icons i.close { + font-size: 2.3em +} + +.inline-block { + display: inline-block +} + +.block { + padding: 6px; + display: inline-block +} + +.center-center { + height: 100%; + display: flex; + justify-content: center; + align-items: center +} + +.btn { + cursor: pointer +} + +.btn-color-1 { + background-color: #9350d0 +} + +.btn-color-2 { + background-color: #f75f00 +} + +.btn-color-3 { + background-color: #3469ff +} + +.btn-color-4 { + background-color: #c70404 +} + +.btn-color-5 { + background-color: #74d136 +} + +.btn-color-6 { + background-color: #b33265 +} + +.btn-color-pink { + background-color: #ff0592 +} + +.btn-color-pink:hover { + background-color: #ef0087 +} + +.btn.not-active { + opacity: .5 +} + +.font-color-pink { + color: #ff0592 +} + +@keyframes spin-animation { + 0% { + transform: rotate(0) + } + 100% { + transform: rotate(359deg) + } +} + +.loading-spinner-container { + color: #fff; + font-size: 3em; + width: 3em; + left: 100px; + position: absolute +} + +.loading-spinner-circle { + animation: spin-animation 2s infinite linear; + border-radius: 50%; + border-left: .1em solid #fff; + border-right: .1em solid rgba(255, 255, 255, .5); + border-top: .1em solid rgba(255, 255, 255, .5); + border-bottom: .1em solid rgba(255, 255, 255, .5); + width: .7em; + height: .7em +} + +.page-info-header { + overflow: hidden; + transition: height 1s ease; + font-size: 2em; + color: #fff; + width: 100%; + margin: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.page-info-content { + padding-bottom: 2em; + padding-left: 2em; + padding-right: 2em; + font-size: .8em +} + +.page-info-content a { + color: red +} + +.page-info-content h2 { + font-size: 1em; + font-weight: 400; + display: inline +} + +.page-info-line { + margin-top: .2em +} + +.page-info-content p { + margin: 0 +} + +.page-info-header.visible { + height: 400px +} + +.grid { + display: grid; + grid-gap: 10px; + grid-auto-rows: 10px; + margin-left: 2em; + margin-right: 2em; +} + +@media only screen and (min-width: 1800px) { + .grid { + grid-template-columns: repeat(auto-fill, minmax(550px, 1fr)); + } +} + +@media only screen and (min-width: 1256px) and (max-width: 1799px){ + .grid { + grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); + } +} + +@media only screen and (min-width: 1100px) and (max-width: 1255px){ + .grid { + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + } +} + +@media only screen and (min-width: 800px) and (max-width: 1099px){ + .grid { + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + } +} + +@media only screen and (min-width: 0px) and (max-width: 799px){ + .grid { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + } +} + +.item { + background-color: #333333; + height: 100%; +} + +.item:hover { + cursor: pointer; +} + +.item img { + width: 100%; + object-fit: cover; + height: 100%; +} + +.item video { + -webkit-user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + display: block; + width: 100%; + height: 100%; + object-fit: unset; +} + +.h100 { + height: 100%; +} + +.footer { + color: white; + font-family: Raleway; + text-align: center; + font-weight: bold; + font-size: 1.1em; +} + +.footer-container { + margin-top: 5em; +} + +.load-bar { + position: relative; + margin-top: 20px; + width: 100%; + height: 6px; + background-color: #f2f2f2; +} + +.bar { + content: ""; + display: inline; + position: absolute; + width: 0; + height: 100%; + left: 50%; + text-align: center; +} + +.bar:nth-child(1) { + background-color: #1b252f; + animation: loading 3s linear infinite; +} + +.bar:nth-child(2) { + background-color: #f2f2f2; + animation: loading 3s linear 2s infinite; +} + +@keyframes loading { + from { + left: 50%; + width: 0; + z-index: 100; + } + 50% { + left: 0; + width: 100%; + z-index: 10; + } + to { + left: 0; + width: 100%; + } +} + +.clearfix::after { + content: ""; + clear: both; + display: table; +} + +.reddit-selected { + color: limegreen !important; + font-weight: bold; +} + +#checkme { + background: #1b252f; + width: 100%; + height: 2em; +} + +.overlay { + color: white; + position: absolute; + bottom: 8px; + left: 50%; + transform: translate(-50%, -50%); + font-size: 1.3em!important; + text-shadow: 5px 5px 11px rgba(150, 150, 150, 1); +} + +.content { + position: relative; +} + +.hoverme { + filter: brightness(85%); + -webkit-transition: -webkit-filter 100ms linear; +} + +.featherlight .featherlight-content { + padding: 5px 5px 0 !important; + border-bottom: 5px solid transparent !important; + overflow: hidden !important; +} + +.featherlight:last-of-type { + background: rgba(0,0,0,0.98) !important; +} + +@media only screen and (min-width: 800px) { + .featherlight .featherlight-content{ + height: 100%; + } + + .featherlight .featherlight-content img{ + height: 100% !important; + } + + .featherlight .featherlight-content video{ + height: 100% !important; + } +} diff --git a/html/images/icons/android-chrome-192x192.png b/html/images/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..d805cc47f2eb87166885c19e8e62defced8d042a GIT binary patch literal 15557 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 + + + + + #2b5797 + + + diff --git a/html/images/icons/favicon-16x16.png b/html/images/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a5019a3afddf3bc48a74824bc0c2dc007e90dd79 GIT binary patch literal 1491 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 B75)GK literal 0 HcmV?d00001 diff --git a/html/images/icons/favicon.ico b/html/images/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..21c20c0a4ec2a86e59d437368fb69787c2cab9f1 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/html/images/icons/mstile-150x150.png b/html/images/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..f815dd97dcbfc20b79f4b8e4d93867553d65939e GIT binary patch literal 10221 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 XOf&(9>auCT5THkzk6~5n4pILH+)bXW literal 0 HcmV?d00001 diff --git a/html/images/icons/safari-pinned-tab.svg b/html/images/icons/safari-pinned-tab.svg new file mode 100644 index 00000000..25cab55e --- /dev/null +++ b/html/images/icons/safari-pinned-tab.svg @@ -0,0 +1,32 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + diff --git a/html/images/icons/site.webmanifest b/html/images/icons/site.webmanifest new file mode 100644 index 00000000..b20abb7c --- /dev/null +++ b/html/images/icons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/html/images/top-big.jpg b/html/images/top-big.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eaef6d4c85d7a071694fe3ed6f2d80c28c2bc25b GIT binary patch literal 57064 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 QCF!b1UOIPObpHVV*$+tG{r~^~ literal 0 HcmV?d00001 diff --git a/html/index.html b/html/index.html new file mode 100644 index 00000000..5366799e --- /dev/null +++ b/html/index.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ImgScroll + + +

+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/html/manifest.json b/html/manifest.json new file mode 100644 index 00000000..5e65b41c --- /dev/null +++ b/html/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "ImgScroll", + "short_name": "ImgScroll", + "icons": [ + { + "src": "/images/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/images/icons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "start_url": "/", + "display": "standalone", + "background_color": "#2b5797", + "theme_color": "#2b5797" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index ab237191..2aa1d0c9 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,16 @@ httpmime 4.3.3 + + org.xerial + sqlite-jdbc + 3.25.2 + + + org.eclipse.jetty + jetty-server + 9.4.3.v20170317 + diff --git a/src/main/java/com/rarchives/ripme/ripper/rippers/RedditRipper.java b/src/main/java/com/rarchives/ripme/ripper/rippers/RedditRipper.java index 20d31d78..cf2abfac 100644 --- a/src/main/java/com/rarchives/ripme/ripper/rippers/RedditRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/rippers/RedditRipper.java @@ -1,35 +1,37 @@ package com.rarchives.ripme.ripper.rippers; +import com.rarchives.ripme.ripper.AlbumRipper; +import com.rarchives.ripme.ui.RipStatusMessage; +import com.rarchives.ripme.ui.UpdateUtils; +import com.rarchives.ripme.utils.Http; +import com.rarchives.ripme.utils.RipUtils; +import com.rarchives.ripme.utils.Utils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONTokener; + import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashSet; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.rarchives.ripme.ui.RipStatusMessage; -import org.json.JSONArray; -import org.json.JSONObject; -import org.json.JSONTokener; - -import com.rarchives.ripme.ripper.AlbumRipper; -import com.rarchives.ripme.ui.UpdateUtils; -import com.rarchives.ripme.utils.Http; -import com.rarchives.ripme.utils.RipUtils; -import com.rarchives.ripme.utils.Utils; -import org.jsoup.Jsoup; - -import javax.swing.text.Document; -import javax.swing.text.Element; - public class RedditRipper extends AlbumRipper { public RedditRipper(URL url) throws IOException { super(url); } - private static final String HOST = "reddit"; + private static final String HOST = "reddit"; private static final String DOMAIN = "reddit.com"; private static final String REDDIT_USER_AGENT = "RipMe:github.com/RipMeApp/ripme:" + UpdateUtils.getThisJarVersion() + " (by /u/metaprime and /u/ineedmorealts)"; @@ -40,6 +42,13 @@ public class RedditRipper extends AlbumRipper { private long lastRequestTime = 0; + private static Connection connection = null; + private Statement statement; + private PreparedStatement preparedStatement; + private HashSet knownIds = new HashSet<>(); + + private int downloadCount = 0; + private Boolean shouldAddURL() { return (alreadyDownloadedUrls >= Utils.getConfigInteger("history.end_rip_after_already_seen", 1000000000) && !isThisATest()); } @@ -69,21 +78,42 @@ public class RedditRipper extends AlbumRipper { @Override public void rip() throws IOException { URL jsonURL = getJsonURL(this.url); - while (true) { - if (shouldAddURL()) { - sendUpdate(RipStatusMessage.STATUS.DOWNLOAD_COMPLETE_HISTORY, "Already seen the last " + alreadyDownloadedUrls + " images ending rip"); - break; + + try { + // create a database connection + connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db"); + statement = connection.createStatement(); + statement.setQueryTimeout(30); // set timeout to 30 sec. + + ResultSet rs = statement.executeQuery("select id from metalist"); + while (rs.next()) { + knownIds.add(rs.getString("id")); } - jsonURL = getAndParseAndReturnNext(jsonURL); - if (jsonURL == null || isThisATest() || isStopped()) { - break; + + while (true) { + if (shouldAddURL()) { + sendUpdate(RipStatusMessage.STATUS.DOWNLOAD_COMPLETE_HISTORY, "Already seen the last " + alreadyDownloadedUrls + " images ending rip"); + break; + } + jsonURL = getAndParseAndReturnNext(jsonURL); + if (jsonURL == null || isThisATest() || isStopped() || downloadCount >= Utils.getConfigInteger("download.max_per_session", 50)) { + break; + } + } + waitForThreads(); + } catch (SQLException e) { + LOGGER.warn("[!] Reddit Meta Database error", e); + } finally { + try { + if (connection != null) + connection.close(); + } catch (SQLException e) { + LOGGER.warn("[!] Reddit Meta Database error", e); } } - waitForThreads(); } - private URL getAndParseAndReturnNext(URL url) throws IOException { JSONArray jsonArray = getJsonArrayFromURL(url), children; JSONObject json, data; @@ -105,8 +135,7 @@ public class RedditRipper extends AlbumRipper { String nextURLString = Utils.stripURLParameter(url.toExternalForm(), "after"); if (nextURLString.contains("?")) { nextURLString = nextURLString.concat("&after=" + data.getString("after")); - } - else { + } else { nextURLString = nextURLString.concat("?after=" + data.getString("after")); } nextURL = new URL(nextURLString); @@ -136,10 +165,10 @@ public class RedditRipper extends AlbumRipper { lastRequestTime = System.currentTimeMillis(); String jsonString = Http.url(url) - .ignoreContentType() - .userAgent(REDDIT_USER_AGENT) - .response() - .body(); + .ignoreContentType() + .userAgent(REDDIT_USER_AGENT) + .response() + .body(); Object jsonObj = new JSONTokener(jsonString).nextValue(); JSONArray jsonArray = new JSONArray(); @@ -158,21 +187,20 @@ public class RedditRipper extends AlbumRipper { JSONObject data = child.getJSONObject("data"); if (kind.equals("t1")) { // Comment - handleBody(data.getString("body"), data.getString("id"), ""); - } - else if (kind.equals("t3")) { + handleBody(data.getString("body"), data.getString("id"), "", data.getInt("created"), data.getInt("ups"), data.getString("subreddit")); + } else if (kind.equals("t3")) { // post if (data.getBoolean("is_self")) { // TODO Parse self text - handleBody(data.getString("selftext"), data.getString("id"), data.getString("title")); + handleBody(data.getString("selftext"), data.getString("id"), data.getString("title"), data.getInt("created"), data.getInt("ups"), data.getString("subreddit")); } else { // Get link - handleURL(data.getString("url"), data.getString("id"), data.getString("title")); + handleURL(data.getString("url"), data.getString("id"), data.getString("title"), data.getInt("created"), data.getInt("ups"), data.getString("subreddit")); } if (data.has("replies") && data.get("replies") instanceof JSONObject) { JSONArray replies = data.getJSONObject("replies") - .getJSONObject("data") - .getJSONArray("children"); + .getJSONObject("data") + .getJSONArray("children"); for (int i = 0; i < replies.length(); i++) { parseJsonChild(replies.getJSONObject(i)); } @@ -180,7 +208,7 @@ public class RedditRipper extends AlbumRipper { } } - private void handleBody(String body, String id, String title) { + private void handleBody(String body, String id, String title, int created, int ups, String sub) { Pattern p = RipUtils.getURLRegex(); Matcher m = p.matcher(body); while (m.find()) { @@ -188,7 +216,7 @@ public class RedditRipper extends AlbumRipper { while (url.endsWith(")")) { url = url.substring(0, url.length() - 1); } - handleURL(url, id, title); + handleURL(url, id, title, created, ups, sub); } } @@ -218,13 +246,28 @@ public class RedditRipper extends AlbumRipper { } - private void handleURL(String theUrl, String id, String title) { + private void handleURL(String theUrl, String id, String title, int created, int ups, String sub) { URL originalURL; try { originalURL = new URL(theUrl); } catch (MalformedURLException e) { return; } + + if (ups < Utils.getConfigInteger("reddit.min_ups", 100)) { + LOGGER.info("[i] Skipping " + id + " not reached minimum upvotes: " + ups + "/" + Utils.getConfigInteger("reddit.min_ups", 100)); + return; + } + + downloadCount++; + + if (knownIds.contains(id)) { + LOGGER.info("[i] Skipping ID " + id); + return; + } + + knownIds.add(id); + String subdirectory = ""; if (Utils.getConfigBoolean("reddit.use_sub_dirs", true)) { if (Utils.getConfigBoolean("album_titles.save", true)) { @@ -250,9 +293,8 @@ public class RedditRipper extends AlbumRipper { String savePath = this.workingDir + File.separator; savePath += id + "-" + url.split("/")[3] + title + ".mp4"; addURLToDownload(parseRedditVideoMPD(urls.get(0).toExternalForm()), new File(savePath)); - } - else { - addURLToDownload(urls.get(0), id + title, "", theUrl, null); + } else { + addURLToDownload(urls.get(0), id + "-" + title, "", theUrl, null); } } else if (urls.size() > 1) { for (int i = 0; i < urls.size(); i++) { @@ -263,6 +305,20 @@ public class RedditRipper extends AlbumRipper { addURLToDownload(urls.get(i), prefix, subdirectory, theUrl, null); } } + + try { + preparedStatement = connection.prepareStatement("INSERT INTO metalist values (?, ?, ?, ?, ?)"); + + preparedStatement.setString(1, id); + preparedStatement.setString(2, sub); + preparedStatement.setInt(3, created); + preparedStatement.setString(4, title); + preparedStatement.setString(5, "file"); + + preparedStatement.executeUpdate(); + } catch (SQLException e) { + LOGGER.warn("[!] FAILED TO INSERT META DATA", e); + } } @Override diff --git a/src/main/java/de/gurkengewuerz/ripmewrapper/ImageCrawler.java b/src/main/java/de/gurkengewuerz/ripmewrapper/ImageCrawler.java new file mode 100644 index 00000000..4f027794 --- /dev/null +++ b/src/main/java/de/gurkengewuerz/ripmewrapper/ImageCrawler.java @@ -0,0 +1,71 @@ +package de.gurkengewuerz.ripmewrapper; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashSet; +import java.util.List; +import java.util.TimerTask; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +/** + * Created by gurkengewuerz.de on 09.10.2018. + */ +public class ImageCrawler extends TimerTask { + + @Override + public void run() { + Webserver.CRAWLER_IS_RUNNING = true; + Logger.getLogger(ImageCrawler.class.getName()).log(Level.INFO, ("Run Timer")); + try { + Connection connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db"); + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); // set timeout to 30 sec. + + HashSet findIds = new HashSet<>(); + ResultSet rs = statement.executeQuery("SELECT metalist.id FROM metalist LEFT JOIN filelist ON metalist.id = filelist.id WHERE filelist.path IS NULL"); + while (rs.next()) { + findIds.add(rs.getString("id")); + } + + + List pathList = Files.find(Paths.get(System.getProperty("user.dir")), 100, + (path, basicFileAttributes) -> { + File file = path.toFile(); + return !file.isDirectory(); + }).map(String::valueOf) + .collect(Collectors.toList()); + + PreparedStatement ps = connection.prepareStatement("INSERT INTO filelist VALUES (NULL, ?, ?)"); + for (String s : pathList) { + String id = s.substring(s.lastIndexOf(File.separator) + 1).split("-")[0]; + if (!findIds.contains(id)) continue; + ps.setString(1, id); + ps.setString(2, s); + ps.executeUpdate(); + findIds.remove(id); + } + ps.close(); + + ps = connection.prepareStatement("DELETE FROM metalist WHERE id = ?"); + for (String id : findIds) { + ps.setString(1, id); + ps.executeUpdate(); + } + ps.close(); + + connection.close(); + } catch (Exception e) { + Logger.getLogger(ImageCrawler.class.getName()).log(Level.SEVERE, null, e); + } finally { + Webserver.CRAWLER_IS_RUNNING = false; + } + } +} diff --git a/src/main/java/de/gurkengewuerz/ripmewrapper/Webserver.java b/src/main/java/de/gurkengewuerz/ripmewrapper/Webserver.java new file mode 100644 index 00000000..5951fcdd --- /dev/null +++ b/src/main/java/de/gurkengewuerz/ripmewrapper/Webserver.java @@ -0,0 +1,72 @@ +package de.gurkengewuerz.ripmewrapper; + +import de.gurkengewuerz.ripmewrapper.handler.APIHandler; +import de.gurkengewuerz.ripmewrapper.handler.StaticHandler; +import org.eclipse.jetty.server.ConnectionFactory; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.session.SessionHandler; + +import java.io.File; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.Statement; +import java.util.Timer; + +/** + * Created by gurkengewuerz.de on 09.10.2018. + */ +public class Webserver { + + public static boolean CRAWLER_IS_RUNNING = false; + + public static void main(String... args) throws Exception { + Connection connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db"); + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); // set timeout to 30 sec. + + statement.executeUpdate("CREATE TABLE IF NOT EXISTS metalist (id string, subreddit string, created integer, title string, file string)"); + statement.executeUpdate("CREATE TABLE IF NOT EXISTS filelist (iid INTEGER PRIMARY KEY AUTOINCREMENT, id string, path string)"); + connection.close(); + + + Server server = new Server(3030); + + for (Connector y : server.getConnectors()) { + for (ConnectionFactory x : y.getConnectionFactories()) { + if (x instanceof HttpConnectionFactory) { + ((HttpConnectionFactory) x).getHttpConfiguration().setSendServerVersion(false); + } + } + } + + ContextHandler context_root = new ContextHandler("/"); + context_root.setContextPath("/"); + context_root.setHandler(new StaticHandler()); + + ContextHandler context_api = new ContextHandler("/api"); + context_api.setContextPath("/api"); + SessionHandler s = new SessionHandler(); + s.setHandler(new APIHandler()); + context_api.setHandler(s); + + ContextHandlerCollection contexts = new ContextHandlerCollection(); + contexts.setHandlers(new Handler[]{context_root, context_api}); + server.setHandler(contexts); + + Timer timer = new Timer(); + timer.schedule(new ImageCrawler(), 0, 5 * 60 * 1000); + + server.start(); + server.dumpStdErr(); + server.join(); + } + + public static File getStaticdir() { + return new File(System.getProperty("user.dir") + File.separator + "html" + File.separator); + } +} diff --git a/src/main/java/de/gurkengewuerz/ripmewrapper/handler/APIHandler.java b/src/main/java/de/gurkengewuerz/ripmewrapper/handler/APIHandler.java new file mode 100644 index 00000000..f0a548b9 --- /dev/null +++ b/src/main/java/de/gurkengewuerz/ripmewrapper/handler/APIHandler.java @@ -0,0 +1,169 @@ +package de.gurkengewuerz.ripmewrapper.handler; + +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.json.JSONArray; +import org.json.JSONObject; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Created by gurkengewuerz.de on 09.10.2018. + */ +public class APIHandler extends AbstractHandler { + + @Override + public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { + try { + Connection connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db"); + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); // set timeout to 30 sec. + + + JSONObject returnObject = null; + JSONArray returnArray = null; + + request.setCharacterEncoding("UTF-8"); + httpServletResponse.setCharacterEncoding("UTF-8"); + + if (s.equals("/get")) { + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + returnArray = new JSONArray(); + + if (request.getParameter("subreddits") != null) { + String[] subreddits = request.getParameter("subreddits").split(","); + + int created = request.getParameter("offset") == null ? Integer.MAX_VALUE : Integer.valueOf(request.getParameter("offset")); + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < subreddits.length; i++) { + builder.append("?,"); + } + + + PreparedStatement ps = connection.prepareStatement( + "SELECT iid, metalist.id, subreddit, created, path FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builder.deleteCharAt(builder.length() - 1).toString() + ") AND created < ? ORDER BY created DESC LIMIT 10" + ); + + int index = 1; + for (String o : subreddits) { + ps.setString(index++, o); + } + + ps.setInt(index, created); + + + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + JSONObject data = new JSONObject(); + data.put("iid", rs.getInt("iid")); + data.put("id", rs.getString("id")); + data.put("subreddit", rs.getString("subreddit")); + data.put("created", rs.getInt("created")); + data.put("webm", rs.getString("path").endsWith(".webm")); + data.put("mp4", rs.getString("path").endsWith(".mp4")); + returnArray.put(data); + } + rs.close(); + } + } else if (s.equals("/img")) { + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + + PreparedStatement ps = connection.prepareStatement("SELECT path FROM filelist WHERE iid = ? AND id = ?"); + + ps.setString(1, request.getParameter("iid")); + ps.setString(2, request.getParameter("id")); + + ResultSet rs = ps.executeQuery(); + + + if (rs.next()) { + String path = rs.getString("path"); + + + byte[] encoded = Files.readAllBytes(Paths.get(path)); + httpServletResponse.setContentType(Files.probeContentType(Paths.get(path)));// or png or gif, etc + httpServletResponse.setContentLength(encoded.length); + httpServletResponse.getOutputStream().write(encoded); + } + + request.setHandled(true); + return; + } else if (s.equals("/info")) { + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + returnObject = new JSONObject(); + + ResultSet rs = statement.executeQuery("SELECT DISTINCT subreddit FROM metalist;"); + JSONArray ja = new JSONArray(); + while (rs.next()) { + ja.put(rs.getString("subreddit")); + } + returnObject.put("subreddits", ja); + returnObject.put("subreddits_count", ja.length()); + + rs = statement.executeQuery("SELECT COUNT(*) c_all FROM filelist;"); + if (rs.next()) { + returnObject.put("files", rs.getInt("c_all")); + } + + + if (request.getParameter("subreddits") != null) { + String[] subreddits = request.getParameter("subreddits").split(","); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < subreddits.length; i++) { + builder.append("?,"); + } + + PreparedStatement ps = connection.prepareStatement( + "SELECT COUNT(*) c FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builder.deleteCharAt(builder.length() - 1).toString() + ")" + ); + + int index = 1; + for (String o : subreddits) { + ps.setString(index++, o); + } + + rs = ps.executeQuery(); + if (rs.next()) { + returnObject.put("files_subreddits", rs.getInt("c")); + } + } + } else { + httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); + } + + httpServletResponse.setContentType("application/json; charset=utf-8"); + + PrintWriter out = httpServletResponse.getWriter(); + if (returnObject != null) { + out.write(returnObject.toString()); + } else if (returnArray != null) { + out.write(returnArray.toString()); + } else { + returnObject = new JSONObject(); + returnObject.put("error", "not found"); + out.write(returnObject.toString()); + } + + request.setHandled(true); + + connection.close(); + } catch (SQLException e) { + Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e); + } + } + +} diff --git a/src/main/java/de/gurkengewuerz/ripmewrapper/handler/StaticHandler.java b/src/main/java/de/gurkengewuerz/ripmewrapper/handler/StaticHandler.java new file mode 100644 index 00000000..65b358de --- /dev/null +++ b/src/main/java/de/gurkengewuerz/ripmewrapper/handler/StaticHandler.java @@ -0,0 +1,140 @@ +package de.gurkengewuerz.ripmewrapper.handler; + +import de.gurkengewuerz.ripmewrapper.Webserver; +import org.apache.commons.io.FilenameUtils; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by gurkengewuerz.de on 09.10.2018. + */ +public class StaticHandler extends AbstractHandler { + + private String get403() throws IOException { + File f = new File(Webserver.getStaticdir(), "403.html"); + if (f.exists() && f.canRead()) return getFile(f, false); + return "

403 Forbidden


403 forbidden"; + } + + private String get404() throws IOException { + File f = new File(Webserver.getStaticdir(), "404.html"); + if (f.exists() && f.canRead()) return getFile(f, false); + return "

404 Not Found


404 not found"; + } + + private byte[] getBytes(File f) throws IOException { + return Files.readAllBytes(f.toPath()); + } + + private String getContent(File f) throws IOException { + return new String(getBytes(f), "utf-8"); + } + + private String getFile(File f, boolean get) throws IOException { + String data = getContent(f); + if (get) { + if (data.startsWith("")) { + return get403(); + } + } + data = data.replace("", ""); + + Pattern pattern = Pattern.compile(""); + Matcher matcher = pattern.matcher(data); + List matches = new ArrayList<>(); + while (matcher.find()) { + matches.add(matcher.group()); + } + for (String match : matches) { + Pattern pPattern = Pattern.compile("
+ +
+
+
+
+ +
+
+

ImgScroll

+
+
+
+
+
+
+
+ files: + +
+
+ subreddits: + +
+
+
+
+
+
+