Go to file
2019-10-11 00:10:15 +03:00
internal Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
.gitignore Removing .lock file and debugging code. 2018-09-22 14:48:11 -05:00
arlo_test.go More cleanup. Added copyright notice. 2018-09-22 14:22:42 -05:00
arlo.go Update url to my.arlo.com. 2019-10-11 00:10:15 +03:00
arlobaby.go More cleanup. Added copyright notice. 2018-09-22 14:22:42 -05:00
basestation.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
camera.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
const.go Update base url to my.arlo.com. 2019-10-11 00:09:07 +03:00
devices.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
events_stream.go Merge branch 'master' of https://github.com/jeffreydwalter/arlo-go 2018-12-11 17:50:16 -06:00
gopher-arlo.png Adding a gopher logo. 2018-09-22 13:55:49 -05:00
Gopkg.toml Fixed race conditions, refactored the basestation and eventstream code to make it safer. 2018-09-22 09:15:22 -05:00
library.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
LICENSE Initial commit 2017-11-22 10:47:15 -06:00
lights.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
logo.png Adding Arlo logo. 2018-09-22 13:40:02 -05:00
README.md Merge pull request #16 from jryd/issue-8 2019-03-30 09:16:21 -05:00
responses.go Lots of changes... Fixed issue with timeout of event stream. Added new APIs. Cleaned up existing schemas and APIs. 2018-12-11 17:48:51 -06:00
types.go Fix a couple of issues reported by go-vet. 2019-10-10 23:48:35 +03:00
util.go remove unused UnixMicro and UnixMilli functions; resolves #12 2019-03-30 19:56:50 +10:00

arlo-go

Go package for interacting with Netgear's Arlo camera system.


Now in Go!

I love Go. That is why I decided to write this library! I am the creator of the first arlo library written in Python.

My goal is to bring parity to the Python version asap. If you know what you're doing in Go, I would appreciate any feedback on the general structure of the library, bugs found, contributions, etc.


It is by no means complete, although it does expose quite a bit of the Arlo interface in an easy to use Go pacakge. As such, this package does not come with unit tests (feel free to add them, or I will eventually) or guarantees. All contributions are welcome and appreciated!

Please, feel free to contribute to this repo or buy Jeff a beer! Donate


Generous Benefactors (Thank you!)

No beers for Jeff yet! 🍺


Awesomely Smart Contributors (Thank you!)

Just me so far...

If You'd like to make a diffrence in the world and get your name on this most prestegious list, have a look at our help wanted section!


Filing an Issue

Please read the Issue Guidelines and Policies wiki page BEFORE you file an issue. Thanks.


Install

# Install latest stable package
$ go get github.com/jeffreydwalter/arlo-go

# Note: This package uses the `go dep` package for dependency management. If you plan on contributing to this package, you will be required to use [dep](https://github.com/golang/dep). Setting it up is outside the scope of this README, but if you want to contribute and aren't familiar with `dep`, I'm happy to get you.

After installing all of the required libraries, you can import and use this library like so:

package main

import (
	"fmt"
	"log"
	"sync"
	"time"

	"github.com/jeffreydwalter/arlo-go"
)

const (
	USERNAME = "user@example.com"
	PASSWORD = "supersecretpassword"
)

func main() {

	// Instantiating the Arlo object automatically calls Login(), which returns an oAuth token that gets cached.
	// Subsequent successful calls to login will update the oAuth token.
	arlo, err := arlo.Login(USERNAME, PASSWORD)
	if err != nil {
		log.Printf("Failed to login: %s\n", err)
		return
	}
	// At this point you're logged into Arlo.

	now := time.Now()
	start := now.Add(-7 * 24 * time.Hour)

	// Get all of the recordings for a date range.
	library, err := arlo.GetLibrary(start, now)
	if err != nil {
		log.Println(err)
		return
	}

	// We need to wait for all of the recordings to download.
	var wg sync.WaitGroup

	for _, recording := range *library {

		// Let the wait group know about the go routine that we're about to run.
		wg.Add(1)

		// The go func() here makes this script download the files concurrently.
		// If you want to download them serially for some reason, just remove the go func() call.
		go func() {
			fileToWrite, err := os.Create(fmt.Sprintf("downloads/%s_%s.mp4", time.Unix(0, recording.UtcCreatedDate*int64(time.Millisecond)).Format(("2006-01-02_15.04.05")), recording.UniqueId))
            defer fileToWrite.Close()

            if err != nil {
                log.Fatal(err)
            }

			// The videos produced by Arlo are pretty small, even in their longest, best quality settings.
			// DownloadFile() efficiently streams the file from the http.Response.Body directly to a file.
			if err := arlo.DownloadFile(recording.PresignedContentUrl, fileToWrite); err != nil {
				log.Println(err)
			} else {
				log.Printf("Downloaded video %s from %s", recording.CreatedDate, recording.PresignedContentUrl)
			}

			// Mark this go routine as done in the wait group.
			wg.Done()
		}()
	}

	// Wait here until all of the go routines are done.
	wg.Wait()


    // The below example demonstrates how you could delete the cloud recordings after downloading them.
    // Simply uncomment the below code to start using it.

    // Delete all of the videos you just downloaded from the Arlo library.
	// Notice that you can pass the "library" object we got back from the GetLibrary() call.
	/* if err := arlo.BatchDeleteRecordings(library); err != nil {
		log.Println(err)
		return
	} */

	// If we made it here without an exception, then the videos were successfully deleted.
	/* log.Println("Batch deletion of videos completed successfully.") */
}

** (coming soon) For more code examples check out the wiki**