Giter Club home page Giter Club logo

otter.ai-api's People

Contributors

dependabot[bot] avatar omerdn1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

otter.ai-api's Issues

Not logged in

Hi,

When I do getSpeeches I get a response object in output and somewhere in it, I can see the message 'Not logged in'.

Any idea why?

Upload URL?

Do you know what the Upload URL is?

Could I commission your help?

Getting 401 unauthorized when trying to getSpeaches

I've been trying to use the basic example from the readme, and getting an Unauthorized error :(

 Alfred/alfred-otter   master ●✚  node ottetest.mjs
(node:57037) ExperimentalWarning: The ESM module loader is experimental.
[Function: OtterApi]
Error: Request failed with status code 401
    at createError (/Users/sitalov/Dropbox/SoftwareEngineering/Projects/Alfred/otter.ai-api/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/Users/sitalov/Dropbox/SoftwareEngineering/Projects/Alfred/otter.ai-api/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/Users/sitalov/Dropbox/SoftwareEngineering/Projects/Alfred/otter.ai-api/node_modules/axios/lib/adapters/http.js:237:11)
    at IncomingMessage.emit (events.js:333:22)
    at endReadableNT (_stream_readable.js:1220:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  config: {
    url: 'https://otter.ai/forward/api/v1/speeches',
    method: 'get',
    params: { userid: undefined },
    headers: {
      Accept: 'application/json, text/plain, */*',
      'User-Agent': 'axios/0.19.0'
    },
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    adapter: [Function: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    validateStatus: [Function: validateStatus],
    data: undefined
  },
  request: <ref *1> ClientRequest {
    _events: [Object: null prototype] {
      socket: [Function (anonymous)],
      abort: [Function (anonymous)],
      aborted: [Function (anonymous)],
      error: [Function (anonymous)],
      timeout: [Function (anonymous)],
      prefinish: [Function: requestOnPrefinish]
    },
    _eventsCount: 6,
    _maxListeners: undefined,
    outputData: [],
    outputSize: 0,
    writable: true,
    _last: true,
    chunkedEncoding: false,
    shouldKeepAlive: false,
    useChunkedEncodingByDefault: false,
    sendDate: false,
    _removedConnection: false,
    _removedContLen: false,
    _removedTE: false,
    _contentLength: 0,
    _hasBody: true,
    _trailer: '',
    finished: true,
    _headerSent: true,
    socket: TLSSocket {
      _tlsOptions: [Object],
      _secureEstablished: true,
      _securePending: false,
      _newSessionPending: false,
      _controlReleased: true,
      _SNICallback: null,
      servername: 'otter.ai',
      alpnProtocol: false,
      authorized: true,
      authorizationError: null,
      encrypted: true,
      _events: [Object: null prototype],
      _eventsCount: 9,
      connecting: false,
      _hadError: false,
      _parent: null,
      _host: 'otter.ai',
      _readableState: [ReadableState],
      readable: true,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: false,
      _sockname: null,
      _pendingData: null,
      _pendingEncoding: '',
      server: undefined,
      _server: null,
      ssl: [TLSWrap],
      _requestCert: true,
      _rejectUnauthorized: true,
      parser: null,
      _httpMessage: [Circular *1],
      [Symbol(res)]: [TLSWrap],
      [Symbol(asyncId)]: 19,
      [Symbol(kHandle)]: [TLSWrap],
      [Symbol(lastWriteQueueSize)]: 0,
      [Symbol(timeout)]: null,
      [Symbol(kBuffer)]: null,
      [Symbol(kBufferCb)]: null,
      [Symbol(kBufferGen)]: null,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesRead)]: 0,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(connect-options)]: [Object]
    },
    _header: 'GET /forward/api/v1/speeches HTTP/1.1\r\n' +
      'Accept: application/json, text/plain, */*\r\n' +
      'User-Agent: axios/0.19.0\r\n' +
      'Host: otter.ai\r\n' +
      'Connection: close\r\n' +
      '\r\n',
    _onPendingData: [Function: noopPendingOutput],
    agent: Agent {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      defaultPort: 443,
      protocol: 'https:',
      options: [Object],
      requests: {},
      sockets: [Object],
      freeSockets: {},
      keepAliveMsecs: 1000,
      keepAlive: false,
      maxSockets: Infinity,
      maxFreeSockets: 256,
      maxCachedSessions: 100,
      _sessionCache: [Object],
      [Symbol(kCapture)]: false
    },
    socketPath: undefined,
    method: 'GET',
    maxHeaderSize: undefined,
    path: '/forward/api/v1/speeches',
    _ended: true,
    res: IncomingMessage {
      _readableState: [ReadableState],
      readable: false,
      _events: [Object: null prototype],
      _eventsCount: 3,
      _maxListeners: undefined,
      socket: [TLSSocket],
      httpVersionMajor: 1,
      httpVersionMinor: 1,
      httpVersion: '1.1',
      complete: true,
      headers: [Object],
      rawHeaders: [Array],
      trailers: {},
      rawTrailers: [],
      aborted: false,
      upgrade: false,
      url: '',
      method: null,
      statusCode: 401,
      statusMessage: 'Unauthorized',
      client: [TLSSocket],
      _consuming: false,
      _dumped: false,
      req: [Circular *1],
      responseUrl: 'https://otter.ai/forward/api/v1/speeches',
      redirects: [],
      [Symbol(kCapture)]: false
    },
    aborted: false,
    timeoutCb: null,
    upgradeOrConnect: false,
    parser: null,
    maxHeadersCount: null,
    reusedSocket: false,
    _redirectable: Writable {
      _writableState: [WritableState],
      writable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _options: [Object],
      _redirectCount: 0,
      _redirects: [],
      _requestBodyLength: 0,
      _requestBodyBuffers: [],
      _onNativeResponse: [Function (anonymous)],
      _currentRequest: [Circular *1],
      _currentUrl: 'https://otter.ai/forward/api/v1/speeches',
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false,
    [Symbol(kNeedDrain)]: false,
    [Symbol(corked)]: 0,
    [Symbol(kOutHeaders)]: [Object: null prototype] {
      accept: [Array],
      'user-agent': [Array],
      host: [Array]
    }
  },
  response: {
    status: 401,
    statusText: 'Unauthorized',
    headers: {
      date: 'Fri, 25 Dec 2020 23:40:41 GMT',
      'content-type': 'application/json',
      'content-length': '58',
      connection: 'close',
      server: 'nginx/1.16.1',
      vary: 'Cookie',
      'x-frame-options': 'SAMEORIGIN'
    },
    config: {
      url: 'https://otter.ai/forward/api/v1/speeches',
      method: 'get',
      params: [Object],
      headers: [Object],
      transformRequest: [Array],
      transformResponse: [Array],
      timeout: 0,
      adapter: [Function: httpAdapter],
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      validateStatus: [Function: validateStatus],
      data: undefined
    },
    request: <ref *1> ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 6,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      socket: [TLSSocket],
      _header: 'GET /forward/api/v1/speeches HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'User-Agent: axios/0.19.0\r\n' +
        'Host: otter.ai\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _onPendingData: [Function: noopPendingOutput],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      path: '/forward/api/v1/speeches',
      _ended: true,
      res: [IncomingMessage],
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      _redirectable: [Writable],
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype]
    },
    data: { status: 'Error', message: 'Not logged in', code: 1 }
  },
  isAxiosError: true,
  toJSON: [Function (anonymous)]
}
Successfuly logged in to Otter.ai

looking at the code it seems login is happening async, so if I just try to create client and use it breaks.. let me play with that

TypeError: OtterApi is not a constructor

I'm getting the following error: TypeError: OtterApi is not a constructor.

const otterApi = new OtterApi({
                 ^

TypeError: OtterApi is not a constructor
    at file:///Users/jacquesthibodeau/Desktop/Code/ai-alignment-audio-transcription/otter.ai-api/otterai_extractor.js:3:18
    at ModuleJob.run (node:internal/modules/esm/module_job:198:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:409:24)
    at async loadESM (node:internal/process/esm_loader:85:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)

If I look at index.js in the repo, it does look like a constructor? First part of the code is:

class OtterApi {
  constructor(options = {}) {
    this.options = options;
    this.user = {};
    this.csrfToken = '';
  }

  init = async () => {
    await this.#login();
  };

The code I'm trying to run (though I had to add "type": "module" to get the import to work):

import OtterApi from 'otter.ai-api';

const otterApi = new OtterApi({
    email: 'email', // Your otter.ai email
    password: 'pw', // Your otter.ai password
});

await otterApi.init() // Performs login

I get the error when using new OtterApi(). I'm not sure how to resolve this.

Error: Request failed with status code 404 (axios error)

Hey, thanks for creating this package.

Unfortunately, I can't grab any conversations from otter.ai. Is it possible that they made changes to the side that breaks the code in this repo? I'm using the following code:

const OtterApi = require('otter.ai-api').default;

const otterApi = new OtterApi({
    email: 'email', // Your otter.ai email
    password: 'pw', // Your otter.ai password
});

async function main() {

    await otterApi.init() // Performs login
    await otterApi.getSpeeches(); // Gets all speeches
}

main();

I tried for one speech and all. And then I'm getting the following error after a successful login:

Successfuly logged in to Otter.ai
/Users/jacquesthibodeau/Desktop/Code/ai-alignment-audio-transcription/otter.ai-api/node_modules/axios/lib/core/createError.js:16
  var error = new Error(message);
              ^

Error: Request failed with status code 404
    at createError (/Users/jacquesthibodeau/Desktop/Code/ai-alignment-audio-transcription/otter.ai-api/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/Users/jacquesthibodeau/Desktop/Code/ai-alignment-audio-transcription/otter.ai-api/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/Users/jacquesthibodeau/Desktop/Code/ai-alignment-audio-transcription/otter.ai-api/node_modules/axios/lib/adapters/http.js:260:11)
    at IncomingMessage.emit (node:events:539:35)
    at endReadableNT (node:internal/streams/readable:1344:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Then there's a really long json response. But I see this at the end:

        'user-agent': [ 'User-Agent', 'axios/0.21.1' ],
        host: [ 'Host', 'otter.ai' ]
      }
    },
    data: { status: 'failed', message: 'Speech not found', code: 13 }
  },
  isAxiosError: true,
  toJSON: [Function: toJSON]
}

Any ideas if this is fixable?

How to convert transcript offsets to time?

Hi & thanks for the library

I am wondering if you can tell me how to convert the offsets into actual time e.g.

  transcripts: [
    {
      start_offset: 52800,
      end_offset: 493440,

Do you know what measurement system those values are in?
How would you convert them into seconds or minutes from the start of the recording?
Thanks for any help you can provide

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.