├── .gitignore
├── README.md
├── pom.xml
└── src
└── main
├── java
└── org
│ └── tinymediamanager
│ └── scraper
│ └── tpdb
│ ├── Const.java
│ ├── TpdbAddonProvider.java
│ ├── TpdbApi.java
│ ├── TpdbMetadataProvider.java
│ ├── TpdbMovieArtworkProvider.java
│ ├── TpdbMovieMetadataProvider.java
│ ├── TpdbMovieTrailerProvider.java
│ ├── entities
│ ├── DirectorEntity.java
│ ├── ImageEntity.java
│ ├── PerformerEntity.java
│ ├── PerformerExtrasEntity.java
│ ├── SceneEntity.java
│ ├── SceneGet.java
│ ├── SceneSearch.java
│ ├── SiteEntity.java
│ ├── SiteGet.java
│ └── TagEnity.java
│ └── service
│ ├── Controller.java
│ └── TpdbService.java
└── resources
├── META-INF
└── services
│ └── org.tinymediamanager.scraper.spi.IAddonProvider
└── org
└── tinymediamanager
└── scraper
└── tpdb
└── logo.png
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 |
3 | # Mobile Tools for Java (J2ME)
4 | .mtj.tmp/
5 |
6 | # Package Files #
7 | *.war
8 | *.ear
9 |
10 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
11 | hs_err_pid*
12 | javacore*
13 | jitdump*
14 | Snap*
15 |
16 | #Maven
17 | target
18 | release.properties
19 | pom.xml.*
20 |
21 | #IntelliJ IDEA
22 | .idea/
23 | *.iml
24 |
25 | #Eclipse
26 | /bin
27 |
28 | #Vim
29 | *.swp
30 |
31 | .PVS-Studio
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TinyMediaManager-Plugin
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Tiny Media Manager Metadata Plug-In
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | Table of Contents
21 |
22 | -
23 | About The Project
24 |
25 | -
26 | Getting Started
27 |
31 |
32 | - Usage
33 | - Roadmap
34 | - Contributing
35 | - Contact
36 | - Acknowledgements
37 |
38 |
39 |
40 |
41 |
42 |
43 | ## About The Project
44 | ### Key Features
45 | - TMM Add-on to pull metadata from the TPDB API
46 | > (when available in the Database)
47 |
48 |
49 |
50 |
51 | ## Getting Started
52 |
53 |
54 |
55 | ### Prerequisites
56 | - You must HAVE tiny Media manager Installed. It can be obtained [here](https://www.tinymediamanager.org/)
57 | - You need to have a basic understanding of how to download from git and move files around your OS.
58 | - You should have obtained an API Token from [ThePornDB](https://theporndb.net/)
59 |
60 | ### Installation
61 | - Windows: Download the TPDB Add-on file (one file with a jar extension.) It can be found [here](https://github.com/ThePornDatabase/TinyMediaManager-Plugin/releases)
62 | - Place the jar file in the following folder can be found at: ``` C:\Users\yourusername\AppData\Local\Programs\tinyMediaManager\Addons ```
63 | - Please note: If the addon folder does not exist, you must create it. This is not the same addon folder that the ffmpeg files are in.
64 |
65 | - Mac: Download as described in the Windows OS instructions above.
66 | - Place the jar file in the following folder can be found at: ``` /Applications/tinyMediaManager.app/Contents/Resources/Java/Addons ```
67 | - Please note: If the addon folder does not exist, you must create it.
68 |
69 | Other Operating Systems supported by TMM have not yet been tested. Please provide feedback if you have used this Add-on with another OS.
70 |
71 |
72 |
73 |
74 | ## Usage
75 | Go to settings, movies, scrapers, and select the checkbox next to the TPDB logo. Uncheck any other scrapers. Paste your API key in the Scraper Options: API Key textbox. Make sure you set the NFO format for your media player under movies, NFO settings. Make any other changes to settings as desired and exit settings.
76 | - Add the folders that contain your associated adult media as a data source and update sources.
77 | - Select a video from the list of files in the listbox
78 | - Right click the video and select search and scrape
79 | - A dialogue box will pop up showing you the search results. You can modify the search parameters until you get the desired results.
80 | - Selecting OK will commit the results and write your NFO file/save a local poster
81 |
82 | > For a successful match to your Scenes, filenames should be in the format best recognized by the API. See the namer tool that is also part of this project.
83 | > Movies are not currently supported using this Addon with the API. Please see our other tools [here](https://theporndb.net/tools)
84 |
85 |
86 |
87 | ## Roadmap
88 |
89 | Check back later
90 |
91 |
92 |
93 | ## Contributing
94 | - Join the [Discord](https://theporndb.net/discord) server and collaborate
95 | - [Donate](https://theporndb.net/donate) to the project
96 |
97 |
98 | ## Contact
99 | Contact us on [Discord](https://theporndb.net/discord)
100 |
101 |
102 |
103 |
104 | ## Acknowledgements
105 | Thanks to DirtyRacer for creating this.
106 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | org.tinymediamanager
8 | scraper-addon-tpdb
9 | 2.1.2
10 |
11 |
12 |
13 | gitlab-maven
14 | https://gitlab.com/api/v4/projects/9945251/packages/maven
15 |
16 |
17 |
18 |
19 | 17
20 | 17
21 |
22 |
23 |
24 |
25 | org.tinymediamanager
26 | tinyMediaManager
27 | 5.1.5
28 | provided
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/Const.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | public class Const {
4 | public static final String BaseURL = "https://theporndb.net";
5 | public static final String APIBaseURL = "https://api.theporndb.net";
6 | public static final String PerformerURL = BaseURL + "/performers/";
7 | public static final String PerformerSiteURL = BaseURL + "/performers-site/";
8 | public static final String UserAgent = "tmm";
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbAddonProvider.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.tinymediamanager.scraper.interfaces.IMediaProvider;
4 | import org.tinymediamanager.scraper.spi.IAddonProvider;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | public class TpdbAddonProvider implements IAddonProvider {
10 |
11 | @Override
12 | public List> getAddonClasses() {
13 | List> addons = new ArrayList<>();
14 |
15 | addons.add(TpdbMovieMetadataProvider.class);
16 | addons.add(TpdbMovieArtworkProvider.class);
17 | addons.add(TpdbMovieTrailerProvider.class);
18 |
19 | return addons;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbApi.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.tinymediamanager.core.entities.Person;
6 | import org.tinymediamanager.scraper.MediaMetadata;
7 | import org.tinymediamanager.scraper.entities.MediaCertification;
8 | import org.tinymediamanager.scraper.exceptions.NothingFoundException;
9 | import org.tinymediamanager.scraper.exceptions.ScrapeException;
10 | import org.tinymediamanager.scraper.tpdb.entities.*;
11 | import org.tinymediamanager.scraper.tpdb.service.Controller;
12 |
13 | import java.text.SimpleDateFormat;
14 | import java.util.*;
15 | import java.util.stream.Collectors;
16 |
17 | public class TpdbApi {
18 | private static final Logger LOGGER = LoggerFactory.getLogger(TpdbApi.class);
19 | private final Controller controller;
20 |
21 | public enum SceneType {
22 | SCENE,
23 | MOVIE,
24 | JAV,
25 | }
26 |
27 | public TpdbApi(String apiKey) {
28 | this.controller = new Controller(false);
29 | controller.setApiKey(apiKey);
30 | }
31 |
32 | private String getId() {
33 | return "tpdb";
34 | }
35 |
36 | public MediaMetadata setMediaMetadata(SceneEntity scene) {
37 | MediaMetadata result = new MediaMetadata(getId());
38 |
39 | if (scene == null) {
40 | return result;
41 | }
42 |
43 | result.setId(getId(), scene.id);
44 | result.setCertifications(getCertifications());
45 | result.setTitle(scene.title);
46 | result.setPlot(scene.description);
47 |
48 | try {
49 | result.setProductionCompanies(getProductionCompanies(scene.site));
50 | } catch (Exception e) {
51 | LOGGER.error("error site: {}", e.getMessage());
52 | }
53 |
54 | result.setReleaseDate(getDate(scene.date));
55 | result.setYear(getYear(result.getReleaseDate()));
56 |
57 | result.setCastMembers(getCastMembers(scene.performers, scene.directors));
58 | result.setTags(scene.tags.stream().map(o -> o.name).sorted().collect(Collectors.toList()));
59 |
60 | return result;
61 | }
62 |
63 | public SceneType getType(String type) {
64 | return switch (type) {
65 | case "Scene" -> SceneType.SCENE;
66 | case "Movie" -> SceneType.MOVIE;
67 | case "JAV" -> SceneType.JAV;
68 | default -> null;
69 | };
70 |
71 | }
72 |
73 | public List searchScenes(String q, SceneType type) throws ScrapeException {
74 | SceneSearch search = null;
75 | try {
76 | search = switch (type) {
77 | case SCENE -> controller.getScenesFromQuery(q);
78 | case MOVIE -> controller.getMoviesFromQuery(q);
79 | case JAV -> controller.getJAVFromQuery(q);
80 | };
81 | } catch (Exception e) {
82 | LOGGER.error("error search: {}", e.getMessage());
83 | throw new ScrapeException(e);
84 | }
85 |
86 | if (search == null || search.data == null) {
87 | LOGGER.warn("no result found");
88 | throw new NothingFoundException();
89 | }
90 |
91 | return search.data;
92 | }
93 |
94 | public SceneEntity getScene(String id, SceneType type) throws ScrapeException {
95 | SceneGet search = null;
96 | try {
97 | search = switch (type) {
98 | case SCENE -> controller.getSceneFromId(id);
99 | case MOVIE -> controller.getMovieFromId(id);
100 | case JAV -> controller.getJAVFromId(id);
101 | };
102 | } catch (Exception e) {
103 | LOGGER.error("error scene: {}", e.getMessage());
104 | throw new ScrapeException(e);
105 | }
106 |
107 | if (search == null || search.data == null) {
108 | LOGGER.warn("no result found");
109 | throw new NothingFoundException();
110 | }
111 |
112 | return search.data;
113 | }
114 |
115 | public Date getDate(String date) {
116 | Date date_obj = null;
117 |
118 | if (date != null) {
119 | try {
120 | date_obj = new SimpleDateFormat("yyyy-MM-dd").parse(date);
121 | } catch (Exception e) {
122 | LOGGER.error("error date: {}", e.getMessage());
123 | }
124 | }
125 |
126 | return date_obj;
127 | }
128 |
129 | public Integer getYear(Date date) {
130 | Integer year = null;
131 |
132 | if (date != null) {
133 | try {
134 | Calendar calendar = new GregorianCalendar();
135 | calendar.setTime(date);
136 | year = (Integer)calendar.get(Calendar.YEAR);
137 | } catch (Exception e) {
138 | LOGGER.error("error year: {}", e.getMessage());
139 | }
140 | }
141 |
142 | return year;
143 | }
144 |
145 | public List getCertifications() {
146 | List certifications = new ArrayList<>();
147 |
148 | certifications.add(MediaCertification.UNKNOWN);
149 |
150 | return certifications;
151 | }
152 |
153 | public List getCastMembers(List performers, List directors) {
154 | List castMembers = new ArrayList<>();
155 |
156 | for (PerformerEntity performer : performers) {
157 | Person person = new Person();
158 | person.setType(Person.Type.ACTOR);
159 | person.setThumbUrl(performer.image);
160 |
161 | if (performer.parent != null) {
162 | person.setId(getId(), performer.parent.id);
163 | person.setName(performer.parent.name);
164 | person.setRole(performer.parent.extras.gender);
165 | person.setProfileUrl(Const.PerformerURL + performer.parent.slug);
166 | } else {
167 | person.setName(performer.name);
168 | person.setProfileUrl(Const.PerformerSiteURL + performer.id);
169 | }
170 |
171 | castMembers.add(person);
172 | }
173 |
174 | for (DirectorEntity director : directors) {
175 | Person person = new Person();
176 | person.setType(Person.Type.DIRECTOR);
177 | person.setName(director.name);
178 |
179 | castMembers.add(person);
180 | }
181 |
182 | return castMembers;
183 | }
184 |
185 | public List getProductionCompanies(SiteEntity site) throws ScrapeException {
186 | List productionCompanies = new ArrayList<>();
187 |
188 | productionCompanies.add(site.name);
189 |
190 | if (site.parent_id != null && !site.id.equals(site.parent_id)) {
191 | SiteGet parent_site;
192 | try {
193 | parent_site = controller.getSiteFromId(Integer.toString(site.parent_id));
194 | } catch (Exception e) {
195 | LOGGER.error("error scene: {}", e.getMessage());
196 | throw new ScrapeException(e);
197 | }
198 |
199 | productionCompanies.add(parent_site.data.name);
200 | }
201 |
202 | if (site.network_id != null && !site.id.equals(site.network_id)) {
203 | SiteGet network_site;
204 | try {
205 | network_site = controller.getSiteFromId(Integer.toString(site.network_id));
206 | } catch (Exception e) {
207 | LOGGER.error("error scene: {}", e.getMessage());
208 | throw new ScrapeException(e);
209 | }
210 |
211 | productionCompanies.add(network_site.data.name);
212 | }
213 |
214 | return productionCompanies;
215 | }
216 | }
217 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbMetadataProvider.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.tinymediamanager.scraper.MediaProviderInfo;
4 | import org.tinymediamanager.scraper.interfaces.IMediaProvider;
5 |
6 | public class TpdbMetadataProvider implements IMediaProvider {
7 | private final MediaProviderInfo providerInfo;
8 |
9 | TpdbMetadataProvider() {
10 | providerInfo = createMediaProviderInfo();
11 | }
12 |
13 | public MediaProviderInfo getProviderInfo() {
14 | return providerInfo;
15 | }
16 |
17 | public boolean isActive() {
18 | return isFeatureEnabled() && isApiKeyAvailable(getProviderInfo().getConfig().getValue("apiKey"));
19 | }
20 |
21 | public MediaProviderInfo createMediaProviderInfo() {
22 | MediaProviderInfo info = new MediaProviderInfo("tpdb", "movie",
23 | "theporndb.net", "ThePornDB (TPDB)
",
24 | TpdbMetadataProvider.class.getResource("/org/tinymediamanager/scraper/tpdb/logo.png"));
25 |
26 | info.getConfig().addText("apiKey", "", true);
27 | info.getConfig().addSelect("type", new String[] {"Scene", "Movie", "JAV"}, "Scene");
28 | info.getConfig().load();
29 |
30 | return info;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbMovieArtworkProvider.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.tinymediamanager.scraper.ArtworkSearchAndScrapeOptions;
4 | import org.tinymediamanager.scraper.entities.MediaArtwork;
5 | import org.tinymediamanager.scraper.exceptions.ScrapeException;
6 | import org.tinymediamanager.scraper.interfaces.IMovieArtworkProvider;
7 | import org.tinymediamanager.scraper.tpdb.entities.SceneEntity;
8 |
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | public class TpdbMovieArtworkProvider extends TpdbMetadataProvider implements IMovieArtworkProvider {
13 | @Override
14 | public List getArtwork(ArtworkSearchAndScrapeOptions options) throws ScrapeException {
15 | String apiKey = getProviderInfo().getConfig().getValue("apiKey");
16 | TpdbApi api = new TpdbApi(apiKey);
17 | TpdbApi.SceneType type = api.getType(getProviderInfo().getConfig().getValue("type"));
18 | String id = options.getIdAsString(getId());
19 |
20 | List artworks = new ArrayList<>();
21 |
22 | SceneEntity scene;
23 | try {
24 | scene = api.getScene(id, type);
25 | } catch (Exception e) {
26 | throw new ScrapeException(e);
27 | }
28 |
29 | MediaArtwork artwork = new MediaArtwork(getId(), MediaArtwork.MediaArtworkType.POSTER);
30 | artwork.addImageSize(1000, 1500, scene.posters.large, MediaArtwork.PosterSizes.getSizeOrder(1000));
31 | artwork.setOriginalUrl(scene.posters.large);
32 | artwork.setPreviewUrl(scene.posters.small);
33 | artworks.add(artwork);
34 |
35 | artwork = new MediaArtwork(getId(), MediaArtwork.MediaArtworkType.BACKGROUND);
36 | artwork.addImageSize(1500, 1500, scene.background.large, MediaArtwork.PosterSizes.getSizeOrder(1500));
37 | artwork.addImageSize(750, 750, scene.background.medium, MediaArtwork.PosterSizes.getSizeOrder(750));
38 | artwork.addImageSize(500, 500, scene.background.small, MediaArtwork.PosterSizes.getSizeOrder(500));
39 | artwork.setOriginalUrl(scene.background.full);
40 | artwork.setPreviewUrl(scene.background.small);
41 | artworks.add(artwork);
42 |
43 | artwork = new MediaArtwork(getId(), MediaArtwork.MediaArtworkType.THUMB);
44 | artwork.addImageSize(1500, 1000, scene.background.full, MediaArtwork.PosterSizes.getSizeOrder(1500));
45 | artwork.setOriginalUrl(scene.background.full);
46 | artwork.setPreviewUrl(scene.background.small);
47 | artworks.add(artwork);
48 |
49 | return artworks;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbMovieMetadataProvider.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.tinymediamanager.core.movie.MovieSearchAndScrapeOptions;
4 | import org.tinymediamanager.scraper.MediaMetadata;
5 | import org.tinymediamanager.scraper.MediaSearchResult;
6 | import org.tinymediamanager.scraper.entities.MediaType;
7 | import org.tinymediamanager.scraper.exceptions.NothingFoundException;
8 | import org.tinymediamanager.scraper.exceptions.ScrapeException;
9 | import org.tinymediamanager.scraper.interfaces.IMovieMetadataProvider;
10 | import org.tinymediamanager.scraper.tpdb.entities.SceneEntity;
11 |
12 | import java.util.List;
13 | import java.util.SortedSet;
14 | import java.util.TreeSet;
15 |
16 | public class TpdbMovieMetadataProvider extends TpdbMetadataProvider implements IMovieMetadataProvider {
17 | @Override
18 | public SortedSet search(MovieSearchAndScrapeOptions options) throws ScrapeException {
19 | String apiKey = getProviderInfo().getConfig().getValue("apiKey");
20 | TpdbApi api = new TpdbApi(apiKey);
21 | TpdbApi.SceneType type = api.getType(getProviderInfo().getConfig().getValue("type"));
22 |
23 | SortedSet results = new TreeSet<>();
24 |
25 | String query = options.getSearchQuery();
26 |
27 | List search;
28 | try {
29 | search = api.searchScenes(query, type);
30 | } catch (Exception e) {
31 | throw new ScrapeException(e);
32 | }
33 |
34 | if (search == null || search.isEmpty()) {
35 | throw new NothingFoundException();
36 | }
37 |
38 | float score = 100.0F;
39 | for (SceneEntity scene : search) {
40 | MediaSearchResult data = new MediaSearchResult(getId(), MediaType.MOVIE);
41 |
42 | data.setId(getId(), scene.id);
43 | data.setTitle(scene.title);
44 |
45 | data.setYear(api.getYear(api.getDate(scene.date)));
46 |
47 | data.setPosterUrl(scene.posters.small);
48 |
49 | data.setScore(score--);
50 | results.add(data);
51 | }
52 |
53 | return results;
54 | }
55 |
56 | @Override
57 | public MediaMetadata getMetadata(MovieSearchAndScrapeOptions options) throws ScrapeException {
58 | String apiKey = this.getProviderInfo().getConfig().getValue("apiKey");
59 | TpdbApi api = new TpdbApi(apiKey);
60 | TpdbApi.SceneType type = api.getType(getProviderInfo().getConfig().getValue("type"));
61 |
62 | SceneEntity scene = null;
63 |
64 | String id = options.getIdAsString(getId());
65 | if (id != null) {
66 | try {
67 | scene = api.getScene(id, type);
68 | } catch (Exception e) {
69 | throw new ScrapeException(e);
70 | }
71 | }
72 |
73 | return api.setMediaMetadata(scene);
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/TpdbMovieTrailerProvider.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb;
2 |
3 | import org.tinymediamanager.core.entities.MediaTrailer;
4 | import org.tinymediamanager.scraper.TrailerSearchAndScrapeOptions;
5 | import org.tinymediamanager.scraper.exceptions.ScrapeException;
6 | import org.tinymediamanager.scraper.interfaces.IMovieTrailerProvider;
7 | import org.tinymediamanager.scraper.tpdb.entities.SceneEntity;
8 |
9 | import java.util.ArrayList;
10 | import java.util.List;
11 |
12 | public class TpdbMovieTrailerProvider extends TpdbMetadataProvider implements IMovieTrailerProvider {
13 | @Override
14 | public List getTrailers(TrailerSearchAndScrapeOptions options) throws ScrapeException {
15 | String apiKey = getProviderInfo().getConfig().getValue("apiKey");
16 | TpdbApi api = new TpdbApi(apiKey);
17 | TpdbApi.SceneType type = api.getType(getProviderInfo().getConfig().getValue("type"));
18 | String id = options.getIdAsString(getId());
19 |
20 | SceneEntity scene;
21 | try {
22 | scene = api.getScene(id, type);
23 | } catch (Exception e) {
24 | throw new ScrapeException(e);
25 | }
26 |
27 | List trailers = new ArrayList<>();
28 |
29 | if (scene.trailer != null) {
30 | MediaTrailer trailer = new MediaTrailer();
31 | trailer.setName(scene.title);
32 | trailer.setProvider(scene.site.name);
33 | trailer.setUrl(scene.trailer);
34 | trailers.add(trailer);
35 | }
36 |
37 | return trailers;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/DirectorEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class DirectorEntity {
6 | @SerializedName("id")
7 | public String id;
8 |
9 | @SerializedName("name")
10 | public String name;
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/ImageEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class ImageEntity {
6 | @SerializedName("full")
7 | public String full;
8 |
9 | @SerializedName("large")
10 | public String large;
11 |
12 | @SerializedName("medium")
13 | public String medium;
14 |
15 | @SerializedName("small")
16 | public String small;
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/PerformerEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class PerformerEntity {
6 | @SerializedName("id")
7 | public String id;
8 |
9 | @SerializedName("slug")
10 | public String slug;
11 |
12 | @SerializedName("name")
13 | public String name;
14 |
15 | @SerializedName("image")
16 | public String image;
17 |
18 | @SerializedName("parent")
19 | public PerformerEntity parent;
20 |
21 | @SerializedName("extras")
22 | public PerformerExtrasEntity extras;
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/PerformerExtrasEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class PerformerExtrasEntity {
6 | @SerializedName("gender")
7 | public String gender;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/SceneEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | public class SceneEntity {
8 | @SerializedName("id")
9 | public String id;
10 |
11 | @SerializedName("title")
12 | public String title;
13 |
14 | @SerializedName("description")
15 | public String description;
16 |
17 | @SerializedName("date")
18 | public String date;
19 |
20 | @SerializedName("url")
21 | public String url;
22 |
23 | @SerializedName("posters")
24 | public ImageEntity posters;
25 |
26 | @SerializedName("background")
27 | public ImageEntity background;
28 |
29 | @SerializedName("trailer")
30 | public String trailer;
31 |
32 | @SerializedName("performers")
33 | public List performers;
34 |
35 | @SerializedName("directors")
36 | public List directors;
37 |
38 | @SerializedName("site")
39 | public SiteEntity site;
40 |
41 | @SerializedName("tags")
42 | public List tags;
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/SceneGet.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class SceneGet {
6 | @SerializedName("data")
7 | public SceneEntity data = null;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/SceneSearch.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | public class SceneSearch {
8 | @SerializedName("data")
9 | public List data = null;
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/SiteEntity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class SiteEntity {
6 | @SerializedName("id")
7 | public Integer id;
8 |
9 | @SerializedName("parent_id")
10 | public Integer parent_id;
11 |
12 | @SerializedName("network_id")
13 | public Integer network_id;
14 |
15 | @SerializedName("name")
16 | public String name;
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/SiteGet.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class SiteGet {
6 | @SerializedName("data")
7 | public SiteEntity data = null;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/entities/TagEnity.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.entities;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | public class TagEnity {
6 | @SerializedName("name")
7 | public String name = null;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/service/Controller.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.service;
2 |
3 | import com.google.gson.GsonBuilder;
4 | import com.google.gson.JsonDeserializer;
5 | import com.google.gson.internal.bind.DateTypeAdapter;
6 | import okhttp3.OkHttpClient;
7 | import okhttp3.logging.HttpLoggingInterceptor;
8 | import okhttp3.logging.HttpLoggingInterceptor.Level;
9 | import org.slf4j.Logger;
10 | import org.slf4j.LoggerFactory;
11 | import org.tinymediamanager.scraper.http.TmmHttpClient;
12 | import org.tinymediamanager.scraper.tpdb.Const;
13 | import org.tinymediamanager.scraper.tpdb.entities.*;
14 | import retrofit2.Retrofit;
15 | import retrofit2.converter.gson.GsonConverterFactory;
16 |
17 | import java.io.IOException;
18 | import java.util.Date;
19 |
20 | public class Controller {
21 | private static final Logger LOGGER = LoggerFactory.getLogger(Controller.class);
22 | private final Retrofit retrofit;
23 | private String apiKey;
24 |
25 | /**
26 | * setting up the retrofit object with further debugging options if needed
27 | *
28 | * @param debug true or false
29 | */
30 | public Controller(boolean debug) {
31 | OkHttpClient.Builder builder = TmmHttpClient.newBuilder();
32 | if (debug) {
33 | HttpLoggingInterceptor logging = new HttpLoggingInterceptor(LOGGER::debug);
34 | logging.setLevel(Level.BODY);
35 | builder.addInterceptor(logging);
36 | }
37 | retrofit = buildRetrofitInstance(builder.build());
38 | }
39 |
40 | public void setApiKey(String apiKey) {
41 | this.apiKey = apiKey;
42 | }
43 |
44 | private GsonBuilder getGsonBuilder() {
45 | GsonBuilder builder = new GsonBuilder();
46 | // class types
47 | builder.registerTypeAdapter(Integer.class, (JsonDeserializer) (json, typeOfT, context) -> {
48 | try {
49 | return json.getAsInt();
50 | } catch (NumberFormatException e) {
51 | return 0;
52 | }
53 | });
54 | builder.registerTypeAdapter(Date.class, new DateTypeAdapter());
55 | return builder;
56 | }
57 |
58 | /**
59 | * call the search Info
60 | *
61 | * @param searchTerm the movie name
62 | * @return the {@link SceneSearch} item
63 | * @throws IOException any exception that could occur
64 | */
65 | public SceneSearch getScenesFromQuery(String searchTerm) throws IOException {
66 | return getService().scenesSearch("Bearer " + apiKey, searchTerm).execute().body();
67 | }
68 |
69 | /**
70 | * call the scrape service via ID search
71 | *
72 | * @param id the ID to search for
73 | * @return the {@link SceneGet} item
74 | * @throws IOException any exception that could occur
75 | */
76 | public SceneGet getSceneFromId(String id) throws IOException {
77 | return getService().sceneScrapeById("Bearer " + apiKey, id).execute().body();
78 | }
79 |
80 | /**
81 | * call the search Info
82 | *
83 | * @param searchTerm the movie name
84 | * @return the {@link SceneSearch} item
85 | * @throws IOException any exception that could occur
86 | */
87 | public SceneSearch getMoviesFromQuery(String searchTerm) throws IOException {
88 | return getService().moviesSearch("Bearer " + apiKey, searchTerm).execute().body();
89 | }
90 |
91 | /**
92 | * call the scrape service via ID search
93 | *
94 | * @param id the ID to search for
95 | * @return the {@link SceneGet} item
96 | * @throws IOException any exception that could occur
97 | */
98 | public SceneGet getMovieFromId(String id) throws IOException {
99 | return getService().movieScrapeById("Bearer " + apiKey, id).execute().body();
100 | }
101 |
102 | /**
103 | * call the search Info
104 | *
105 | * @param searchTerm the movie name
106 | * @return the {@link SceneSearch} item
107 | * @throws IOException any exception that could occur
108 | */
109 | public SceneSearch getJAVFromQuery(String searchTerm) throws IOException {
110 | return getService().javSearch("Bearer " + apiKey, searchTerm).execute().body();
111 | }
112 |
113 | /**
114 | * call the scrape service via ID search
115 | *
116 | * @param id the ID to search for
117 | * @return the {@link SceneGet} item
118 | * @throws IOException any exception that could occur
119 | */
120 | public SceneGet getJAVFromId(String id) throws IOException {
121 | return getService().javScrapeById("Bearer " + apiKey, id).execute().body();
122 | }
123 |
124 | /**
125 | * call the scrape service via ID search
126 | *
127 | * @param id the ID to search for
128 | * @return the {@link SiteGet} item
129 | * @throws IOException any exception that could occur
130 | */
131 | public SiteGet getSiteFromId(String id) throws IOException {
132 | return getService().sitesScrapeById("Bearer " + apiKey, id).execute().body();
133 | }
134 |
135 | /**
136 | * Returns the created Retrofit Service
137 | *
138 | * @return retrofit object
139 | */
140 | private TpdbService getService() {
141 | return retrofit.create(TpdbService.class);
142 | }
143 |
144 | /**
145 | * Builder Class for retrofit Object
146 | *
147 | * @param client the http client
148 | * @return a new retrofit object.
149 | */
150 | private Retrofit buildRetrofitInstance(OkHttpClient client) {
151 | return new Retrofit.Builder().client(client).baseUrl(Const.APIBaseURL)
152 | .addConverterFactory(GsonConverterFactory.create(getGsonBuilder().create())).build();
153 | }
154 | }
155 |
--------------------------------------------------------------------------------
/src/main/java/org/tinymediamanager/scraper/tpdb/service/TpdbService.java:
--------------------------------------------------------------------------------
1 | package org.tinymediamanager.scraper.tpdb.service;
2 |
3 | import org.tinymediamanager.scraper.tpdb.entities.*;
4 | import retrofit2.Call;
5 | import retrofit2.http.*;
6 |
7 | import static org.tinymediamanager.scraper.tpdb.Const.UserAgent;
8 |
9 | public interface TpdbService {
10 |
11 | @Headers({
12 | "User-Agent: " + UserAgent,
13 | })
14 | @GET("/scenes")
15 | Call scenesSearch(@Header("Authorization") String apikey, @Query("parse") String query);
16 |
17 | @Headers({
18 | "User-Agent: " + UserAgent,
19 | })
20 | @GET("/scenes/{id}")
21 | Call sceneScrapeById(@Header("Authorization") String apikey, @Path("id") String id);
22 |
23 | @Headers({
24 | "User-Agent: " + UserAgent,
25 | })
26 | @GET("/movies")
27 | Call moviesSearch(@Header("Authorization") String apikey, @Query("parse") String query);
28 |
29 | @Headers({
30 | "User-Agent: " + UserAgent,
31 | })
32 | @GET("/movies/{id}")
33 | Call movieScrapeById(@Header("Authorization") String apikey, @Path("id") String id);
34 |
35 | @Headers({
36 | "User-Agent: " + UserAgent,
37 | })
38 | @GET("/jav")
39 | Call javSearch(@Header("Authorization") String apikey, @Query("parse") String query);
40 |
41 | @Headers({
42 | "User-Agent: " + UserAgent,
43 | })
44 | @GET("/jav/{id}")
45 | Call javScrapeById(@Header("Authorization") String apikey, @Path("id") String id);
46 |
47 | @Headers({
48 | "User-Agent: " + UserAgent,
49 | })
50 | @GET("/sites/{id}")
51 | Call sitesScrapeById(@Header("Authorization") String apikey, @Path("id") String id);
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/services/org.tinymediamanager.scraper.spi.IAddonProvider:
--------------------------------------------------------------------------------
1 | org.tinymediamanager.scraper.tpdb.TpdbAddonProvider
--------------------------------------------------------------------------------
/src/main/resources/org/tinymediamanager/scraper/tpdb/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ThePornDatabase/TinyMediaManager-Plugin/751b489e68b5a3552d08d87548e8e6de3cb98cc2/src/main/resources/org/tinymediamanager/scraper/tpdb/logo.png
--------------------------------------------------------------------------------