1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Discovering the iPad interface

Discussion in 'TiVo Underground' started by wmcbrine, Jan 18, 2011.

  1. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    Taking the information that is found from "subscriptionSearch", I've come up with these values that should work with "subscribe" (to create a new Season Pass):

    Code:
    'keepBehavior' : 'forever',         KUID
    'keepBehavior' : 'fifo',            Space Needed
    
    'showStatus' : 'everyEpisode',      All with Duplicates
    'showStatus' : 'rerunsAllowed',     First Run & Reruns
    'showStatus' : 'firstRunOnly',      First Run Only
    
    'startTimePadding' : 0,             On time
    'startTimePadding' : 60,            One minute early    
    
    'endTimePadding' : 0                On time
    'endTimePadding' : 60               One minute late
    
    "maxRecordings": 0                  All episodes
    "maxRecordings": 25                 Keep at Most 25 episodes
    
    'recordingQuality' : 'best',        *Maybe* basic, medium, high, best, device_default if 'isDigital' : False,
    
    The rest I think would have to come from "contentSearch" "gridRowSearch".
    gridRowSearch allows searching by Series title.
     
  2. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    More keyword discoveries through trial-n-error:
    Code:
    mixMappingSearch
    'You must specify exactly one of: childMixId, parentMixId, mixMappingId, mixServiceGroup or minUpdateDate'
    
    tunerConflictEventRegister
    'This handler only support monitoring.'
    
    tunerStateEventRegister
    'Must specify monitoring.'
    
     
  3. puffdaddy

    puffdaddy Member

    295
    0
    Mar 1, 2006
    Good work. Here are some additional supported MRPC/2 requests. Note that some of these may not be implemented in the iPad app.
    Code:
    BodyAuthenticate
    BodyConfigSearch
    ChannelSearch
    ChannelUpdate
    CheckParentalControlsPinRequest
    CheckPurchaseControlPinRequest
    ControllerIdVctIdGet
    EndUserMessageEventRegister
    EndUserMessageRemove
    EndUserMessageSearch
    EndUserMessageUpdate
    IdSearch
    KeyEventSend
    KnownHostItemRemove
    KnownHostItemSearch
    KnownHostItemStore
    LocalApplicationDataRemove
    LocalApplicationDataSearch
    LocalApplicationDataStore
    OfferSearch
    OptStatusGet
    PartnerLogging
    PartnerTicketRemove
    PartnerTicketRenewE
    PartnerTicketStatus
    PartnerTicketStore
    Ping
    PromotionalMenuItemGet
    RecordingFolderItemEmpty
    RecordingFolderItemSearch
    RecordingSearch
    RecordingUpdate
    ServiceStateEventRegister
    SetParentalControlsPinRequest
    SetPurchaseControlPinRequest
    SettingsGet
    SettingsStore
    ShowcaseStateSearch
    Subscribe
    SubscriptionSearch
    SubscriptionsReprioritize
    SyncRequest
    SystemDiagnosticSearch
    TransportStreamIdMappingsCacheUpdate
    TransportStreamIdMappingsGet
    TransportStreamIdMappingsScanConfigurationGet
    TransportStreamIdMappingsScanConfigurationStore
    TransportStreamIdMappingsScanControl
    TunerConflictEventRegister
    TunerConflictResolve
    TunerStateEventRegister
    UiNavigate
    Unsubscribe
    UserContentSearch
    UserContentStore
    VideoPlaybackInfoEventRegister
    VideoPlaybackPositionSet
    VideoProviderListGet
    WhatsOnSearch
    CandyBarGet
    ClassicUiSegue
    FlashSegue
    HmeSegue
    ReturnSegue
     
  4. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    Wow! "SubscriptionsReprioritize" sounds interesting! I'm going to run the 47 or so new Requests to see what the Premiere spits out. :up:

    ETA: It appears the Requests are case-sensitive. When the proper case is provided, I get an error indicating "badArgument" if I don't supply the required or correct keywords. When the proper case isn't supplied, I get an error indicating "routingError". Is the list above properly cased?
     
  5. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    Looking at the images supplied with the iPad app, I'm seeing "Thumbs" ratings. Can you give Thumbs Up/Down preferences with the app? If so, can you capture what is being Requested?

    From the iPad app:
    [​IMG]
    [​IMG]
    [​IMG]
     

    Attached Files:

  6. arantius

    arantius New Member

    60
    0
    Jul 25, 2009
    In the app I've seen it display thumbs ratings already made (on the TiVo), but I've never found a place to set them in app.
     
  7. arantius

    arantius New Member

    60
    0
    Jul 25, 2009
    Awesome. How did you find these? Can we discover valid request formats also?
     
  8. puffdaddy

    puffdaddy Member

    295
    0
    Mar 1, 2006
    Those came directly from the tivo software itself (e.g., run strings against tivoapp). The case may well be incorrect (lowercase first letter), and I'd have to poke a bit more to see if anything about the request format can be divined from the disassembly.
     
  9. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    This one was scary:

    recordingFolderItemEmpty
    'success'

    I had the TV turned off, and didn't know if My Shows was going to be emptied! Oddly, my FSI (sitting at 100%) disappeared while checking out my recordings. This may be a "Delete Folder/Group" function, opposed to recordingUpdate... I'll play with that later!

    Edit: Looking at Recording History, it does look like 5 recordings were deleted. They all appear to have been Suggestions. Interesting...
     
  10. arantius

    arantius New Member

    60
    0
    Jul 25, 2009
    Ah. How did you get that? I certainly am not in the mood to take apart mt TiVo.
     
  11. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    It sounds like it came from a hacked TiVo, a Series 3 or earlier?
     
  12. moyekj

    moyekj Well-Known Member

    11,151
    34
    Jan 23, 2006
    Mission...
    I'd be very interested in looking at tivoapp binary from a Premiere for other reasons as well. Can you make a download available somewhere?
     
  13. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    Whoops - I checked the forum who shall not be named. I was thinking tivoapp was yet to be had. I should have realized that with JMFS expansion, my thinking was incorrect... :rolleyes:
     
  14. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    FWIW, I added a new project into Google Code: http://code.google.com/p/tivopremiereremote/

    It's YATR - Yet Another TiVo remote. But it solely utilizes the iPad interface to send the commands. It's also the first I used tkinter, so it looks a bit different!
    [​IMG]

    You'll note along the top left side I included "jumps" to the various VOD providers in place of TV power/volume control. Edit the Remote.pyw file to include the IP Address of your TiVo, as well as the MAK. I plan on expanding this project to include "scrub" functionality.

    ETA: Let me know if the window "Geometry" gives you issues. I used that feature to place my prototype exactly over the iPad "full" background template, so I could match the button positioning more accurately:
    [​IMG]

    ETA: started new thread.
     

    Attached Files:

  15. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    I made a (rough) python/tkinter Scale widget that does "scrubbing":

    <Code snipped, see scrubber.pyw.txt attachment>

    [​IMG]

    Like I say, it's rough, but I like the functionality. Currently it displays minutes in float, so 15 minutes 30 seconds will show up as 15.5000. There's something odd too, where when the app launches, it repositions a few milliseconds before or after the current position. The TiVo responds very quickly though, and can navigate to any position in the recording! More work to be had before I go "prime time" with it.
     

    Attached Files:

  16. moyekj

    moyekj Well-Known Member

    11,151
    34
    Jan 23, 2006
    Mission...
    What I would really like is a means to access the Recording History, specifically for items that will *NOT* record. As it is now one has to wade through a huge list of useless reasons on the TiVo itself (usually firstRun or 28 day rule) why something will not record to find 1 or 2 that won't record because of tuner conflicts. It would be nice to:
    1. First detect such conflicts
    2. If other Premieres are available then possibly attempt to schedule a recording on another Premiere and if failing to do so then email about it.

    i.e. A first step at cooperative scheduling, but just conflict monitoring.

    In rpcs2 there is only 1 response to a "recordingSearch" request that offers some hope, a cancellationReason that is not "unknown":

    111637-1212-2-response-recordingList.txt
    Code:
    "cancellationReason": "notFirstRun",
    
     
  17. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    I have a few ideas for using a combination of subscriptionSearch (SPM), gridRowSearch (upcoming) and recordingSearch (To Do List). I'm thinking a few fields from those should give an idea of what's desired, what's available to record, and what is actually scheduled to record. Importing datetime as dtm, I'm able to dynamically set some required fields in gridRowSearch to look for specific "collections" coming up:

    Code:
        # gridRowSearch
        def gridRowSearch(self):
            req = RpcRequest('gridRowSearch',
                             orderBy='channelNumber',
                             maxStartTime=(dtm.datetime.now() + dtm.timedelta(days=14)).strftime("%Y-%m-%d %H-%M-%S"),
                             minEndTime=dtm.datetime.now().strftime("%Y-%m-%d %H-%M-%S"),
                             collectionId=['tivo:cl.78241342'],
                             levelOfDetail='high',
                             bodyId='-')
            self.Write(req)
    
    The following works as well, but may create ambiguity if there are similarly titled shows:

    Code:
        # gridRowSearch
        def gridRowSearch(self):
            req = RpcRequest('gridRowSearch',
                             orderBy='channelNumber',
                             maxStartTime=(dtm.datetime.now() + dtm.timedelta(days=14)).strftime("%Y-%m-%d %H-%M-%S"),
                             minEndTime=dtm.datetime.now().strftime("%Y-%m-%d %H-%M-%S"),
                             title='30 Rock',
                             levelOfDetail='high',
                             bodyId='-')
            self.Write(req)
    
    I'll get started! :D
     
  18. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    The more I look, the more I find:

    Code:
        {
          u 'recordingQuality' : u 'best',
          u 'maxRecordings' : 5,
          u 'keepBehavior' : u 'fifo',
          u 'folderingRules' : u 'subscriptionOnly',
          u 'startTimePadding' : 0,
          u 'title' : u 'UNDERCOVER BOSS',
          u 'bodyId' : u 'tsn:746000000000001',
          u 'priority' : 2525,
          u 'bodyGeneratesCandidates' : True,
          u 'showStatus' : u 'rerunsAllowed',
          u 'idSetSource' :
          {
            u 'titleKeywordOp' : [u 'required'],
            u 'titleKeyword' : [u 'Undercover Boss'],
            u 'type' : u 'wishListSource'
          },
          u 'subscriptionId' : u 'tivo:sb.689',
          u 'levelOfDetail' : u 'high',
          u 'type' : u 'subscription',
          u 'endTimePadding' : 0
        },
    
    Could this mean exporting Wishlists?!
     
  19. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    OK, why am I having such a hard time figuring out how to construct a responseTemplate? Given an example of a JSON response:

    Code:
    "responseTemplate": [
      {
        "fieldName": [
          "gridRow"
        ],
        "type": "responseTemplate",
        "typeName": "gridRowList"
      },
      {
        "fieldName": [
          "offer"
        ],
        "type": "responseTemplate",
        "typeName": "gridRow"
      },
      {
        "fieldName": [
          "title",
          "contentId",
          "startTime",
          "duration",
          "offerId",
          "collectionId"
        ],
        "type": "responseTemplate",
        "typeName": "offer"
      },
      {
        "fieldName": [
          "channelNumber",
          "sourceType",
          "logoIndex",
          "callSign",
          "isDigital"
        ],
        "type": "responseTemplate",
        "typeName": "channel"
      }
    ]
    
    how do I turn that into python lists and/or dictionaries? My Google-fu is failing me; I'm only finding reference to the actual json or simplejson modules, which is fine because it lets me know JSON <> python translations can occur, but doesn't really help me translate what I'm seeing into something I can interpret.
     
  20. orangeboy

    orangeboy yes, I AM orangeboy!

    4,083
    0
    Apr 19, 2004
    East Moline, IL
    Nevermind, figured it out. It's a dictionary of lists of dictionaries that can contain lists (or is it a list of lists that contain dictionaries that can contain lists?). Regardless, the above turns into this:

    Code:
    responseTemplate=[{"fieldName":["gridRow"], "typeName": "gridRowList"},
                      {"fieldName":["offer"], "typeName": "gridRow"},
                      {"fieldName":["title", "contentId", "startTime", "duration", "offerId", "collectionId"], "typeName": "offer"},
                      {"fieldName":["channelNumber", "sourceType", "logoIndex", "callSign", "isDigital"], "typeName": "channel"}],
    
    One thing to note: omit "type": "responseTemplate" and use only typeName if using arantius' RpcRequest function. TiVo's servers got angry at me, giving back:

    Code:
    type field of dictionary should have been 'gridRowSearch', but was 'error'
    -or-
    com.tivo.trio.schema.SchemaException: must specify either typeName or typeNumber
    
     

Share This Page