J-Novel Club
    • Categories
    • Recent
    • Tags
    • Users
    • Login

    Developer PSA: labs.j-novel.club is your new friend!

    Scheduled Pinned Locked Moved Suggestions & Feedback
    81 Posts 25 Posters 30.9k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • chocolatkeyC
      chocolatkey Staff
      last edited by

      Added the following to the list:

      GET https://labs.j-novel.club/app/v1/volumes/{ID or slug}/skus // Volume's third-party purchase options
      GET https://labs.j-novel.club/app/v1/volumes/{ID or slug}/price // Volume's pricing on JNC
      POST https://labs.j-novel.club/app/v1/me/credits/convert // Convert credits to coins
      POST https://labs.j-novel.club/app/v1/me/coins/purchase // Purchase coins
      POST https://labs.j-novel.club/app/v1/me/coins/redeem/{ID or slug} // Redeem coins by volume slug or ID
      GET https://labs.j-novel.club/app/v1/me/coins/options // Get coin pricing options
      

      Astute API users will notice that some more endpoints have been removed from the old API

      1 Reply Last reply Reply Quote 0
      • chocolatkeyC
        chocolatkey Staff
        last edited by

        Added GET https://labs.j-novel.club/app/v1/me/history. Required a from and until query parameter with unix timestamps. Lowest acceptable value for either is 1448841600

        1 Reply Last reply Reply Quote 0
        • kualiK
          kuali Premium Member
          last edited by

          Is there any way to track when a manga volume was last updated or downloaded? For regular ebooks, /me/library has the lastDownload and lastUpdated fields, but I can't spot anything equivalent for manga.

          https://forums.j-novel.club/topic/6701/omnibus-builder
          https://forums.j-novel.club/topic/5745/ascendance-of-a-bookworm-omnibus-editions

          The Primal Desires: Food, Sleep, Sex, StroZero, Hypnotism, and Awayuki Kokorone.

          Item Diaria Apothecaria legi debent.

          1 Reply Last reply Reply Quote 0
          • T
            talisein Premium Member
            last edited by

            It'd be great if the me/library's book.download object had a crc32 or any kind of hash. Even just the content length if nothing else; I tried HEADing the download link but there's no size in the headers even.

            chocolatkeyC 1 Reply Last reply Reply Quote 0
            • chocolatkeyC
              chocolatkey Staff @talisein
              last edited by

              @talisein that's because the ebooks are generated on the fly as they're downloaded. Some sort of etag-equivalent unrelated to the content of the final ebook you download maybe be a possibility in the future, but it will probably never be a checksum of the content itself

              1 Reply Last reply Reply Quote 0
              • chocolatkeyC
                chocolatkey Staff @yanrishatum
                last edited by chocolatkey

                @yanrishatum

                Have to also note about /parts/$id/toc not making sense, as it clearly should be /series/$id/toc / /series/$id/parts

                I know, it's weird. It's a quirk of dealing with the current database and how everything is connected, and it's just easier/more efficient for now to say "I am currently reading this part and I want the TOC for its series" for the mobile app, for which this API was originally designed for. We'll have a better TOC API in the future, probably /v2

                Regarding your suggestion for accepted content-type, I'll look into it, first I have to make sure it doesn't break any of the clients

                1 Reply Last reply Reply Quote 0
                • chocolatkeyC
                  chocolatkey Staff
                  last edited by

                  Added the following to the list:

                  PUT https://labs.j-novel.club/app/v1/me
                  GET/POST https://labs.j-novel.club/app/v1/me/subscription
                  POST https://labs.j-novel.club/app/v1/me/subscription/sync
                  POST/DELETE https://labs.j-novel.club/app/v1/me/subscription/cancel
                  POST https://labs.j-novel.club/app/v1/me/subscription/estimate
                  GET/DELETE/PUT https://labs.j-novel.club/app/v1/me/method
                  GET https://labs.j-novel.club/app/v1/me/method/setup
                  

                  Subscription management through the old API is no longer supported, and may be removed at any time.

                  P.S. I'm getting tired of updating/maintaining this list, it will soon be time for proper API docs, currently researching the most appropriate/best docs generator.

                  1 Reply Last reply Reply Quote 1
                  • RanR
                    Ran @chocolatkey
                    last edited by

                    Thanks for making all this available, even unofficially -- if you add proper API docs that'll be more than some major companies provide for official partners. :)

                    Speaking of APIs ...
                    @chocolatkey said in Developer PSA: labs.j-novel.club is your new friend!:

                    POST https://labs.j-novel.club/app/v1/me/coins/purchase

                    Knowing the kind of parameters each takes would be really helpful -- it's a lot harder to work backwards with protobufs!

                    chocolatkeyC 1 Reply Last reply Reply Quote 0
                    • chocolatkeyC
                      chocolatkey Staff @Ran
                      last edited by chocolatkey

                      @Ran Yeah protobufs docs is also part of what I want to expose... For now have this, you POST it a PurchaseRequest

                      message StripePaymentIntent {
                          string payment_method = 1;
                          string payment_intent = 2;
                      }
                      
                      message PurchaseRequest {
                          enum Processor {
                              DEBUG = 0; // Only works when debug mode is enabled on the server
                              STRIPE = 1; // Stripe
                              // Insert app payment processors here!
                          }
                          Processor processor = 1; // The payment processor to use
                          uint32 amount = 2; // The amount of coins to purchase
                          oneof intent { // The payment intent from the processor
                              StripePaymentIntent stripe_payment_intent = 3;
                          }
                      }
                      

                      If I remember correctly the enum values need to use the names in JSON, so "processor":"STRIPE"

                      RanR 1 Reply Last reply Reply Quote 1
                      • RanR
                        Ran @chocolatkey
                        last edited by

                        @chocolatkey Awesome, thanks! That's exactly what I needed. You were totally right about the enum name -- and I would never have figured out how to pass along the payment intent without seeing the protos laid out like that.

                        1 Reply Last reply Reply Quote 0
                        • chocolatkeyC
                          chocolatkey Staff
                          last edited by chocolatkey

                          Added a new GET https://labs.j-novel.club/app/v1/series/{ID or slug}/aggregate , to get all data regarding a series (series, volumes, parts). Should be identical to making the individual requests

                          1 Reply Last reply Reply Quote 3
                          • chocolatkeyC
                            chocolatkey Staff
                            last edited by

                            Added "status" to series, which can be (in JSON format) one of "DEFAULT", "COMPLETE", "HIATUS"

                            1 Reply Last reply Reply Quote 2
                            • BruhtekB
                              Bruhtek Member
                              last edited by

                              Is it possible to get some pointers on the /parts/$slug/data endpoint? Light novel data is simple enough with /embed/$slug/data.xhtml, but doesn't work for manga. I am trying to get manga parts, but have no idea where to even start decoding the response.

                              chocolatkeyC 1 Reply Last reply Reply Quote 1
                              • chocolatkeyC
                                chocolatkey Staff @Bruhtek
                                last edited by

                                @Bartek The manga parts currently have DRM due to the stipulations of the original publisher(s). There is, therefore, no documentation on how to decode and display manga data

                                BruhtekB 1 Reply Last reply Reply Quote 1
                                • BruhtekB
                                  Bruhtek Member @chocolatkey
                                  last edited by

                                  @chocolatkey Ah, too bad!

                                  1 Reply Last reply Reply Quote 1
                                  • T
                                    TailsxKyuubi Premium Member
                                    last edited by

                                    My question is regarding the covers. is there any reason, that the field originalUrl is always empty? i would need the cover in a higher resolution.

                                    chocolatkeyC 1 Reply Last reply Reply Quote 0
                                    • chocolatkeyC
                                      chocolatkey Staff @TailsxKyuubi
                                      last edited by

                                      @TailsxKyuubi Because we don't actually have any original uploaded right now, it's planned for the future although I think that structure may change before then

                                      T 1 Reply Last reply Reply Quote 0
                                      • T
                                        TailsxKyuubi Premium Member @chocolatkey
                                        last edited by

                                        @chocolatkey i dont understand the problem. they are already in some way uploaded. the ebooks itself already have the cover wouldnt it be possible to upload this in a automated process?

                                        1 Reply Last reply Reply Quote 0
                                        • BruhtekB
                                          Bruhtek Member
                                          last edited by

                                          Does the /auth/otp4app/check not accept format=json query? It works with /auth/otp4app/generate/, but for some reason not with the check one. From a decoder, all I can guess is that it returns some kind of token starting with otp_, and 3 numbers? Could we get some more info on how to login using the OTP code?

                                          T 1 Reply Last reply Reply Quote 0
                                          • T
                                            thelta Member @Bruhtek
                                            last edited by thelta

                                            @Bartek
                                            Yeah, I also couldn't manage to work with json. However, with protoc --decode_raw you can easily parse it. The protobuf format is probably something like this.

                                            message Ttl
                                            {
                                              int64 ttl_seconds = 1;
                                            }
                                            message AuthSession 
                                            {
                                              string token = 1;
                                              Ttl ttl_seconds = 2;
                                              google.protobuf.Timestamp timestamp = 3;
                                            }
                                            

                                            Token size is 56 characters.

                                            chocolatkeyC 1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 4 / 5
                                            • First post
                                              Last post