├── .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 | Logo 10 | 11 | 12 |

Tiny Media Manager Metadata Plug-In

13 | 14 |

15 | 16 | 17 | 18 | 19 |

20 |

Table of Contents

21 |
    22 |
  1. 23 | About The Project 24 |
  2. 25 |
  3. 26 | Getting Started 27 | 31 |
  4. 32 |
  5. Usage
  6. 33 |
  7. Roadmap
  8. 34 |
  9. Contributing
  10. 35 |
  11. Contact
  12. 36 |
  13. Acknowledgements
  14. 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 --------------------------------------------------------------------------------